mount_efs.c revision 1.1 1 /* $NetBSD: mount_efs.c,v 1.1 2007/06/29 23:30:20 rumble Exp $ */
2
3 /*
4 * Copyright (c) 2006 Stephen M. Rumble <rumble (at) ephemeral.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <sys/param.h>
20 #include <sys/mount.h>
21 #include <fs/efs/efs.h>
22 #include <fs/efs/efs_sb.h>
23 #include <fs/efs/efs_mount.h>
24
25 #include <err.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28
29 #include <string.h>
30 #include <unistd.h>
31
32 #include <mntopts.h>
33
34 static const struct mntopt mopts[] = {
35 MOPT_STDOPTS,
36 MOPT_GETARGS,
37 MOPT_FORCE,
38 MOPT_NULL
39 };
40
41 static void usage(void);
42 int mount_efs(int, char **);
43
44 static void
45 usage()
46 {
47
48 fprintf(stderr, "usage: %s [-o options] special node\n", getprogname());
49 exit(1);
50 }
51
52 int
53 mount_efs(int argc, char **argv)
54 {
55 int ch, mntflags;
56 extern int optind;
57 extern char *optarg;
58 struct efs_args args;
59 char special[MAXPATHLEN], node[MAXPATHLEN];
60 mntoptparse_t mp;
61
62 setprogname(argv[0]);
63 memset(&args, 0, sizeof(args));
64 mntflags = 0;
65
66 while ((ch = getopt(argc, argv, "o:")) != -1) {
67 switch (ch) {
68 case 'o':
69 mp = getmntopts(optarg, mopts, &mntflags, NULL);
70 if (mp == NULL)
71 err(1, "getmntopts");
72 freemntopts(mp);
73 break;
74
75 default:
76 usage();
77 }
78 }
79 argc -= optind;
80 argv += optind;
81
82 if (argc != 2)
83 usage();
84
85 if (realpath(argv[0], special) == NULL)
86 err(EXIT_FAILURE, "realpath %s", argv[0]);
87
88 if (realpath(argv[1], node) == NULL)
89 err(EXIT_FAILURE, "realpath %s", argv[1]);
90
91 args.fspec = special;
92 args.version = EFS_MNT_VERSION;
93 if (mount(MOUNT_EFS, node, mntflags, &args) < 0)
94 err(EXIT_FAILURE, "%s on %s", special, node);
95
96 return (0);
97 }
98
99 #ifndef MOUNT_NOMAIN
100 int
101 main(int argc, char **argv)
102 {
103
104 return (mount_efs(argc, argv));
105 }
106 #endif
107