6

私は、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);
      }

      .....
  }

そして今、トラックディレクトリに移動すると、機能が実装されていないことを示すメッセージが表示されます(リンク機能)。リンクがどこを指しているかを知るには、どの関数を実装する必要がありますか? または、ポインターの方向をどこで埋める必要がありますか?

ありがとう!

4

3 に答える 3

4

これは私にとってはうまくいくようです:

  1. メンバーが指すint my_readlink(const char *path, char *buf, size_t size)関数を追加します。シンボリック リンク パスの場合、関数は、リンク ターゲットのパスである、ゼロで終わる文字列でバッファーを埋める必要があります。バイトを超えて書き込まないでください。たとえば、次のようにします。struct fuse_operations.readlinkbufsize

    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ターゲット パスの長さまで (文字列のゼロ ターミネータを長さに含めないでください)
于 2013-04-09T05:55:26.437 に答える
1

readdir関数を実装する必要があります。以下を参照してください。

libfuse: fuse_operations 構造体リファレンス

于 2011-05-23T13:24:58.653 に答える
1

シンボリック リンクを実装するには、関数を実装する必要がありますreadlink()。提供されたバッファに、リンクのターゲットである null で終わる文字列を入力します。

于 2011-05-24T03:26:41.387 に答える