如何从应用程序中挂载 davfs?

How can I mount davfs from within application?

我有一个远程文件系统,我可以通过 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");

挂载 returns 结果 -1 并且 errno 设置为 19:strerror 打印 "no such device".

挂载手册页显示:

ENODEV filesystemtype not configured in the kernel.

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

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

原来[=44​​=]是一个由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 /你的路径(即 fork+exec 挂载命令)
  4. 通过在 /yourpath 中读取和写入文件来使用 webdav
  5. 卸载/你的路径
  6. 卸载/etc/davfs2
  7. 完成后退出程序。

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