微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在命令行参数中告诉 fuse3 您需要一个设备和一个挂载点

如何解决如何在命令行参数中告诉 fuse3 您需要一个设备和一个挂载点

我正在使用 fuse3 编写一个文件系统驱动程序,该驱动程序应该解析所有的 fuse 选项,然后接受两个参数,一个设备路径(或包含文件系统映像的文件)和一个挂载点。

有没有一种方便的方法可以使用fuse的命令行解析从命令行中提取设备?在我将它们像这样融合之前,我已经开始操纵它们:

    struct fuse_args args;
    const char *device = NULL;

    memset(&args,sizeof(args));
    for (int i = 0; i < argc; ++i)
        if (i > 0 && i == argc - 2 && *argv[i] != '-')
            image = argv[i];
        else
            fuse_opt_add_arg(&args,argv[i]);

    if (fuse_opt_parse(&args,&options,option_spec,NULL) == -1)
        return 1;

    if (!device) {
        usage(argv[0]);
        fuse_opt_add_arg(&args,"--help");
    }

    fuse_main(args.argc,args.argv,&oper,nullptr);

但这完全是粗暴的,如果用户只指定了一个参数,则它不会完全起作用,除非该参数恰好也是一个有效的挂载点,因为保险丝似乎在打印帮助之前检查了挂载点的可行性。

这肯定是一件很常见的事情,所以我想知道这种文件系统的正确习语是什么。

解决方法

因此,您必须按照 cmd 参数的顺序限制用户(所有保险丝/挂载选项都在设备路径和挂载点之前)。为简单起见,请确保最后提供设备和挂载点的路径:

因此,在您的主函数中,此语句将检查参数数量是否正确,并且挂载点和设备不像选项那样以连字符开头。

    if ((argc < 3) || (argv[argc-2][0] == '-') || (argv[argc-1][0] == '-'))
    {
        fprintf(stderr,"usage:  ./myfuse [FUSE and mount options] devicepath mountPoint\n");
        abort();
    }

然后提取设备路径并将其存储在结构中:

struct my_state *my_data;
my_data = malloc(sizeof(struct mi_state));
if (mi_data == NULL) {
    perror("main calloc");
    abort();
}

my_data->devicepath = realpath(argv[argc - 2],NULL);
    argv[argc-2] = argv[argc-1];
    argv[argc-1] = NULL;
    argc--;

请注意,在将 hem 传递给 fuse_main 函数之前,我从 argv 中删除了设备路径并将 argc 减 1 然后在调用 fuse_main 函数时确保传递 my_data 结构:

fuse_main(argc,argv,&my_fuse_operations,mi_data);

这里是 my_state 结构的定义,你可以把它放在头文件中:

struct my_state{
    char *devicepath;
};

您还应该在结构体定义下方的头文件中添加此定义:

#define BB_DATA ((struct mi_state *) fuse_get_context()->private_data)

也在你的 init 函数中调用 fuse_get_context 并返回 BB_DATA:

void *my_init()
{
    fuse_get_context();
    return BB_DATA;
}

返回值将在 fuse_context 的 private_data 字段中传递给所有文件操作,并作为 destroy() 方法的参数。 在调用这个函数之前设置了fuse_context,fuse_get_context()->private_data返回传递给fuse_main()的user_data。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。