2011-05-23 19 views
5

Ben (kendi etiket en uygun) mp3 en ile bir dizin alır ve aşağıdaki yapıya sahip başka bir dizinde bir dosya sistemini bir FUSE uygulaması geliştiriyorum: Ben mantain bir Sqlite3 veritabanını kullanıyorumFUSE'de sembolik bağlantılar nasıl oluşturulur?

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

gerçek dosyalara bağlantılar. Sanatçılar ve albümler elemanları klasörlerdir ve parça elemanları gerçek olanlara aittir.

Sanatçılar ve albümler için klasörler oluşturmayı başardım. Ama şimdi bir sorunum var. izler dizinde ben ls y fonksiyonu (bağlantılar işlevlerini) uygulanmadı söylüyor bir ileti aldığınızda,

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); 
     } 

     ..... 
    } 

Ve şimdi:

bu var. Bağlantının nerede olduğunu bilmek için hangi işlevi uygulamak zorundayım? Veya işaretçinin yönünü nereye kadar doldurmalıyım?

Teşekkürler!

Bir readdir işlevi uygulamak gerekir

cevap

1

sembolik bağlantıları uygulamak için, readlink() işlevi uygulamak gerekir - Eğer bir boşlukla sonlandırılmış dize ile verilen tampon doldurmak bağlantının hedefi.

3

Bu benim için iş gibi görünüyor:

  1. sizin struct fuse_operations üye .readlink işaret etmelidir bir int my_readlink(const char *path, char *buf, size_t size) fonksiyonunu ekleyin. Sembolik bağlantı yolu için, işleviniz buf arabelleğini, bağlantı hedefinin yolu olan sıfır sonlandırılmış bir dizeyle doldurmalıdır. size bayttan fazla yazmayın. Örneğin.

    • stbuf->st_modS_IFLNK | 0777 için: 2 parametrede ayarlanan sembolik bağlantı yolu, (struct stat * stbuf) için, (struct fuse_operations üye .getattr işaret olmalıdır) sizin my_getattr() işlevinde

      strncpy(buf, "/target/path", size); 
      
    • : Böyle bir şey yapmak lengt için 1

    • stbuf->st_size için
    • stbuf->st_nlink Hedef yolunun h (uzunluğunda dize ait sıfır terminatör içermez)
İlgili konular