Как мне разрешить обход команд директорий cd с помощью Fuse API? - PullRequest
0 голосов
/ 14 марта 2019

Я использую Fuse API для реализации виртуальной файловой системы, которая содержит структуру каталогов в древовидной структуре данных.

Я могу реализовать в своем пользовательском пространстве getattr () и readdir () следующим образом:

static int my_getattr(const char *path, struct stat *stbuf,                                                                                     
             struct fuse_file_info *fi)                                                                                                                   
{                                                                                                                                                                                                                                                                
    (void) fi;                                                                                                                                            
    int res = 0;                                                                                                                                          
    memset(stbuf, 0, sizeof(struct stat));                                                                                                                

    Node* myNode = theTree_.findNode(path, '/');                                                                                
    if (myNode != nullptr)                                                                                                                                
    {                                                                                                                                                                                                                                                                         
        if (myNode->theValue == RfsFuseVfs::NON_LEAF)                                                                                                     
        {                                                                                                                                                 
            puts("directory!");                                                                                                                            
            stbuf->st_mode = S_IFDIR | 0755;                                                                                                              
            stbuf->st_nlink = 2;                                                                                                                          
        }                                                                                                                                                 
        else                                                                                                                                              
        {                                                                                                                                                 
            puts("file!");                                                                                                                                
            stbuf->st_mode = S_IFREG | 0444;                                                                                                              
            stbuf->st_nlink = 1;                                                                                                                          
            stbuf->st_size = 100;                                                                                                   
        }                                                                                                                                                 
    }                                                                                                                                                     
    else                                                                                                                                                  
    {                                                                                                                                                     
        puts("not found");                                                                                                                                
        res = -ENOENT;                                                                                                                                    
    }                                                                                                                                                     

    return res;                                                                                                                                           
}

static int rfs_fuse_vfs_readdir(const char *path, void *buf,                                                                                              
    fuse_fill_dir_t filler,                                                                                                                               
    off_t offset, struct fuse_file_info *fi,                                                                                                              
    enum fuse_readdir_flags flags)                                                                                                                        
{                                                                                                                                                         
    (void) offset;                                                                                                                                        
    (void) fi;                                                                                                                                            
    (void) flags;                                                                                                                                         

    Node* myCurrDir = nullptr;                                                                                            

    if (strcmp(path, "/") == 0)                                                                                                                           
    {                                                                                                                                                     
        myCurrDir = &theTree.getRootNode();                                                                                                         
    }                                                                                                                                                     
    else                                                                                                                                                  
    {                                                                                                                                                     
        myCurrDir = theTree.findNode(path, '/');                                                                                                    
    }                                                                                                                                                     

    if (myCurrDir != nullptr)                                                                                                                             
    {                                                                                                                                                     
        filler(buf, ".", NULL, 0, static_cast<fuse_fill_dir_flags>(0));                                                                                   
        filler(buf, "..", NULL, 0, static_cast<fuse_fill_dir_flags>(0));                                                                                  

        for (const auto& childNode : *myCurrDir)                                                                                                        
        {                                                                                                                                                 
            filler(buf, childNode.theName.c_str(), NULL, 0, static_cast<fuse_fill_dir_flags>(0));                                                       
        }                                                                                                                                                 

        return 0;                                                                                                                                         
    }                                                                                                                                                     
    else                                                                                                                                                  
    {                                                                                                                                                     
        return -ENOENT;                                                                                                                                   
    }                                                                                                                                                     
} 

Это работает, чтобы позволить мне пройти через иерархию каталогов, но когда я пытаюсь выполнить cd для изменения каталога, он фактически не меняет каталог.

Что яотсутствует

...