mount_filecore.c revision 1.2.6.1 1 /* $NetBSD: mount_filecore.c,v 1.2.6.1 2000/06/22 16:05:36 minoura Exp $ */
2
3 /*
4 * Copyright (c) 1998 Andrew McMurry
5 * Copyright (c) 1992, 1993, 1994 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is contains code contributed to the NetBSD project by
9 * Christopher G. Demetriou
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the University of
22 * California, Berkeley and its contributors.
23 * 4. Neither the name of the University nor the names of its contributors
24 * may be used to endorse or promote products derived from this software
25 * without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 *
39 * mount_filecore.c 1.1 1998/6/26
40 */
41
42 #include <sys/cdefs.h>
43 #ifndef lint
44 __COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\
45 The Regents of the University of California.\n\
46 Copyright (c) 1998 Andrew McMurry\n\
47 All rights reserved.\n");
48 #endif /* not lint */
49
50 #include <sys/param.h>
51 #include <sys/mount.h>
52
53 #include <ctype.h>
54 #include <err.h>
55 #include <grp.h>
56 #include <pwd.h>
57 #include <stdlib.h>
58 #include <stdio.h>
59 #include <string.h>
60 #include <unistd.h>
61
62 #include <filecorefs/filecore_mount.h>
63
64 #include "mntopts.h"
65
66 const struct mntopt mopts[] = {
67 MOPT_STDOPTS,
68 MOPT_UPDATE,
69 { NULL }
70 };
71
72 int main __P((int, char *[]));
73 void usage __P((void));
74 gid_t a_gid __P((char *));
75 uid_t a_uid __P((char *));
76
77 int
78 main(argc, argv)
79 int argc;
80 char **argv;
81 {
82 struct filecore_args args;
83 int ch, mntflags, opts, useuid;
84 char *dev, *dir;
85
86 mntflags = opts = 0;
87 useuid = 1;
88 args.uid = 0;
89 args.gid = 0;
90
91 while ((ch = getopt(argc, argv, "anRfu:g:o:")) != -1)
92 switch (ch) {
93 case 'a':
94 args.flags |= FILECOREMNT_ALLACCESS;
95 break;
96 case 'n':
97 args.flags |= FILECOREMNT_OWNACCESS;
98 break;
99 case 'R':
100 args.flags |= FILECOREMNT_OWNREAD;
101 break;
102 case 'f':
103 args.flags |= FILECOREMNT_FILETYPE;
104 break;
105 case 'u':
106 args.uid = a_uid(optarg);
107 useuid = 0;
108 break;
109 case 'g':
110 args.gid = a_gid(optarg);
111 useuid = 0;
112 break;
113 case 'o':
114 getmntopts(optarg, mopts, &mntflags, 0);
115 break;
116 case '?':
117 default:
118 usage();
119 }
120 argc -= optind;
121 argv += optind;
122
123 if (argc != 2)
124 usage();
125
126 dev = argv[0];
127 dir = argv[1];
128
129 #define DEFAULT_ROOTUID -2
130 /*
131 * FILECORE filesystems are not writeable.
132 */
133 mntflags |= MNT_RDONLY;
134 if (useuid) args.flags |= FILECOREMNT_USEUID;
135 args.export.ex_flags = MNT_EXRDONLY;
136 args.fspec = dev;
137 args.export.ex_root = DEFAULT_ROOTUID;
138 args.flags = opts;
139
140 if (mount(MOUNT_FILECORE, dir, mntflags, &args) < 0)
141 err(1, "%s on %s", dev, dir);
142 exit(0);
143 }
144
145 void
146 usage()
147 {
148 (void)fprintf(stderr,
149 "usage: mount_filecore [-o options] special node\n");
150 exit(1);
151 }
152
153 gid_t
154 a_gid(s)
155 char *s;
156 {
157 struct group *gr;
158 char *gname;
159 gid_t gid;
160
161 if ((gr = getgrnam(s)) != NULL)
162 gid = gr->gr_gid;
163 else {
164 for (gname = s; *s && isdigit(*s); ++s);
165 if (!*s)
166 gid = atoi(gname);
167 else
168 errx(1, "unknown group id: %s", gname);
169 }
170 return (gid);
171 }
172
173 uid_t
174 a_uid(s)
175 char *s;
176 {
177 struct passwd *pw;
178 char *uname;
179 uid_t uid;
180
181 if ((pw = getpwnam(s)) != NULL)
182 uid = pw->pw_uid;
183 else {
184 for (uname = s; *s && isdigit(*s); ++s);
185 if (!*s)
186 uid = atoi(uname);
187 else
188 errx(1, "unknown user id: %s", uname);
189 }
190 return (uid);
191 }
192