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

时间:2011-05-23 10:50:22

标签: c programming-languages fuse

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

    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目录时,会收到一条消息,告诉我该函数未实现(链接函数)。我必须实现哪些功能才能知道链接指向的位置?或者我在哪里填写指针的方向?

谢谢!

3 个答案:

答案 0 :(得分: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成员.getattr应指向)中,对于符号链接路径,请在第2个参数(struct stat * stbuf)中设置:

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

答案 1 :(得分:1)

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

libfuse: fuse_operations Struct Reference

答案 2 :(得分:1)

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