2011-05-23 53 views
5

我開發(根據其標籤的)一個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); 
     } 

     ..... 
    } 

而現在,當我在軌道目錄LSŸ得到一個消息,告訴我,該功能沒有實現(鏈接功能)。我必須執行哪個功能才能知道鏈接的位置?或者我必須在哪裏填寫指針的方向?

謝謝!

回答

1

要實現符號鏈接,你需要實現readlink()功能 - 您填寫所提供的緩衝區,那是一個空值終止字符串鏈接的目標。

3

這似乎爲我工作:

  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_modS_IFLNK | 0777
    • stbuf->st_nlink1
    • stbuf->st_size to the lengt目標路徑H(不包括串在長度0終結)
相關問題