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