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