1284567Sgjb/* $NetBSD: mount_filecore.c,v 1.21 2020/07/26 08:20:22 mlelstv Exp $ */
2284567Sgjb
3284567Sgjb/*
4284567Sgjb * Copyright (c) 1992, 1993, 1994 The Regents of the University of California.
5284567Sgjb * All rights reserved.
6284567Sgjb *
7284567Sgjb * This code is contains code contributed to the NetBSD project by
8284567Sgjb * Christopher G. Demetriou
9284567Sgjb *
10284567Sgjb * Redistribution and use in source and binary forms, with or without
11284567Sgjb * modification, are permitted provided that the following conditions
12284567Sgjb * are met:
13284567Sgjb * 1. Redistributions of source code must retain the above copyright
14284567Sgjb *    notice, this list of conditions and the following disclaimer.
15284567Sgjb * 2. Redistributions in binary form must reproduce the above copyright
16284567Sgjb *    notice, this list of conditions and the following disclaimer in the
17284567Sgjb *    documentation and/or other materials provided with the distribution.
18284567Sgjb * 3. Neither the name of the University nor the names of its contributors
19284813Sgjb *    may be used to endorse or promote products derived from this software
20285049Sgjb *    without specific prior written permission.
21284567Sgjb *
22284567Sgjb * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23284567Sgjb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24284567Sgjb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25284567Sgjb * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26284567Sgjb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27284567Sgjb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28284567Sgjb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29284567Sgjb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30284567Sgjb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31284567Sgjb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32284567Sgjb * SUCH DAMAGE.
33284567Sgjb *
34284567Sgjb *      mount_filecore.c	1.1	1998/6/26
35284567Sgjb */
36284567Sgjb
37284567Sgjb/*
38284567Sgjb * Copyright (c) 1998 Andrew McMurry
39284567Sgjb *
40284567Sgjb * This code is contains code contributed to the NetBSD project by
41284567Sgjb * Christopher G. Demetriou
42284567Sgjb *
43284567Sgjb * Redistribution and use in source and binary forms, with or without
44284567Sgjb * modification, are permitted provided that the following conditions
45284567Sgjb * are met:
46284567Sgjb * 1. Redistributions of source code must retain the above copyright
47284567Sgjb *    notice, this list of conditions and the following disclaimer.
48284567Sgjb * 2. Redistributions in binary form must reproduce the above copyright
49284567Sgjb *    notice, this list of conditions and the following disclaimer in the
50284567Sgjb *    documentation and/or other materials provided with the distribution.
51284567Sgjb * 3. All advertising materials mentioning features or use of this software
52284567Sgjb *    must display the following acknowledgement:
53284567Sgjb *	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	pathadj(argv[0], canon_dev);
169	dev = canon_dev;
170
171	pathadj(argv[0], canon_dir);
172	dir = canon_dir;
173
174#define DEFAULT_ROOTUID	-2
175	/*
176	 * FILECORE filesystems are not writable.
177	 */
178	mntflags |= MNT_RDONLY;
179	if (useuid) args.flags |= FILECOREMNT_USEUID;
180	args.fspec = dev;
181	args.flags = opts;
182
183	if (mount(MOUNT_FILECORE, dir, mntflags, &args, sizeof args) == -1)
184		err(1, "%s on %s", dev, dir);
185	if (mntflags & MNT_GETARGS) {
186		char buf[1024];
187		(void)snprintb(buf, sizeof(buf), FILECOREMNT_BITS, args.flags);
188		printf("uid=%d, gid=%d, flags=%s\n", args.uid, args.gid, buf);
189	}
190	exit(0);
191}
192
193static void
194usage(void)
195{
196	(void)fprintf(stderr,
197		"usage: mount_filecore [-afnR] [-g gid] [-o options] [-u uid] special node\n");
198	exit(1);
199}
200