commit 88dc1f7a6862804e618af943dae47cbd6e46dc97 from: Sergey Bronnikov date: Thu Apr 15 12:55:47 2021 UTC Add parsing of custom options https://github.com/libfuse/libfuse/wiki/Option-Parsing Closes #60 Closes #12 Closes #7 Closes #1 commit - eab9c97a63b6f297f304a536b16b071100dad36e commit + 88dc1f7a6862804e618af943dae47cbd6e46dc97 blob - e035e63cf465225688df2394fb4293fdff55ba09 blob + f2974d3582352635bcb6cd837b2681c05b7eeea8 --- README.md +++ README.md @@ -22,7 +22,10 @@ $ cmake -DCMAKE_BUILD_TYPE=Debug .. && make -j ### Using ```sh -$ ./build/unreliablefs ~/Downloads/mnt/ -omodules=subdir,subdir=/tmp -$ ls ~/Downloads/mnt/ -$ umount /tmp/unreliable +$ mkdir /tmp/basedir +$ mkdir /tmp/fs +$ unreliablefs /tmp/fs -omodules=subdir,subdir=/tmp/basedir +$ cd /tmp/fs +$ ls -la +$ umount /tmp/fs ``` blob - 60f1815f4c68ff9a076e24952446501c69bc87b0 blob + 4ee74ff31d877fb2e11d07c17879a17b7b777d3b --- unreliablefs.c +++ unreliablefs.c @@ -1,5 +1,6 @@ #define FUSE_USE_VERSION 29 +#include #include #include #include @@ -62,30 +63,63 @@ static struct fuse_operations unreliable_ops = { #endif /* HAVE_UTIMENSAT */ }; -int main(int argc, char *argv[]) +struct unreliablefs_config { + int seed; + char *base_dir; +}; + +enum { + KEY_HELP, + KEY_VERSION, +}; + +#define UNRELIABLEFS_OPT(t, p, v) { t, offsetof(struct unreliablefs_config, p), v } +#define UNRELIABLEFS_VERSION "0.1" + +static struct fuse_opt unreliablefs_opts[] = { + UNRELIABLEFS_OPT("seed=%i", seed, 0), + UNRELIABLEFS_OPT("base_dir=%s", base_dir, 0), + + FUSE_OPT_KEY("-V", KEY_VERSION), + FUSE_OPT_KEY("--version", KEY_VERSION), + FUSE_OPT_KEY("-h", KEY_HELP), + FUSE_OPT_KEY("--help", KEY_HELP), + FUSE_OPT_END +}; + +static int unreliablefs_opt_proc(void *data, const char *arg, int key, struct fuse_args *outargs) { -#if defined(DEBUG) - int fuse_argc = 3; - char *fuse_argv[fuse_argc]; + switch (key) { + case KEY_HELP: + fprintf(stderr, + "\n" + "UnreliableFS options:\n" + " -o seed=NUM\n" + " -o base_dir=STRING\n\n"); + fuse_opt_add_arg(outargs, "-h"); + fuse_main(outargs->argc, outargs->argv, &unreliable_ops, NULL); + exit(1); - if (argc != 2) { - fprintf(stderr, "Usage: %s MOUNTPOINT\n", argv[0]); - return EXIT_FAILURE; + case KEY_VERSION: + fprintf(stderr, "UnreliableFS version %s\n", UNRELIABLEFS_VERSION); + fuse_opt_add_arg(outargs, "--version"); + fuse_main(outargs->argc, outargs->argv, &unreliable_ops, NULL); + exit(0); } + return 1; +} - fuse_argv[0] = argv[0]; - fuse_argv[1] = argv[1]; - #if FUSE_USE_VERSION < 30 - fuse_argv[2] = "-ononempty,suid,dev,allow_other,default_permissions"; - #else - fuse_argv[2] = "-osuid,dev,allow_other,default_permissions"; - #endif - fuse_argv[3] = NULL; +int main(int argc, char *argv[]) +{ + struct fuse_args args = FUSE_ARGS_INIT(argc, argv); + struct unreliablefs_config conf; + memset(&conf, 0, sizeof(conf)); + + fuse_opt_parse(&args, &conf, unreliablefs_opts, unreliablefs_opt_proc); + /* fuse_opt_add_arg(&args, "-omodules=subdir,subdir=/tmp"); */ fprintf(stdout, "Starting FUSE filesystem\n"); - return fuse_main(fuse_argc, fuse_argv, &unreliable_ops, NULL); -#else - fprintf(stdout, "Starting FUSE filesystem\n"); - return fuse_main(argc, argv, &unreliable_ops, NULL); -#endif /* DEBUG */ + fprintf(stdout, "Seed %d, base_dir %s\n", conf.seed, conf.base_dir); + + return fuse_main(args.argc, args.argv, &unreliable_ops, NULL); }