Commit Diff


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 <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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);
 }