6

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

    Artist1
       |
       -----> Album11
                 |
                 -----> Track01
                 -----> Track02
                 -----> Track03
                 -----> Track04
                 -----> Track05
       -----> Album12
       ....
    Artist2
       |
       -----> Album21
       -----> Album22
       ....
    Artist3
    .....

我正在使用 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);
      }

      .....
  }

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

谢谢!

4

3 回答 3

4

这似乎对我有用:

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

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

    • stbuf->st_modS_IFLNK | 0777
    • stbuf->st_nlink1
    • stbuf->st_size到目标路径的长度(不要在长度中包含字符串的零终止符)
于 2013-04-09T05:55:26.437 回答
1

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

libfuse: fuse_operations 结构参考

于 2011-05-23T13:24:58.653 回答
1

要实现符号链接,您需要实现该readlink()函数 - 您使用作为链接目标的以空字符结尾的字符串填充提供的缓冲区。

于 2011-05-24T03:26:41.387 回答