xref: /netbsd-src/sbin/mount_efs/mount_efs.c (revision 33b82b03392e2106db8728db8eea7f5301157325)
1*33b82b03Srillig /*	$NetBSD: mount_efs.c,v 1.6 2024/11/03 10:43:27 rillig Exp $	*/
26912898dSrumble 
36912898dSrumble /*
46912898dSrumble  * Copyright (c) 2006 Stephen M. Rumble <rumble@ephemeral.org>
56912898dSrumble  *
66912898dSrumble  * Permission to use, copy, modify, and distribute this software for any
76912898dSrumble  * purpose with or without fee is hereby granted, provided that the above
86912898dSrumble  * copyright notice and this permission notice appear in all copies.
96912898dSrumble  *
106912898dSrumble  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
116912898dSrumble  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
126912898dSrumble  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
136912898dSrumble  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
146912898dSrumble  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
156912898dSrumble  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
166912898dSrumble  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
176912898dSrumble  */
186912898dSrumble 
196912898dSrumble #include <sys/param.h>
206912898dSrumble #include <sys/mount.h>
216912898dSrumble #include <fs/efs/efs.h>
226912898dSrumble #include <fs/efs/efs_sb.h>
236912898dSrumble #include <fs/efs/efs_mount.h>
246912898dSrumble 
256912898dSrumble #include <err.h>
266912898dSrumble #include <stdio.h>
276912898dSrumble #include <stdlib.h>
286912898dSrumble 
296912898dSrumble #include <string.h>
306912898dSrumble #include <unistd.h>
316912898dSrumble 
326912898dSrumble #include <mntopts.h>
336912898dSrumble 
3499fed726Spooka #include "mountprog.h"
3599fed726Spooka #include "mount_efs.h"
3699fed726Spooka 
376912898dSrumble static const struct mntopt mopts[] = {
386912898dSrumble 	MOPT_STDOPTS,
396912898dSrumble 	MOPT_GETARGS,
406912898dSrumble 	MOPT_FORCE,
416912898dSrumble 	MOPT_NULL
426912898dSrumble };
436912898dSrumble 
44baa8e84bSjoerg __dead static void	usage(void);
456912898dSrumble 
466912898dSrumble static void
47baa8e84bSjoerg usage(void)
486912898dSrumble {
496912898dSrumble 
506912898dSrumble 	fprintf(stderr, "usage: %s [-o options] special node\n", getprogname());
516912898dSrumble 	exit(1);
526912898dSrumble }
536912898dSrumble 
5499fed726Spooka void
5599fed726Spooka mount_efs_parseargs(int argc, char **argv,
5699fed726Spooka 	struct efs_args *args, int *mntflags,
5799fed726Spooka 	char *canon_dev, char *canon_dir)
586912898dSrumble {
5999fed726Spooka 	int ch;
606912898dSrumble 	mntoptparse_t mp;
616912898dSrumble 
6299fed726Spooka 	memset(args, 0, sizeof(*args));
6399fed726Spooka 	*mntflags = 0;
646912898dSrumble 
656912898dSrumble 	while ((ch = getopt(argc, argv, "o:")) != -1) {
666912898dSrumble 		switch (ch) {
676912898dSrumble 		case 'o':
6899fed726Spooka 			mp = getmntopts(optarg, mopts, mntflags, NULL);
696912898dSrumble 			if (mp == NULL)
706912898dSrumble 				err(1, "getmntopts");
716912898dSrumble 			freemntopts(mp);
726912898dSrumble 			break;
736912898dSrumble 
746912898dSrumble 		default:
756912898dSrumble 			usage();
766912898dSrumble 		}
776912898dSrumble 	}
786912898dSrumble 	argc -= optind;
796912898dSrumble 	argv += optind;
806912898dSrumble 
816912898dSrumble 	if (argc != 2)
826912898dSrumble 		usage();
836912898dSrumble 
8499fed726Spooka 	pathadj(argv[0], canon_dev);
8599fed726Spooka 	pathadj(argv[1], canon_dir);
866912898dSrumble 
8799fed726Spooka 	args->fspec = canon_dev;
8899fed726Spooka 	args->version = EFS_MNT_VERSION;
8999fed726Spooka }
906912898dSrumble 
9199fed726Spooka int
9299fed726Spooka mount_efs(int argc, char **argv)
9399fed726Spooka {
9499fed726Spooka 	char special[MAXPATHLEN], node[MAXPATHLEN];
9599fed726Spooka 	struct efs_args args;
9699fed726Spooka 	int mntflags;
9799fed726Spooka 
9899fed726Spooka 	mount_efs_parseargs(argc, argv, &args, &mntflags, special, node);
9999fed726Spooka 
100704e0753Spooka 	if (mount(MOUNT_EFS, node, mntflags, &args, sizeof args) == -1)
1016912898dSrumble 		err(EXIT_FAILURE, "%s on %s", special, node);
1026912898dSrumble 
1036912898dSrumble 	return (0);
1046912898dSrumble }
1056912898dSrumble 
1066912898dSrumble #ifndef MOUNT_NOMAIN
1076912898dSrumble int
1086912898dSrumble main(int argc, char **argv)
1096912898dSrumble {
1106912898dSrumble 
11199fed726Spooka 	setprogname(argv[0]);
1126912898dSrumble 	return (mount_efs(argc, argv));
1136912898dSrumble }
1146912898dSrumble #endif
115