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