[PATCH] Make tux3fuse more user friendly
Tero Roponen
tero.roponen at gmail.com
Sat Jan 5 06:06:52 PST 2013
This patch cleans up the command line parsing in
tux3fuse making it somewhat more user friendly.
$ ./tux3fuse
Usage: ./tux3fuse [options] <volume> <mount-point>
Options:
-f Stay in foreground
-d Stay in foreground, display FUSE messages
$ ./tux3fuse tux3.imgg mnt
Volume not found: tux3.imgg: No such file or directory
$ ./tux3fuse tux3.img mntt
fuse: bad mount point `mntt': No such file or directory
$ ./tux3fuse tux3.img mnt
Running in background
$
Signed-off-by: Tero Roponen <tero.roponen at gmail.com>
---
user/tux3fuse.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 59 insertions(+), 4 deletions(-)
diff --git a/user/tux3fuse.c b/user/tux3fuse.c
index 10f1bcb..9eb7e30 100644
--- a/user/tux3fuse.c
+++ b/user/tux3fuse.c
@@ -973,17 +973,68 @@ static struct fuse_lowlevel_ops tux3_ops = {
/* .poll */
};
+enum {
+ /* FUSE handles this option internally */
+ FUSE_OPT_KEY_INTERNAL,
+};
+
+static struct fuse_opt tux3fuse_options[] = {
+ FUSE_OPT_KEY("-d", FUSE_OPT_KEY_INTERNAL),
+ FUSE_OPT_KEY("-f", FUSE_OPT_KEY_INTERNAL),
+ FUSE_OPT_END
+};
+
+static int tux3fuse_parse_options(void *data, const char *arg,
+ int key, struct fuse_args *outargs)
+{
+ /*
+ * We take the first two NONOPT options as
+ * the volume name and the mount point.
+ */
+ if (key == FUSE_OPT_KEY_NONOPT) {
+ char **volname = data;
+ if (!*volname) {
+ *volname = canonicalize_file_name(arg);
+ if (!*volname) {
+ printf("Volume not found: %s: %s\n",
+ arg, strerror(errno));
+ return -1;
+ }
+ return 0; /* We handled this option */
+ } else {
+ return 1; /* Pass mount point to FUSE */
+ }
+ } else if (key == FUSE_OPT_KEY_INTERNAL) {
+ return 1; /* Pass this option to FUSE */
+ }
+
+ printf("Unhandled option: %s\n", arg);
+ return -1;
+}
+
int main(int argc, char *argv[])
{
- struct fuse_args args = FUSE_ARGS_INIT(argc - 1, argv + 1);
+ struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
struct fuse_chan *fc;
struct fuse_session *fs;
char *mountpoint;
int foreground;
int err = -1;
- if (argc < 3)
- error("usage: %s <volname> <mountpoint> [fuse opts]", argv[0]);
+ char *volname = NULL;
+
+ if (argc < 3) {
+ printf("Usage: %s [options] <volume> <mount-point>\n\n",
+ argv[0]);
+ printf("Options:\n");
+ printf("\t-f\tStay in foreground\n");
+ printf("\t-d\tStay in foreground, display FUSE messages\n");
+ return 1;
+ }
+
+ if (fuse_opt_parse(&args, &volname, tux3fuse_options,
+ tux3fuse_parse_options) == -1)
+ goto error;
if (fuse_parse_cmdline(&args, &mountpoint, NULL, &foreground) == -1)
goto error;
@@ -993,12 +1044,16 @@ int main(int argc, char *argv[])
goto error;
struct tux3fuse tux3fuse = {
- .volname = canonicalize_file_name(argv[1]),
+ .volname = volname,
};
+
fs = fuse_lowlevel_new(&args, &tux3_ops, sizeof(tux3_ops), &tux3fuse);
if (fs) {
if (fuse_set_signal_handlers(fs) != -1) {
fuse_session_add_chan(fs, fc);
+
+ if (!foreground)
+ printf("Running in background\n");
fuse_daemonize(foreground);
err = fuse_session_loop(fs);
--
1.7.12.464.g83379df
More information about the Tux3
mailing list