1/* $NetBSD: mount_filecore.c,v 1.19 2008/08/05 20:57:45 pooka 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.\ 78 Copyright (c) 1998 Andrew McMurry. All rights reserved."); 79#endif /* not lint */ 80 81#include <sys/param.h> 82#include <sys/mount.h> 83 84#include <err.h> 85#include <grp.h> 86#include <pwd.h> 87#include <stdlib.h> 88#include <stdio.h> 89#include <string.h> 90#include <unistd.h> 91#include <util.h> 92 93#include <filecorefs/filecore_mount.h> 94 95#include <mntopts.h> 96 97#include "mountprog.h" 98 99static const struct mntopt mopts[] = { 100 MOPT_STDOPTS, 101 MOPT_UPDATE, 102 MOPT_GETARGS, 103 MOPT_NULL, 104}; 105 106int mount_filecore(int argc, char **argv); 107__dead static void usage(void); 108 109#ifndef MOUNT_NOMAIN 110int 111main(int argc, char **argv) 112{ 113 return mount_filecore(argc, argv); 114} 115#endif 116 117int 118mount_filecore(int argc, char **argv) 119{ 120 struct filecore_args args; 121 int ch, mntflags, opts, useuid; 122 char *dev, *dir, canon_dev[MAXPATHLEN], canon_dir[MAXPATHLEN]; 123 mntoptparse_t mp; 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 mp = getmntopts(optarg, mopts, &mntflags, 0); 154 if (mp == NULL) 155 err(1, "getmntopts"); 156 freemntopts(mp); 157 break; 158 case '?': 159 default: 160 usage(); 161 } 162 argc -= optind; 163 argv += optind; 164 165 if (argc != 2) 166 usage(); 167 168 dev = argv[0]; 169 dir = argv[1]; 170 171 if (realpath(dev, canon_dev) == NULL) /* Check device path */ 172 err(1, "realpath %s", dev); 173 if (strncmp(dev, canon_dev, MAXPATHLEN)) { 174 warnx("\"%s\" is a relative path.", dev); 175 dev = canon_dev; 176 warnx("using \"%s\" instead.", dev); 177 } 178 179 if (realpath(dir, canon_dir) == NULL) /* Check mounton path */ 180 err(1, "realpath %s", dir); 181 if (strncmp(dir, canon_dir, MAXPATHLEN)) { 182 warnx("\"%s\" is a relative path.", dir); 183 dir = canon_dir; 184 warnx("using \"%s\" instead.", dir); 185 } 186 187#define DEFAULT_ROOTUID -2 188 /* 189 * FILECORE filesystems are not writable. 190 */ 191 mntflags |= MNT_RDONLY; 192 if (useuid) args.flags |= FILECOREMNT_USEUID; 193 args.fspec = dev; 194 args.flags = opts; 195 196 if (mount(MOUNT_FILECORE, dir, mntflags, &args, sizeof args) == -1) 197 err(1, "%s on %s", dev, dir); 198 if (mntflags & MNT_GETARGS) { 199 char buf[1024]; 200 (void)snprintb(buf, sizeof(buf), FILECOREMNT_BITS, args.flags); 201 printf("uid=%d, gid=%d, flags=%s\n", args.uid, args.gid, buf); 202 } 203 exit(0); 204} 205 206static void 207usage(void) 208{ 209 (void)fprintf(stderr, 210 "usage: mount_filecore [-afnR] [-g gid] [-o options] [-u uid] special node\n"); 211 exit(1); 212} 213