2011-05-23 16 views
5

मैं (उनके टैग के के अनुसार) है कि एमपी 3 के साथ एक निर्देशिका लेता है और निम्नलिखित संरचना के साथ एक और निर्देशिका में एक फाइल सिस्टम mounts एक फ्यूज एप्लिकेशन विकसित करने हूँ:FUSE में प्रतीकात्मक लिंक कैसे बनाएं?

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

मैं mantain करने के लिए एक 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 y संदेश है कि मुझसे कहता है कि समारोह लागू नहीं है (लिंक्स कार्यों) मिलता है। लिंक को इंगित करने के लिए मुझे कौन सा फ़ंक्शन लागू करना है? या मुझे सूचक की दिशा को भरना होगा?

धन्यवाद!

उत्तर

1

आप एक readdir समारोह लागू करने की आवश्यकता है, देखें:

libfuse: fuse_operations Struct Reference

+2

यह लागू हो जाता है लेकिन मैं इसे कैसे लागू करने की इच्छा फ़ाइलों से जोड़ने के लिए पता नहीं है –

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 पर ले जाना चाहिए), सांकेतिक लिंक पथ, 2 पैरामीटर में सेट (struct stat * stbuf) के लिए:

    • stbuf->st_modS_IFLNK | 0777 को
    • 1
    • lengt के लिए stbuf->st_size को stbuf->st_nlink लक्ष्य पथ का घंटा (स्ट्रिंग की लंबाई में शून्य टर्मिनेटर शामिल नहीं हैं)