title: Writing a simple filesystem in C using FUSE
body: <p>I've learned the hello.c.
  It can create a hello file under mountfile.
  But I've no idea about how to create a folder under the mountfile and then create hello under mountfile/folderIcreate.
  then I can use cat mountfile/folderIcreate/hello
  the code is similar to the simple hello.c</p>
  
  <pre><code>#define FUSE_USE_VERSION 30
  
  #include &lt;fuse.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  #include &lt;errno.h&gt;
  #include &lt;fcntl.h&gt;
  
  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-&gt;st_mode = S_IFDIR | 0755;
          stbuf-&gt;st_nlink = 2;
      } 
      else if (strcmp(path, hello_path) == 0) 
      {
          stbuf-&gt;st_mode = S_IFREG | 0444;
          stbuf-&gt;st_nlink = 1;
          stbuf-&gt;st_size = strlen(hello_str);
      }
      else if (strcmp(path, add_path) == 0) 
      {
          stbuf-&gt;st_mode = S_IFDIR | 0755;
          stbuf-&gt;st_nlink = 3;
          if (strcmp(path, add_path1) == 0) 
          {
              stbuf-&gt;st_mode = S_IFREG | 0444;
              stbuf-&gt;st_nlink = 1;
              stbuf-&gt;st_size = strlen(hello_str);
          }
      }
      else if(strcmp(path, div_path) == 0)
      {
          stbuf-&gt;st_mode = S_IFDIR | 0755;
          stbuf-&gt;st_nlink = 3;
      } 
      else if(strcmp(path, div_path) == 0)
      {
          stbuf-&gt;st_mode = S_IFDIR | 0755;
          stbuf-&gt;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-&gt;flags &amp; 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 &lt; len) {
          if (offset + size &gt; 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, &amp;hello_oper, NULL);
  }
  </code></pre>
  
  <p>can someone give a simple example about how to revise the code above without changing the struct fuse_operations.
  Thank you!</p>