xref: /dflybsd-src/sbin/mount_autofs/mount_autofs.c (revision 7cb51127dd1d8da487c699c94e7216e58e9edd46)
1e0c81dfeSTomohiro Kusumi /*-
2e0c81dfeSTomohiro Kusumi  * Copyright (c) 2018 The NetBSD Foundation, Inc.
3e0c81dfeSTomohiro Kusumi  * All rights reserved.
4e0c81dfeSTomohiro Kusumi  *
5e0c81dfeSTomohiro Kusumi  * This code is derived from software contributed to The NetBSD Foundation
6e0c81dfeSTomohiro Kusumi  * by Christos Zoulas.
7e0c81dfeSTomohiro Kusumi  *
8e0c81dfeSTomohiro Kusumi  * Redistribution and use in source and binary forms, with or without
9e0c81dfeSTomohiro Kusumi  * modification, are permitted provided that the following conditions
10e0c81dfeSTomohiro Kusumi  * are met:
11e0c81dfeSTomohiro Kusumi  * 1. Redistributions of source code must retain the above copyright
12e0c81dfeSTomohiro Kusumi  *    notice, this list of conditions and the following disclaimer.
13e0c81dfeSTomohiro Kusumi  * 2. Redistributions in binary form must reproduce the above copyright
14e0c81dfeSTomohiro Kusumi  *    notice, this list of conditions and the following disclaimer in the
15e0c81dfeSTomohiro Kusumi  *    documentation and/or other materials provided with the distribution.
16e0c81dfeSTomohiro Kusumi  *
17e0c81dfeSTomohiro Kusumi  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18e0c81dfeSTomohiro Kusumi  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19e0c81dfeSTomohiro Kusumi  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20e0c81dfeSTomohiro Kusumi  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21e0c81dfeSTomohiro Kusumi  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22e0c81dfeSTomohiro Kusumi  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23e0c81dfeSTomohiro Kusumi  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24e0c81dfeSTomohiro Kusumi  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25e0c81dfeSTomohiro Kusumi  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26e0c81dfeSTomohiro Kusumi  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27e0c81dfeSTomohiro Kusumi  * POSSIBILITY OF SUCH DAMAGE.
28e0c81dfeSTomohiro Kusumi  */
29e0c81dfeSTomohiro Kusumi 
30e0c81dfeSTomohiro Kusumi #include <sys/param.h>
31e0c81dfeSTomohiro Kusumi #include <sys/mount.h>
32*7cb51127STomohiro Kusumi #include <sys/cdefs.h>
33e0c81dfeSTomohiro Kusumi 
34e0c81dfeSTomohiro Kusumi #include <err.h>
35e0c81dfeSTomohiro Kusumi #include <mntopts.h>
36e0c81dfeSTomohiro Kusumi #include <stdio.h>
37e0c81dfeSTomohiro Kusumi #include <stdlib.h>
38e0c81dfeSTomohiro Kusumi #include <string.h>
39e0c81dfeSTomohiro Kusumi #include <sysexits.h>
40e0c81dfeSTomohiro Kusumi #include <unistd.h>
41e0c81dfeSTomohiro Kusumi 
42c4189c6cSTomohiro Kusumi #include <vfs/autofs/autofs_mount.h>
43e0c81dfeSTomohiro Kusumi 
44e0c81dfeSTomohiro Kusumi #include "mount_autofs.h"
45e0c81dfeSTomohiro Kusumi 
46e0c81dfeSTomohiro Kusumi static const struct mntopt mopts[] = {
47e0c81dfeSTomohiro Kusumi 	MOPT_STDOPTS,
48e0c81dfeSTomohiro Kusumi 	MOPT_NULL,
49e0c81dfeSTomohiro Kusumi };
50e0c81dfeSTomohiro Kusumi 
51e0c81dfeSTomohiro Kusumi static void	usage(void) __dead2;
52e0c81dfeSTomohiro Kusumi 
53e0c81dfeSTomohiro Kusumi int
main(int argc,char ** argv)54e0c81dfeSTomohiro Kusumi main(int argc, char **argv)
55e0c81dfeSTomohiro Kusumi {
56e0c81dfeSTomohiro Kusumi 	return mount_autofs(argc, argv);
57e0c81dfeSTomohiro Kusumi }
58e0c81dfeSTomohiro Kusumi 
59e0c81dfeSTomohiro Kusumi void
mount_autofs_parseargs(int argc,char * argv[],void * v,int * mntflags,char * canon_dev,char * canon_dir)60e0c81dfeSTomohiro Kusumi mount_autofs_parseargs(int argc, char *argv[], void *v, int *mntflags,
61e0c81dfeSTomohiro Kusumi 	char *canon_dev, char *canon_dir)
62e0c81dfeSTomohiro Kusumi {
63e0c81dfeSTomohiro Kusumi 	int ch;
64e0c81dfeSTomohiro Kusumi 	struct autofs_mount_info *am = v;
65e0c81dfeSTomohiro Kusumi 
66e0c81dfeSTomohiro Kusumi 	*mntflags = 0;
67e0c81dfeSTomohiro Kusumi 	while ((ch = getopt(argc, argv, "f:o:O:p:")) != -1)
68e0c81dfeSTomohiro Kusumi 		switch (ch) {
69e0c81dfeSTomohiro Kusumi 		case 'f':
70*7cb51127STomohiro Kusumi 			strlcpy(__DECONST(char*, am->from), optarg, MAXPATHLEN);
71e0c81dfeSTomohiro Kusumi 			break;
72e0c81dfeSTomohiro Kusumi 		case 'o':
73e0c81dfeSTomohiro Kusumi 			getmntopts(optarg, mopts, mntflags, 0);
74e0c81dfeSTomohiro Kusumi 			break;
75e0c81dfeSTomohiro Kusumi 		case 'O':
76*7cb51127STomohiro Kusumi 			strlcpy(__DECONST(char*, am->master_options), optarg,
77e0c81dfeSTomohiro Kusumi 			    MAXPATHLEN);
78e0c81dfeSTomohiro Kusumi 			break;
79e0c81dfeSTomohiro Kusumi 		case 'p':
80*7cb51127STomohiro Kusumi 			strlcpy(__DECONST(char*, am->master_prefix), optarg,
81e0c81dfeSTomohiro Kusumi 			    MAXPATHLEN);
82e0c81dfeSTomohiro Kusumi 			break;
83e0c81dfeSTomohiro Kusumi 		case '?':
84e0c81dfeSTomohiro Kusumi 		default:
85e0c81dfeSTomohiro Kusumi 			usage();
86e0c81dfeSTomohiro Kusumi 		}
87e0c81dfeSTomohiro Kusumi 	argc -= optind;
88e0c81dfeSTomohiro Kusumi 	argv += optind;
89e0c81dfeSTomohiro Kusumi 
90e0c81dfeSTomohiro Kusumi 	if (argc != 2)
91e0c81dfeSTomohiro Kusumi 		usage();
92e0c81dfeSTomohiro Kusumi 
93e0c81dfeSTomohiro Kusumi 	strlcpy(canon_dev, argv[0], MAXPATHLEN);
94e0c81dfeSTomohiro Kusumi 	if (realpath(argv[1], canon_dir) == NULL)    /* Check mounton path */
95e0c81dfeSTomohiro Kusumi 		err(EXIT_FAILURE, "realpath %s", canon_dir);
96e0c81dfeSTomohiro Kusumi 	if (strncmp(argv[1], canon_dir, MAXPATHLEN)) {
97e0c81dfeSTomohiro Kusumi 		warnx("\"%s\" is a relative path.", argv[1]);
98e0c81dfeSTomohiro Kusumi 		warnx("using \"%s\" instead.", canon_dir);
99e0c81dfeSTomohiro Kusumi 	}
100e0c81dfeSTomohiro Kusumi }
101e0c81dfeSTomohiro Kusumi 
102e0c81dfeSTomohiro Kusumi int
mount_autofs(int argc,char * argv[])103e0c81dfeSTomohiro Kusumi mount_autofs(int argc, char *argv[])
104e0c81dfeSTomohiro Kusumi {
105e0c81dfeSTomohiro Kusumi 	char canon_dev[MAXPATHLEN], canon_dir[MAXPATHLEN];
106e0c81dfeSTomohiro Kusumi 	char from[MAXPATHLEN], master_options[MAXPATHLEN];
107e0c81dfeSTomohiro Kusumi 	char master_prefix[MAXPATHLEN];
108e0c81dfeSTomohiro Kusumi 	int mntflags, error;
109e0c81dfeSTomohiro Kusumi 	struct vfsconf vfc;
110e0c81dfeSTomohiro Kusumi 	struct autofs_mount_info am = {
111e0c81dfeSTomohiro Kusumi 		.from = from,
112e0c81dfeSTomohiro Kusumi 		.master_options = master_options,
113e0c81dfeSTomohiro Kusumi 		.master_prefix = master_prefix,
114e0c81dfeSTomohiro Kusumi 	};
115e0c81dfeSTomohiro Kusumi 
116e0c81dfeSTomohiro Kusumi 	mount_autofs_parseargs(argc, argv, &am, &mntflags,
117e0c81dfeSTomohiro Kusumi 	    canon_dev, canon_dir);
118e0c81dfeSTomohiro Kusumi 
119e0c81dfeSTomohiro Kusumi 	error = getvfsbyname("autofs", &vfc);
120e0c81dfeSTomohiro Kusumi 	if (error && vfsisloadable("autofs")) {
121e0c81dfeSTomohiro Kusumi 		if(vfsload("autofs"))
122e0c81dfeSTomohiro Kusumi 			err(EX_OSERR, "vfsload(%s)", "autofs");
123e0c81dfeSTomohiro Kusumi 		endvfsent();
124e0c81dfeSTomohiro Kusumi 		error = getvfsbyname("autofs", &vfc);
125e0c81dfeSTomohiro Kusumi 	}
126e0c81dfeSTomohiro Kusumi 	if (error)
127e0c81dfeSTomohiro Kusumi 		errx(EX_OSERR, "%s filesystem not available", "autofs");
128e0c81dfeSTomohiro Kusumi 
129e0c81dfeSTomohiro Kusumi 	if (mount(vfc.vfc_name, canon_dir, mntflags, &am) == -1)
130e0c81dfeSTomohiro Kusumi 		err(EXIT_FAILURE, "autofs on %s", canon_dir);
131e0c81dfeSTomohiro Kusumi 
132e0c81dfeSTomohiro Kusumi 	return EXIT_SUCCESS;
133e0c81dfeSTomohiro Kusumi }
134e0c81dfeSTomohiro Kusumi 
135e0c81dfeSTomohiro Kusumi static void
usage(void)136e0c81dfeSTomohiro Kusumi usage(void)
137e0c81dfeSTomohiro Kusumi {
138e0c81dfeSTomohiro Kusumi 	(void)fprintf(stderr,
139e0c81dfeSTomohiro Kusumi 	    "Usage: %s [-o options] [-O master_options] [-p master_prefix] "
140e0c81dfeSTomohiro Kusumi 		"[-f <from>] autofs mount_point\n", getprogname());
141e0c81dfeSTomohiro Kusumi 	exit(EXIT_FAILURE);
142e0c81dfeSTomohiro Kusumi }
143