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
Post a Comment