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