Как сделать символические ссылки в FUSE? - PullRequest
6 голосов
/ 23 мая 2011

Я разрабатываю приложение 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, у меня появляется сообщение о том, что функция не реализована (функции links). Какую функцию я должен реализовать, чтобы знать, куда указывает ссылка? Или где мне заполнить указатель направления?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 09 апреля 2013

Мне кажется, это работает:

  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 должен указывать) для символической ссылкипуть, установленный во втором параметре (struct stat * stbuf):

    • stbuf->st_mod до S_IFLNK | 0777
    • stbuf->st_nlink до 1
    • stbuf->st_size к длине целевого пути (не включайте нулевой терминатор строки в длину)
1 голос
/ 24 мая 2011

Чтобы реализовать символические ссылки, вам нужно реализовать функцию readlink() - вы заполняете предоставленный буфер строкой с нулевым символом в конце, которая является целью ссылки.

1 голос
/ 23 мая 2011

Вам необходимо реализовать функцию readdir, см .:

libfuse: fuse_operations Справочник по структуре

...