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