2014-04-22 40 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()能如果合适的话。

这些都不是新的操作;他们只是现有的扩展。如果您有关于如何进行这些更改的具体问题,请澄清您的问题。