]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
fuse2fs: decode fuse_main error codes
authorDarrick J. Wong <djwong@kernel.org>
Wed, 21 May 2025 22:40:23 +0000 (15:40 -0700)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 23 May 2025 13:41:20 +0000 (09:41 -0400)
Translate the fuse_main return values into actual mount(8) style error
codes instead of returning 0 all the time, and print something to the
original stderr if something went wrong so that the user will know what
to do next.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Link: https://lore.kernel.org/r/174786677923.1383760.3429767121128890204.stgit@frogsfrogsfrogs
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/fuse2fs.c

index fa7c9f29ff0f9887ed2f9b7e82d824d7d21fbc6c..800122fc039bcb3f453d6fced9a965fab2a4d507 100644 (file)
@@ -4105,6 +4105,7 @@ int main(int argc, char *argv[])
        struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
        struct fuse2fs fctx;
        errcode_t err;
+       FILE *orig_stderr = stderr;
        char *logfile;
        char extra_args[BUFSIZ];
        int ret = 0;
@@ -4322,11 +4323,43 @@ int main(int argc, char *argv[])
        }
 
        pthread_mutex_init(&fctx.bfl, NULL);
-       fuse_main(args.argc, args.argv, &fs_ops, &fctx);
+       ret = fuse_main(args.argc, args.argv, &fs_ops, &fctx);
        pthread_mutex_destroy(&fctx.bfl);
 
-       ret = 0;
+       switch(ret) {
+       case 0:
+               /* success */
+               ret = 0;
+               break;
+       case 1:
+       case 2:
+               /* invalid option or no mountpoint */
+               ret = 1;
+               break;
+       case 3:
+       case 4:
+       case 5:
+       case 6:
+       case 7:
+               /* setup or mounting failed */
+               ret = 32;
+               break;
+       default:
+               /* fuse started up enough to call op_init */
+               ret = 0;
+               break;
+       }
 out:
+       if (ret & 1) {
+               fprintf(orig_stderr, "%s\n",
+ _("Mount failed due to unrecognized options.  Check dmesg(1) for details."));
+               fflush(orig_stderr);
+       }
+       if (ret & 32) {
+               fprintf(orig_stderr, "%s\n",
+ _("Mount failed while opening filesystem.  Check dmesg(1) for details."));
+               fflush(orig_stderr);
+       }
        if (global_fs) {
                err = ext2fs_close(global_fs);
                if (err)