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

My HTML document is not linking to my CSS stylesheet properly -

php array slice every 2th rule -

node.js - Sending sockets to client side, Error: Converting circular structure to JSON -