int main(int argc, char *argv[]) { struct fuse_args args; sqfs_opts opts; sqfs_hl *hl; int ret; struct fuse_opt fuse_opts[] = { {"offset=%u", offsetof(sqfs_opts, offset), 0}, FUSE_OPT_END }; struct fuse_operations sqfs_hl_ops; memset(&sqfs_hl_ops, 0, sizeof(sqfs_hl_ops)); sqfs_hl_ops.init = sqfs_hl_op_init; sqfs_hl_ops.destroy = sqfs_hl_op_destroy; sqfs_hl_ops.getattr = sqfs_hl_op_getattr; sqfs_hl_ops.opendir = sqfs_hl_op_opendir; sqfs_hl_ops.releasedir = sqfs_hl_op_releasedir; sqfs_hl_ops.readdir = sqfs_hl_op_readdir; sqfs_hl_ops.open = sqfs_hl_op_open; sqfs_hl_ops.create = sqfs_hl_op_create; sqfs_hl_ops.release = sqfs_hl_op_release; sqfs_hl_ops.read = sqfs_hl_op_read; sqfs_hl_ops.readlink = sqfs_hl_op_readlink; sqfs_hl_ops.listxattr = sqfs_hl_op_listxattr; sqfs_hl_ops.getxattr = sqfs_hl_op_getxattr; args.argc = argc; args.argv = argv; args.allocated = 0; opts.progname = argv[0]; opts.image = NULL; opts.mountpoint = 0; opts.offset = 0; if (fuse_opt_parse(&args, &opts, fuse_opts, sqfs_opt_proc) == -1) sqfs_usage(argv[0], true); if (!opts.image) sqfs_usage(argv[0], true); hl = sqfs_hl_open(opts.image, opts.offset); if (!hl) return -1; fuse_opt_add_arg(&args, "-s"); /* single threaded */ ret = fuse_main(args.argc, args.argv, &sqfs_hl_ops, hl); fuse_opt_free_args(&args); return ret; }
int sqfs_opt_proc(void *data, const char *arg, int key, struct fuse_args *outargs) { sqfs_opts *opts = (sqfs_opts*)data; if (key == FUSE_OPT_KEY_NONOPT) { if (opts->mountpoint) { return -1; /* Too many args */ } else if (opts->image) { opts->mountpoint = 1; return 1; } else { opts->image = arg; return 0; } } else if (key == FUSE_OPT_KEY_OPT) { if (strncmp(arg, "-h", 2) == 0 || strncmp(arg, "--h", 3) == 0) sqfs_usage(opts->progname, true); } return 1; /* Keep */ }
int main(int argc, char *argv[]) { struct fuse_args args; sqfs_opts opts; char *mountpoint = NULL; int mt, fg; int err; sqfs_ll *ll; struct fuse_lowlevel_ops sqfs_ll_ops; memset(&sqfs_ll_ops, 0, sizeof(sqfs_ll_ops)); sqfs_ll_ops.getattr = sqfs_ll_op_getattr; sqfs_ll_ops.opendir = sqfs_ll_op_opendir; sqfs_ll_ops.releasedir = sqfs_ll_op_releasedir; sqfs_ll_ops.readdir = sqfs_ll_op_readdir; sqfs_ll_ops.lookup = sqfs_ll_op_lookup; sqfs_ll_ops.open = sqfs_ll_op_open; sqfs_ll_ops.release = sqfs_ll_op_release; sqfs_ll_ops.read = sqfs_ll_op_read; sqfs_ll_ops.readlink = sqfs_ll_op_readlink; sqfs_ll_ops.listxattr = sqfs_ll_op_listxattr; sqfs_ll_ops.getxattr = sqfs_ll_op_getxattr; sqfs_ll_ops.forget = sqfs_ll_op_forget; /* PARSE ARGS */ args.argc = argc; args.argv = argv; args.allocated = 0; opts.progname = argv[0]; opts.image = NULL; opts.mountpoint = 0; if (fuse_opt_parse(&args, &opts, NULL, sqfs_opt_proc) == -1) sqfs_usage(argv[0], true); if (fuse_parse_cmdline(&args, &mountpoint, &mt, &fg) == -1) sqfs_usage(argv[0], true); if (mountpoint == NULL) sqfs_usage(argv[0], true); /* OPEN FS */ err = !(ll = sqfs_ll_open(opts.image)); /* STARTUP FUSE */ if (!err) { sqfs_ll_chan ch; err = -1; if (sqfs_ll_mount(&ch, mountpoint, &args) == SQFS_OK) { struct fuse_session *se = fuse_lowlevel_new(&args, &sqfs_ll_ops, sizeof(sqfs_ll_ops), ll); if (se != NULL) { if (sqfs_ll_daemonize(fg) != -1) { if (fuse_set_signal_handlers(se) != -1) { fuse_session_add_chan(se, ch.ch); /* FIXME: multithreading */ err = fuse_session_loop(se); fuse_remove_signal_handlers(se); #if HAVE_DECL_FUSE_SESSION_REMOVE_CHAN fuse_session_remove_chan(ch.ch); #endif } } fuse_session_destroy(se); } sqfs_ll_destroy(ll); sqfs_ll_unmount(&ch, mountpoint); } } fuse_opt_free_args(&args); free(ll); free(mountpoint); return -err; }