linux - Writting a simple filesystem in C using FUSE -


i've learned hello.c. can create hello file under mountfile. i've no idea how create folder under mountfile , create hello under mountfile/foldericreate. can use cat mountfile/foldericreate/hello code similar simple hello.c

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

can give simple example how revise code above without changing struct fuse_operations. thank you!

to make directory work in fuse filesystem, following conditions need met:

  • the directory needs stat()-able, , should return properties appropriate directory (e.g, readable, executable, , s_ifdir).

  • the directory needs readdir()-able.

  • the directory needs appear in readdir() listing of parent. (this optional, having directory not appear in listing unusual, , make difficult access!)

  • any new paths under directory need stat()able , open()/read()able if appropriate.

none of these new operations; they're extensions of existing ones. if there specific questions have how make of these changes, please clarify question.


Comments

Popular posts from this blog

c++ - How to add Crypto++ library to Qt project -

jQuery Mobile app not scrolling in Firefox -

How to use vim as editor in Matlab GUI -