1 1.4 pho /* $NetBSD: refuse_lowlevel.c,v 1.4 2022/01/22 08:09:39 pho Exp $ */ 2 1.1 pho 3 1.1 pho /* 4 1.1 pho * Copyright (c) 2016 The NetBSD Foundation, Inc. 5 1.1 pho * All rights reserved. 6 1.1 pho * 7 1.1 pho * Redistribution and use in source and binary forms, with or without 8 1.1 pho * modification, are permitted provided that the following conditions 9 1.1 pho * are met: 10 1.1 pho * 1. Redistributions of source code must retain the above copyright 11 1.1 pho * notice, this list of conditions and the following disclaimer. 12 1.1 pho * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 pho * notice, this list of conditions and the following disclaimer in the 14 1.1 pho * documentation and/or other materials provided with the distribution. 15 1.1 pho * 3. The name of the author may not be used to endorse or promote 16 1.1 pho * products derived from this software without specific prior written 17 1.1 pho * permission. 18 1.1 pho * 19 1.1 pho * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 20 1.1 pho * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 1.1 pho * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 pho * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 23 1.1 pho * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 pho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 25 1.1 pho * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 1.1 pho * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 1.1 pho * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 1.1 pho * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 1.1 pho */ 31 1.1 pho 32 1.1 pho #include <sys/cdefs.h> 33 1.1 pho #if !defined(lint) 34 1.4 pho __RCSID("$NetBSD: refuse_lowlevel.c,v 1.4 2022/01/22 08:09:39 pho Exp $"); 35 1.1 pho #endif /* !lint */ 36 1.1 pho 37 1.2 pho #include <fuse_internal.h> 38 1.1 pho #include <fuse_opt.h> 39 1.1 pho #include <stddef.h> 40 1.1 pho #include <stdio.h> 41 1.1 pho #include <stdlib.h> 42 1.1 pho #include <string.h> 43 1.1 pho 44 1.1 pho #define REFUSE_LOWLEVEL_OPT(t, p, v) \ 45 1.1 pho { t, offsetof(struct fuse_cmdline_opts, p), v } 46 1.1 pho 47 1.1 pho static struct fuse_opt fuse_lowlevel_opts[] = { 48 1.3 pho REFUSE_LOWLEVEL_OPT("-h" , show_help , REFUSE_SHOW_HELP_FULL), 49 1.3 pho REFUSE_LOWLEVEL_OPT("--help" , show_help , REFUSE_SHOW_HELP_FULL), 50 1.3 pho REFUSE_LOWLEVEL_OPT("-ho" , show_help , REFUSE_SHOW_HELP_NO_HEADER), 51 1.1 pho REFUSE_LOWLEVEL_OPT("-V" , show_version , 1), 52 1.1 pho REFUSE_LOWLEVEL_OPT("--version", show_version , 1), 53 1.1 pho REFUSE_LOWLEVEL_OPT("-d" , debug , 1), 54 1.1 pho REFUSE_LOWLEVEL_OPT("debug" , debug , 1), 55 1.1 pho REFUSE_LOWLEVEL_OPT("-d" , foreground , 1), 56 1.1 pho REFUSE_LOWLEVEL_OPT("debug" , foreground , 1), 57 1.1 pho REFUSE_LOWLEVEL_OPT("-f" , foreground , 1), 58 1.1 pho REFUSE_LOWLEVEL_OPT("-s" , singlethread , 1), 59 1.1 pho REFUSE_LOWLEVEL_OPT("fsname=" , nodefault_fsname, 1), 60 1.1 pho FUSE_OPT_KEY ("fsname=" , FUSE_OPT_KEY_KEEP ), 61 1.1 pho FUSE_OPT_END 62 1.1 pho }; 63 1.1 pho 64 1.1 pho void fuse_lowlevel_version(void) 65 1.1 pho { 66 1.1 pho /* XXX: Print something */ 67 1.1 pho } 68 1.1 pho 69 1.1 pho void fuse_cmdline_help(void) 70 1.1 pho { 71 1.1 pho printf("refuse options:\n" 72 1.1 pho " -d, -o debug enable debug output, implies -f\n" 73 1.1 pho " -f foreground mode\n" 74 1.1 pho " -s single threaded mode (always enabled for now)\n" 75 1.1 pho " -o fsname=NAME explicitly set the name of the file system\n"); 76 1.1 pho } 77 1.1 pho 78 1.1 pho static int refuse_lowlevel_opt_proc(void* data, const char *arg, int key, 79 1.1 pho struct fuse_args *outargs) 80 1.1 pho { 81 1.1 pho struct fuse_cmdline_opts *opts = data; 82 1.1 pho 83 1.1 pho switch (key) { 84 1.1 pho case FUSE_OPT_KEY_NONOPT: 85 1.1 pho if (opts->mountpoint == NULL) { 86 1.1 pho return fuse_opt_add_opt(&opts->mountpoint, arg); 87 1.1 pho } 88 1.1 pho else { 89 1.1 pho (void)fprintf(stderr, "fuse: invalid argument: %s\n", arg); 90 1.1 pho return -1; 91 1.1 pho } 92 1.1 pho 93 1.1 pho default: 94 1.1 pho return 1; /* keep the argument */ 95 1.1 pho } 96 1.1 pho } 97 1.1 pho 98 1.1 pho static int add_default_fsname(struct fuse_args *args) 99 1.1 pho { 100 1.1 pho const char *arg0 = args->argv[0]; 101 1.1 pho const char *slash; 102 1.1 pho 103 1.1 pho if (arg0 == NULL || arg0[0] == '\0') { 104 1.1 pho return fuse_opt_add_arg(args, "-ofsname=refuse"); 105 1.1 pho } else { 106 1.1 pho char *arg; 107 1.1 pho int rv; 108 1.1 pho 109 1.1 pho if ((slash = strrchr(arg0, '/')) == NULL) { 110 1.1 pho slash = arg0; 111 1.1 pho } else { 112 1.1 pho slash += 1; 113 1.1 pho } 114 1.1 pho 115 1.1 pho if (asprintf(&arg, "-ofsname=refuse:%s", slash) == -1) 116 1.1 pho return -1; 117 1.1 pho 118 1.1 pho rv = fuse_opt_add_arg(args, arg); 119 1.1 pho free(arg); 120 1.1 pho return rv; 121 1.1 pho } 122 1.1 pho } 123 1.1 pho 124 1.4 pho int 125 1.4 pho __fuse_parse_cmdline(struct fuse_args *args, struct fuse_cmdline_opts *opts) 126 1.1 pho { 127 1.1 pho memset(opts, 0, sizeof(*opts)); 128 1.1 pho 129 1.1 pho /* 130 1.1 pho * XXX: The single threaded mode is always enabled and cannot be 131 1.1 pho * disabled. This is because puffs currently does not support 132 1.1 pho * multithreaded operation. 133 1.1 pho */ 134 1.1 pho opts->singlethread = 1; 135 1.1 pho 136 1.1 pho if (fuse_opt_parse(args, opts, fuse_lowlevel_opts, 137 1.1 pho refuse_lowlevel_opt_proc) == -1) 138 1.1 pho return -1; 139 1.1 pho 140 1.1 pho if (!opts->nodefault_fsname) { 141 1.1 pho /* -o fsname=%s is not specified so add a default fsname 142 1.1 pho * generated from the program basename. 143 1.1 pho */ 144 1.1 pho if (add_default_fsname(args) == -1) 145 1.1 pho return -1; 146 1.1 pho } 147 1.1 pho 148 1.1 pho return 0; 149 1.1 pho } 150