[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Changes to libfuse/main.c
From: |
Stefan Siegl |
Subject: |
Changes to libfuse/main.c |
Date: |
Sat, 03 Dec 2005 18:16:17 -0500 |
Index: libfuse/main.c
diff -u libfuse/main.c:1.11 libfuse/main.c:1.12
--- libfuse/main.c:1.11 Sat Dec 3 19:16:49 2005
+++ libfuse/main.c Sat Dec 3 23:16:17 2005
@@ -42,11 +42,112 @@
#define FUSE_MAGIC ((int) 0x66757365)
+
+/* Interpret a __single__ mount option
+ * The option itself `opt' may be modified during this call.
+ */
+static int
+fuse_parse_opt(char *opt)
+{
+ char *ptrptr;
+ char *option = strtok_r(opt, "=", &ptrptr);
+ char *value = strtok_r(NULL, "=", &ptrptr);
+
+ DEBUG("parse_opt", "option `%s' => `%s'\n", option, value);
+
+ if(! strcmp(option, "use_ino"))
+ libfuse_params.use_ino = 1;
+
+ else if(! strcmp(option, "allow_other"))
+ libfuse_params.allow_other = 1;
+
+ else if(! strcmp(option, "allow_root"))
+ libfuse_params.allow_root = 1;
+
+ else if(! strcmp(option, "uid"))
+ {
+ char *endptr;
+ if(! value || (libfuse_params.uid = strtol(value, &endptr, 10),
+ endptr == value))
+ {
+ fprintf(stderr, PACKAGE_NAME ": missing or invalid argument to "
+ "mount option '%s': %s\n", option, value);
+ return EINVAL;
+ }
+
+ libfuse_params.force_uid = 1;
+ }
+
+ else if(! strcmp(option, "gid"))
+ {
+ char *endptr;
+ if(! value || (libfuse_params.gid = strtol(value, &endptr, 10),
+ endptr == value))
+ {
+ fprintf(stderr, PACKAGE_NAME ": missing or invalid argument to "
+ "mount option '%s': %s\n", option, value);
+ return EINVAL;
+ }
+
+ libfuse_params.force_gid = 1;
+ }
+
+ else if(! strcmp(option, "umask"))
+ {
+ char *endptr;
+ if(! value || (libfuse_params.umask = strtol(value, &endptr, 8),
+ endptr == value))
+ {
+ fprintf(stderr, PACKAGE_NAME ": missing or invalid argument to "
+ "mount option '%s': %s\n", option, value);
+ return EINVAL;
+ }
+
+ libfuse_params.force_umask = 1;
+ }
+
+ else
+ {
+ fprintf(stderr, PACKAGE_NAME ": unsupported mount option: %s\n", option);
+ return EINVAL;
+ }
+
+ return 0;
+}
+
+/* Parse a single (or a comma-separated list) of mount options
+ * (those that are specified using `-o' on the command line for example)
+ */
+static int
+fuse_parse_opts(const char *opts)
+{
+ if(! opts) return 0; /* ... why did'ya call us? */
+
+ char *copy = strdup(opts); /* copy string to allow strtok calls */
+ if(! copy) return ENOMEM;
+
+ char *ptrptr, *token, *tok_me = copy;
+ while((token = strtok_r(tok_me, ",", &ptrptr)))
+ {
+ tok_me = NULL;
+ if(fuse_parse_opt(token))
+ {
+ free(copy);
+ return EINVAL;
+ }
+ }
+
+ free(copy);
+ return 0;
+}
+
+
+
/* Parse the command line arguments given to fuse_main (or _compat function).
* If --help specified, output help string and call exit. If there are any
* options that shall be passed to the file system itself, return them.
*/
-static const char *
+static void
fuse_parse_argv(int argc, char *argv[])
{
const char *translat_path = argv[0];
@@ -55,7 +156,7 @@
int opt;
FILE *opt_help = NULL;
- while((opt = getopt(argc, argv, "d::hs")) >= 0)
+ while((opt = getopt(argc, argv, "d::o:hs")) >= 0)
switch(opt)
{
case 'd':
@@ -68,6 +169,12 @@
fprintf(debug_port, "translator %s starting up.\n", translat_path);
break;
+ case 'o':
+ assert(optarg);
+ if(fuse_parse_opts(optarg))
+ exit(1);
+ break;
+
case 'h':
opt_help = stdout;
break;
@@ -89,13 +196,12 @@
"Options:\n"
" -d[FILENAME] enable debug output (default=stderr)\n"
" -s disable multi-threaded operation\n"
+ " -o opt,[opt...] mount options\n"
" -h print help\n"
"\n", translat_path);
exit(opt_help == stdout ? 0 : 1);
}
-
- return 0;
}
@@ -105,10 +211,11 @@
fuse_main_compat2(int argc, char *argv[],
const struct fuse_operations_compat2 *op)
{
- const char *fs_opts = fuse_parse_argv(argc, argv);
+ fuse_parse_argv(argc, argv);
+
int fd = fuse_mount(NULL, NULL);
return (libfuse_params.disable_mt ? fuse_loop : fuse_loop_mt)
- (fuse_new_compat2(fd, fs_opts, op));
+ (fuse_new_compat2(fd, NULL, op));
}
@@ -119,10 +226,11 @@
fuse_main_real(int argc, char *argv[],
const struct fuse_operations *op, size_t op_size)
{
- const char *fs_opts = fuse_parse_argv(argc, argv);
+ fuse_parse_argv(argc, argv);
+
int fd = fuse_mount(NULL, NULL);
return (libfuse_params.disable_mt ? fuse_loop : fuse_loop_mt)
- (fuse_new(fd, fs_opts, op, op_size));
+ (fuse_new(fd, NULL, op, op_size));
}
@@ -139,8 +247,8 @@
if(fd != FUSE_MAGIC)
return NULL;
- if(opts)
- fprintf(stderr, PACKAGE ": yet unable to parse options: %s\n", opts);
+ if(fuse_parse_opts(opts))
+ return NULL;
fuse_ops_compat = op;
@@ -154,7 +262,7 @@
*/
struct fuse *
fuse_new(int fd, const char *opts,
- const struct fuse_operations *op, size_t op_size)
+ const struct fuse_operations *op, size_t op_size)
{
(void) op_size; /* FIXME, see what the real Fuse library does with
* this argument */
@@ -162,8 +270,8 @@
if(fd != FUSE_MAGIC)
return NULL;
- if(opts)
- fprintf(stderr, PACKAGE ": yet unable to parse options: %s\n", opts);
+ if(fuse_parse_opts(opts))
+ return NULL;
fuse_ops = op;
@@ -181,8 +289,8 @@
(void) mountpoint; /* we don't care for the specified mountpoint, as
* we need to be set up using settrans ... */
- if(opts)
- fprintf(stderr, PACKAGE ": yet unable to parse options: %s\n", opts);
+ if(fuse_parse_opts(opts))
+ return 0;
mach_port_t bootstrap, ul_node;