2014-04-22 41 views
0

我已經學會了hello.c。 它可以在mountfile下創建一個hello文件。 但我不知道如何在mountfile下創建一個文件夾,然後在mountfile/folderIcreate下創建hello。 然後我可以使用貓mountfile/folderIcreate /你好 代碼類似於簡單的hello.c用C使用FUSE寫一個簡單的文件系統

#define FUSE_USE_VERSION 30 

#include <fuse.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 

static const char *hello_str = "Hello World!\n"; 
static const char *add_path = "/add"; 
static const char *div_path = "/div"; 
static const char *hello_path = "/hello"; 

static int hello_getattr(const char *path, struct stat *stbuf) 
{ 
    int res = 0; 

    printf("%s", path); 

    memset(stbuf, 0, sizeof(struct stat)); 
    if (strcmp(path, "/") == 0) 
    { 
     stbuf->st_mode = S_IFDIR | 0755; 
     stbuf->st_nlink = 2; 
    } 
    else if (strcmp(path, hello_path) == 0) 
    { 
     stbuf->st_mode = S_IFREG | 0444; 
     stbuf->st_nlink = 1; 
     stbuf->st_size = strlen(hello_str); 
    } 
    else if (strcmp(path, add_path) == 0) 
    { 
     stbuf->st_mode = S_IFDIR | 0755; 
     stbuf->st_nlink = 3; 
     if (strcmp(path, add_path1) == 0) 
     { 
      stbuf->st_mode = S_IFREG | 0444; 
      stbuf->st_nlink = 1; 
      stbuf->st_size = strlen(hello_str); 
     } 
    } 
    else if(strcmp(path, div_path) == 0) 
    { 
     stbuf->st_mode = S_IFDIR | 0755; 
     stbuf->st_nlink = 3; 
    } 
    else if(strcmp(path, div_path) == 0) 
    { 
     stbuf->st_mode = S_IFDIR | 0755; 
     stbuf->st_nlink = 3; 
    } 
    else 
     res = -ENOENT; 

    return res; 
} 

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler, 
     off_t offset, struct fuse_file_info *fi) 
{ 
    printf("%s", path); 
    (void) offset; 
    (void) fi; 

    if (strcmp(path, "/") != 0) 
     return -ENOENT; 

    filler(buf, ".", NULL, 0); 
    filler(buf, "..", NULL, 0); 
    filler(buf, hello_path + 1, NULL, 0); 
    filler(buf, add_path + 1, NULL, 0); 
    filler(buf, div_path + 1, NULL, 0); 

    return 0; 
} 

static int hello_open(const char *path, struct fuse_file_info *fi) 
{ 
    printf("%s", path); 
    if (strcmp(path, hello_path) != 0) 
     return -ENOENT; 

    if ((fi->flags & 3) != O_RDONLY) 
     return -EACCES; 

    return 0; 
} 

static int hello_read(const char *path, char *buf, size_t size, off_t offset, 
      struct fuse_file_info *fi) 
{ 
    printf("%s", path); 
    size_t len; 
    (void) fi; 
    if(strcmp(path, hello_path) != 0) 
     return -ENOENT; 

    len = strlen(hello_str); 
    if (offset < len) { 
     if (offset + size > len) 
      size = len - offset; 
     memcpy(buf, hello_str + offset, size); 
    } else 
     size = 0; 

    return size; 
} 

static struct fuse_operations hello_oper = { 
    .getattr = hello_getattr, 
    .readdir = hello_readdir, 
    .open  = hello_open, 
    .read  = hello_read, 
}; 

int main(int argc, char *argv[]) 
{ 
    return fuse_main(argc, argv, &hello_oper, NULL); 
} 

能有人給有關如何在不改變結構fuse_operations修改上面的代碼一個簡單的例子。 謝謝!

+0

修復您的縮進將使這個問題更愉快。 –

+0

我解決了它。 – user3558391

回答

1

要使目錄正常工作的FUSE文件系統,以下條件需要滿足:

  • 的目錄必須stat() -able,並應返回適合於目錄屬性(例如,可讀,可執行,並且S_IFDIR)。

  • 該目錄需要爲readdir() -able。

  • 該目錄需要出現在其父項的readdir()列表中。 (這有點可選的,但具有目錄出現的列表是不尋常的,而且將使其難以進入!)

  • 該目錄下的任何新的路徑必須stat()能夠和open()/read()能如果合適的話。

這些都不是新的操作;他們只是現有的擴展。如果您有關於如何進行這些更改的具體問題,請澄清您的問題。