【问题标题】:How can I mount davfs from within application?如何从应用程序中挂载 davfs?
【发布时间】:2017-01-10 02:45:38
【问题描述】:

我有一个可以通过 webdav 挂载的远程文件系统

sudo mount -t davfs https://myserver.com /tmp/dav

此时它提示我输入用户名和密码。

然后我向 fstab 添加了一个条目并创建了一个~/.davfs2/secrets file。 如果我现在运行

mount /tmp/dav

它有效。

现在我需要通过 C 代码自动从我的应用程序中安装它。

如果我打电话:

int result = mount("https://myserver.com", "/tmp/dav", "davfs", 0, "user,noauto,file_mode=600,dir_mode=700");

Mount 返回结果 -1 并且 errno 设置为 19:strerror 打印“没有这样的设备”。

安装手册页显示:

ENODEV filesystemtype not configured in the kernel.

我怎样才能让它工作?是不是因为 davfs 是基于 fuse 的?

【问题讨论】:

    标签: c linux webdav


    【解决方案1】:

    事实证明,答案比我想象的要简单。我应该指出我还想删除密码提示。我就是这样解决的。

    原来 mount.davfs 是一个由 mount 命令执行的服务器。但它不是一个注册的文件系统,所以你不能使用系统 mount(2) 调用。相反,我们必须直接执行 mount 命令。

    为了提供我自己的秘密文件,我这样做了。

    1. 在 /etc/davfs2 挂载 tmpfs(隐藏真实的 davfs2.conf 等)

      mount("none", "/etc/davfs2/secrets", "tmpfs", 0, NULL);

    2. 创建包含我们的秘密的 /etc/davfs2/secrets 模式 0600

    3. 运行 mount -t davfs url /yourpath(即 fork+exec 挂载命令)
    4. 通过读写 /yourpath 中的文件来使用 webdav
    5. 卸载 /yourpath
    6. 卸载 /etc/davfs2
    7. 完成后退出程序。

    此外,我使用 unshare 从进程外部隐藏挂载。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      相关资源
      最近更新 更多