[WIP] [PATCH v4 11/12] erofs-utils: fuse: cleanup main.c
Gao Xiang
hsiangkao at aol.com
Sun Nov 15 05:27:49 AEDT 2020
Signed-off-by: Gao Xiang <hsiangkao at aol.com>
---
fuse/main.c | 240 +++++++++++++++++++++++++---------------------------
1 file changed, 113 insertions(+), 127 deletions(-)
diff --git a/fuse/main.c b/fuse/main.c
index 236d54635acb..7beaba8a9bc2 100644
--- a/fuse/main.c
+++ b/fuse/main.c
@@ -4,125 +4,28 @@
*
* Created by Li Guifu <blucerlee at gmail.com>
*/
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <execinfo.h>
#include <signal.h>
-#include <stddef.h>
-
+#include <libgen.h>
#include <fuse.h>
#include <fuse_opt.h>
+#include "erofs/config.h"
#include "erofs/print.h"
#include "erofs/io.h"
int erofsfuse_readdir(const char *path, void *buffer, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi);
-/* XXX: after liberofs is linked in, it should be removed */
-struct erofs_configure cfg;
-
-enum {
- EROFS_OPT_HELP,
- EROFS_OPT_VER,
-};
-
-struct options {
- const char *disk;
- const char *mount;
- const char *logfile;
- unsigned int debug_lvl;
-};
-static struct options fusecfg;
-
-#define OPTION(t, p) { t, offsetof(struct options, p), 1 }
-
-static const struct fuse_opt option_spec[] = {
- OPTION("--log=%s", logfile),
- OPTION("--dbg=%u", debug_lvl),
- FUSE_OPT_KEY("-h", EROFS_OPT_HELP),
- FUSE_OPT_KEY("-v", EROFS_OPT_VER),
- FUSE_OPT_END
-};
-
-static void usage(void)
-{
- fprintf(stderr, "\terofsfuse [options] <image> <mountpoint>\n");
- fprintf(stderr, "\t --log=<file> output log file\n");
- fprintf(stderr, "\t --dbg=<level> log debug level 0 ~ 7\n");
- fprintf(stderr, "\t -h show help\n");
- fprintf(stderr, "\t -v show version\n");
- exit(1);
-}
-
-static void dump_cfg(void)
-{
- fprintf(stderr, "\tdisk :%s\n", fusecfg.disk);
- fprintf(stderr, "\tmount:%s\n", fusecfg.mount);
- fprintf(stderr, "\tdebug_lvl:%u\n", fusecfg.debug_lvl);
- fprintf(stderr, "\tlogfile :%s\n", fusecfg.logfile);
-}
-
-static int optional_opt_func(void *data, const char *arg, int key,
- struct fuse_args *outargs)
-{
- UNUSED(data);
- UNUSED(outargs);
-
- switch (key) {
- case FUSE_OPT_KEY_OPT:
- return 1;
-
- case FUSE_OPT_KEY_NONOPT:
- if (!fusecfg.disk) {
- fusecfg.disk = strdup(arg);
- return 0;
- } else if (!fusecfg.mount)
- fusecfg.mount = strdup(arg);
-
- return 1;
- case EROFS_OPT_HELP:
- usage();
- break;
-
- case EROFS_OPT_VER:
- fprintf(stderr, "EROFS FUSE VERSION v 1.0.0\n");
- exit(0);
- }
-
- return 1;
-}
-
-static void signal_handle_sigsegv(int signal)
-{
- void *array[10];
- size_t nptrs;
- char **strings;
- size_t i;
-
- UNUSED(signal);
- erofs_dbg("========================================");
- erofs_dbg("Segmentation Fault. Starting backtrace:");
- nptrs = backtrace(array, 10);
- strings = backtrace_symbols(array, nptrs);
- if (strings) {
- for (i = 0; i < nptrs; i++)
- erofs_dbg("%s", strings[i]);
- free(strings);
- }
- erofs_dbg("========================================");
-
- abort();
-}
-
-void *erofs_init(struct fuse_conn_info *info)
+static void *erofsfuse_init(struct fuse_conn_info *info)
{
erofs_info("Using FUSE protocol %d.%d", info->proto_major, info->proto_minor);
return NULL;
}
-int erofs_open(const char *path, struct fuse_file_info *fi)
+static int erofsfuse_open(const char *path, struct fuse_file_info *fi)
{
erofs_info("open path=%s", path);
@@ -132,7 +35,7 @@ int erofs_open(const char *path, struct fuse_file_info *fi)
return 0;
}
-int erofs_getattr(const char *path, struct stat *stbuf)
+static int erofsfuse_getattr(const char *path, struct stat *stbuf)
{
struct erofs_inode v = { 0 };
int ret;
@@ -186,51 +89,134 @@ static int erofsfuse_readlink(const char *path, char *buffer, size_t size)
static struct fuse_operations erofs_ops = {
.readlink = erofsfuse_readlink,
- .getattr = erofs_getattr,
+ .getattr = erofsfuse_getattr,
.readdir = erofsfuse_readdir,
- .open = erofs_open,
+ .open = erofsfuse_open,
.read = erofsfuse_read,
- .init = erofs_init,
+ .init = erofsfuse_init,
};
+static struct options {
+ const char *disk;
+ const char *mount;
+ unsigned int debug_lvl;
+ bool show_help;
+} fusecfg;
+
+#define OPTION(t, p) \
+ { t, offsetof(struct options, p), 1 }
+static const struct fuse_opt option_spec[] = {
+ OPTION("-d %u", debug_lvl),
+ OPTION("-h", show_help),
+ OPTION("--help", show_help),
+ FUSE_OPT_END
+};
+
+#define OPTION(t, p) { t, offsetof(struct options, p), 1 }
+
+static void usage(void)
+{
+ fprintf(stderr, "\terofsfuse [options] <image> <mountpoint>\n");
+ fprintf(stderr, "\t --log=<file> output log file\n");
+ fprintf(stderr, "\t --dbg=<level> log debug level 0 ~ 7\n");
+ fprintf(stderr, "\t -h show help\n");
+ fprintf(stderr, "\t -v show version\n");
+ exit(EXIT_FAILURE);
+}
+
+static void erofsfuse_dumpcfg(void)
+{
+ erofs_info("disk: %s", fusecfg.disk);
+ erofs_info("mountpoint: %s", fusecfg.mount);
+ erofs_info("debug level: %u", cfg.c_dbg_lvl);
+}
+
+static int optional_opt_func(void *data, const char *arg, int key,
+ struct fuse_args *outargs)
+{
+ switch (key) {
+ case FUSE_OPT_KEY_NONOPT:
+ if (!fusecfg.disk) {
+ fusecfg.disk = strdup(arg);
+ return 0;
+ }
+ if (!fusecfg.mount)
+ fusecfg.mount = strdup(arg);
+ case FUSE_OPT_KEY_OPT:
+ break;
+ default:
+ DBG_BUGON(1);
+ break;
+ }
+ return 1;
+}
+
+static void signal_handle_sigsegv(int signal)
+{
+ void *array[10];
+ size_t nptrs;
+ char **strings;
+ size_t i;
+
+ UNUSED(signal);
+ erofs_dbg("========================================");
+ erofs_dbg("Segmentation Fault. Starting backtrace:");
+ nptrs = backtrace(array, 10);
+ strings = backtrace_symbols(array, nptrs);
+ if (strings) {
+ for (i = 0; i < nptrs; i++)
+ erofs_dbg("%s", strings[i]);
+ free(strings);
+ }
+ erofs_dbg("========================================");
+
+ abort();
+}
+
+
int main(int argc, char *argv[])
{
- int ret = EXIT_FAILURE;
+ int ret;
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+ erofs_init_configure();
+ fprintf(stderr, "%s %s\n", basename(argv[0]), cfg.c_version);
+
if (signal(SIGSEGV, signal_handle_sigsegv) == SIG_ERR) {
- fprintf(stderr, "Failed to initialize signals\n");
- return EXIT_FAILURE;
+ fprintf(stderr, "failed to initialize signals\n");
+ ret = -errno;
+ goto err;
}
- /* Parse options */
- if (fuse_opt_parse(&args, &fusecfg, option_spec, optional_opt_func) < 0)
- return 1;
-
- dump_cfg();
+ /* parse options */
+ ret = fuse_opt_parse(&args, &fusecfg, option_spec, optional_opt_func);
+ if (ret)
+ goto err;
+ if (fusecfg.show_help)
+ usage();
cfg.c_dbg_lvl = fusecfg.debug_lvl;
- if (dev_open_ro(fusecfg.disk) < 0) {
- fprintf(stderr, "Failed to open disk:%s\n", fusecfg.disk);
- goto exit;
+ erofsfuse_dumpcfg();
+ ret = dev_open_ro(fusecfg.disk);
+ if (ret) {
+ fprintf(stderr, "failed to open: %s\n", fusecfg.disk);
+ goto err_fuse_free_args;
}
- if (erofs_read_superblock()) {
- fprintf(stderr, "Failed to read erofs super block\n");
- goto exit_dev;
+ ret = erofs_read_superblock();
+ if (ret) {
+ fprintf(stderr, "failed to read erofs super block\n");
+ goto err_dev_close;
}
- erofs_info("fuse start");
-
ret = fuse_main(args.argc, args.argv, &erofs_ops, NULL);
-
- erofs_info("fuse done ret=%d", ret);
-
-exit_dev:
+err_dev_close:
dev_close();
-exit:
+err_fuse_free_args:
fuse_opt_free_args(&args);
- return ret;
+err:
+ erofs_exit_configure();
+ return ret ? EXIT_FAILURE : EXIT_SUCCESS;
}
--
2.24.0
More information about the Linux-erofs
mailing list