如何在FUSE中创建符号链接?

Jav*_*ano 6 c programming-languages fuse

我正在开发一个FUSE应用程序,它带有一个带mp3的目录,并在另一个目录中安装一个具有以下结构的文件系统(根据它们的标签):

    Artist1
       |
       -----> Album11
                 |
                 -----> Track01
                 -----> Track02
                 -----> Track03
                 -----> Track04
                 -----> Track05
       -----> Album12
       ....
    Artist2
       |
       -----> Album21
       -----> Album22
       ....
    Artist3
    .....
Run Code Online (Sandbox Code Playgroud)

我正在使用sqlite3数据库来保存真实文件的链接.艺术家和专辑元素是文件夹,轨道元素是真实元素的链接.

我已经实现了为艺术家和专辑创建文件夹.但现在我有一个问题.

我有这个:

  static int getattr(...) {

      ....
      else if ( level == 0  || level == 1 || level == 2 )
      {
          // Estamos en el primer nivel. Son artistas, y por lo tanto, carpetas.
          stbuf->st_mode = S_IFDIR | 0755;
          stbuf->st_nlink = 2;
          lstat(path, stbuf);
      }
      else if (level == 3) {
      // Estamos en el tercer nivel. Son canciones, por lo que son enlaces
      stbuf->st_mode = S_IFLNK | 0755;
      stbuf->st_nlink = 2;
      lstat(path, stbuf);
      }

      .....
  }
Run Code Online (Sandbox Code Playgroud)

现在,当我进入track目录时,会收到一条消息,告诉我该函数未实现(链接函数).我必须实现哪些功能才能知道链接指向的位置?或者我在哪里填写指针的方向?

谢谢!

Cra*_*een 5

这似乎对我有用:

  1. 添加一个int my_readlink(const char *path, char *buf, size_t size)函数,您的struct fuse_operations成员.readlink应该指向该函数。对于符号链接路径,您的函数应使用buf以零结尾的字符串填充缓冲区,该字符串是链接目标的路径。不要写入超过size字节。例如做类似的事情:

    strncpy(buf, "/target/path", size);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的my_getattr()函数(应指向哪个struct fuse_operations成员)中,对于符号链接路径,在第二个参数 ( ) 中设置:.getattrstruct stat * stbuf

    • stbuf->st_modS_IFLNK | 0777
    • stbuf->st_nlink1
    • stbuf->st_size目标路径的长度(长度中不包括字符串的零终止符)


Aug*_*rom 1

您需要实现一个readdir功能,请参阅:

libfuse:fuse_operations 结构参考

  • 它已实现,但我不知道如何实现它以链接到所需文件 (2认同)