xref: /illumos-gate/usr/src/cmd/fs.d/bootfs/mount.c (revision 76ca3cb0)
1*76ca3cb0SRobert Mustacchi /*
2*76ca3cb0SRobert Mustacchi  * CDDL HEADER START
3*76ca3cb0SRobert Mustacchi  *
4*76ca3cb0SRobert Mustacchi  * The contents of this file are subject to the terms of the
5*76ca3cb0SRobert Mustacchi  * Common Development and Distribution License (the "License").
6*76ca3cb0SRobert Mustacchi  * You may not use this file except in compliance with the License.
7*76ca3cb0SRobert Mustacchi  *
8*76ca3cb0SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*76ca3cb0SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10*76ca3cb0SRobert Mustacchi  * See the License for the specific language governing permissions
11*76ca3cb0SRobert Mustacchi  * and limitations under the License.
12*76ca3cb0SRobert Mustacchi  *
13*76ca3cb0SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14*76ca3cb0SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*76ca3cb0SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16*76ca3cb0SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17*76ca3cb0SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18*76ca3cb0SRobert Mustacchi  *
19*76ca3cb0SRobert Mustacchi  * CDDL HEADER END
20*76ca3cb0SRobert Mustacchi  */
21*76ca3cb0SRobert Mustacchi 
22*76ca3cb0SRobert Mustacchi /*
23*76ca3cb0SRobert Mustacchi  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*76ca3cb0SRobert Mustacchi  * Use is subject to license terms.
25*76ca3cb0SRobert Mustacchi  * Copyright (c) 2014 Joyent, Inc.  All rights reserved.
26*76ca3cb0SRobert Mustacchi  */
27*76ca3cb0SRobert Mustacchi 
28*76ca3cb0SRobert Mustacchi #include <stdio.h>
29*76ca3cb0SRobert Mustacchi #include <stdlib.h>
30*76ca3cb0SRobert Mustacchi #include <string.h>
31*76ca3cb0SRobert Mustacchi #include <libintl.h>
32*76ca3cb0SRobert Mustacchi #include <errno.h>
33*76ca3cb0SRobert Mustacchi #include <sys/fstyp.h>
34*76ca3cb0SRobert Mustacchi #include <sys/fsid.h>
35*76ca3cb0SRobert Mustacchi #include <sys/mntent.h>
36*76ca3cb0SRobert Mustacchi #include <sys/mnttab.h>
37*76ca3cb0SRobert Mustacchi #include <sys/mount.h>
38*76ca3cb0SRobert Mustacchi #include <sys/signal.h>
39*76ca3cb0SRobert Mustacchi #include <sys/stat.h>
40*76ca3cb0SRobert Mustacchi #include <fslib.h>
41*76ca3cb0SRobert Mustacchi 
42*76ca3cb0SRobert Mustacchi #define	MNTTYPE_BOOTFS "bootfs"
43*76ca3cb0SRobert Mustacchi 
44*76ca3cb0SRobert Mustacchi static char  optbuf[MAX_MNTOPT_STR] = { '\0', };
45*76ca3cb0SRobert Mustacchi static int   optsize = 0;
46*76ca3cb0SRobert Mustacchi 
47*76ca3cb0SRobert Mustacchi static void
usage(void)48*76ca3cb0SRobert Mustacchi usage(void)
49*76ca3cb0SRobert Mustacchi {
50*76ca3cb0SRobert Mustacchi 	(void) fprintf(stderr,
51*76ca3cb0SRobert Mustacchi 	    "Usage: mount [-Ormq] [-o options] special mountpoint\n");
52*76ca3cb0SRobert Mustacchi 	exit(2);
53*76ca3cb0SRobert Mustacchi }
54*76ca3cb0SRobert Mustacchi 
55*76ca3cb0SRobert Mustacchi /*
56*76ca3cb0SRobert Mustacchi  * usage: mount [-Ormq] [-o options] special mountp
57*76ca3cb0SRobert Mustacchi  *
58*76ca3cb0SRobert Mustacchi  * This mount program is exec'ed by /usr/sbin/mount if '-F bootfs' is
59*76ca3cb0SRobert Mustacchi  * specified.
60*76ca3cb0SRobert Mustacchi  */
61*76ca3cb0SRobert Mustacchi int
main(int argc,char * argv[])62*76ca3cb0SRobert Mustacchi main(int argc, char *argv[])
63*76ca3cb0SRobert Mustacchi {
64*76ca3cb0SRobert Mustacchi 	int c;
65*76ca3cb0SRobert Mustacchi 	char *special;		/* Entity being mounted */
66*76ca3cb0SRobert Mustacchi 	char *mountp;		/* Entity being mounted on */
67*76ca3cb0SRobert Mustacchi 	char *savedoptbuf;
68*76ca3cb0SRobert Mustacchi 	char *myname;
69*76ca3cb0SRobert Mustacchi 	char typename[64];
70*76ca3cb0SRobert Mustacchi 	int flags = 0;
71*76ca3cb0SRobert Mustacchi 	int errflag = 0;
72*76ca3cb0SRobert Mustacchi 	int qflg = 0;
73*76ca3cb0SRobert Mustacchi 
74*76ca3cb0SRobert Mustacchi 	myname = strrchr(argv[0], '/');
75*76ca3cb0SRobert Mustacchi 	myname = myname ? myname+1 : argv[0];
76*76ca3cb0SRobert Mustacchi 	(void) snprintf(typename, sizeof (typename), "%s %s", MNTTYPE_BOOTFS,
77*76ca3cb0SRobert Mustacchi 	    myname);
78*76ca3cb0SRobert Mustacchi 	argv[0] = typename;
79*76ca3cb0SRobert Mustacchi 
80*76ca3cb0SRobert Mustacchi 	while ((c = getopt(argc, argv, "o:rmOq")) != EOF) {
81*76ca3cb0SRobert Mustacchi 		switch (c) {
82*76ca3cb0SRobert Mustacchi 		case '?':
83*76ca3cb0SRobert Mustacchi 			errflag++;
84*76ca3cb0SRobert Mustacchi 			break;
85*76ca3cb0SRobert Mustacchi 
86*76ca3cb0SRobert Mustacchi 		case 'o':
87*76ca3cb0SRobert Mustacchi 			if (strlcpy(optbuf, optarg, sizeof (optbuf)) >=
88*76ca3cb0SRobert Mustacchi 			    sizeof (optbuf)) {
89*76ca3cb0SRobert Mustacchi 				(void) fprintf(stderr,
90*76ca3cb0SRobert Mustacchi 				    gettext("%s: Invalid argument: %s\n"),
91*76ca3cb0SRobert Mustacchi 				    myname, optarg);
92*76ca3cb0SRobert Mustacchi 				return (2);
93*76ca3cb0SRobert Mustacchi 			}
94*76ca3cb0SRobert Mustacchi 			optsize = strlen(optbuf);
95*76ca3cb0SRobert Mustacchi 			break;
96*76ca3cb0SRobert Mustacchi 		case 'O':
97*76ca3cb0SRobert Mustacchi 			flags |= MS_OVERLAY;
98*76ca3cb0SRobert Mustacchi 			break;
99*76ca3cb0SRobert Mustacchi 		case 'r':
100*76ca3cb0SRobert Mustacchi 			flags |= MS_RDONLY;
101*76ca3cb0SRobert Mustacchi 			break;
102*76ca3cb0SRobert Mustacchi 
103*76ca3cb0SRobert Mustacchi 		case 'm':
104*76ca3cb0SRobert Mustacchi 			flags |= MS_NOMNTTAB;
105*76ca3cb0SRobert Mustacchi 			break;
106*76ca3cb0SRobert Mustacchi 
107*76ca3cb0SRobert Mustacchi 		case 'q':
108*76ca3cb0SRobert Mustacchi 			qflg = 1;
109*76ca3cb0SRobert Mustacchi 			break;
110*76ca3cb0SRobert Mustacchi 
111*76ca3cb0SRobert Mustacchi 		default:
112*76ca3cb0SRobert Mustacchi 			usage();
113*76ca3cb0SRobert Mustacchi 		}
114*76ca3cb0SRobert Mustacchi 	}
115*76ca3cb0SRobert Mustacchi 	if ((argc - optind != 2) || errflag) {
116*76ca3cb0SRobert Mustacchi 		usage();
117*76ca3cb0SRobert Mustacchi 	}
118*76ca3cb0SRobert Mustacchi 	special = argv[argc - 2];
119*76ca3cb0SRobert Mustacchi 	mountp = argv[argc - 1];
120*76ca3cb0SRobert Mustacchi 
121*76ca3cb0SRobert Mustacchi 	if ((savedoptbuf = strdup(optbuf)) == NULL) {
122*76ca3cb0SRobert Mustacchi 		(void) fprintf(stderr, gettext("%s: out of memory\n"),
123*76ca3cb0SRobert Mustacchi 		    myname);
124*76ca3cb0SRobert Mustacchi 		exit(2);
125*76ca3cb0SRobert Mustacchi 	}
126*76ca3cb0SRobert Mustacchi 
127*76ca3cb0SRobert Mustacchi 	if (mount(special, mountp, flags | MS_OPTIONSTR, MNTTYPE_BOOTFS, NULL,
128*76ca3cb0SRobert Mustacchi 	    0, optbuf, MAX_MNTOPT_STR)) {
129*76ca3cb0SRobert Mustacchi 		(void) fprintf(stderr, "mount: ");
130*76ca3cb0SRobert Mustacchi 		perror(special);
131*76ca3cb0SRobert Mustacchi 		exit(2);
132*76ca3cb0SRobert Mustacchi 	}
133*76ca3cb0SRobert Mustacchi 	if (optsize && !qflg) {
134*76ca3cb0SRobert Mustacchi 		cmp_requested_to_actual_options(savedoptbuf, optbuf,
135*76ca3cb0SRobert Mustacchi 		    special, mountp);
136*76ca3cb0SRobert Mustacchi 	}
137*76ca3cb0SRobert Mustacchi 
138*76ca3cb0SRobert Mustacchi 	return (0);
139*76ca3cb0SRobert Mustacchi }
140