#include #include #include // posix #include #include #include #define FUSE_USE_VERSION 31 #include static int rgpgfs_getattr(const char *path, struct stat *statbuf, struct fuse_file_info *fi) { int res = lstat(path, statbuf); // printf("rgpgfs_getattr(%s, ...) = %d\n", path, res); if (res == -1) return -errno; return 0; } static int rgpgfs_access(const char *path, int mask) { int res = access(path, mask); // printf("rgpgfs_access(%s, %d) = %d\n", path, mask, res); if (res == -1) return -errno; return 0; } static int rgpgfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags) { DIR *dirp = opendir(path); if (dirp == NULL) return -errno; struct dirent *entp; while ((entp = readdir(dirp)) != NULL) { struct stat statbf; memset(&statbf, 0, sizeof(statbf)); statbf.st_ino = entp->d_ino; statbf.st_mode = entp->d_type << 12; if (filler(buf, entp->d_name, &statbf, 0, 0)) break; } closedir(dirp); return 0; } static int rgpgfs_open(const char *path, struct fuse_file_info *fi) { int res = open(path, fi->flags); if (res == -1) return -errno; fi->fh = res; return 0; } static int rgpgfs_read(const char *path, char *buf, size_t count, off_t offset, struct fuse_file_info *fi) { if (fi == NULL) { return ENOTSUP; } ssize_t bytes_num = pread(fi->fh, buf, count, offset); if (bytes_num == -1) return -errno; return bytes_num; } static int rgpgfs_release(const char *path, struct fuse_file_info *fi) { close(fi->fh); return 0; } static struct fuse_operations rgpgfs_fuse_operations = { .getattr = rgpgfs_getattr, .open = rgpgfs_open, .read = rgpgfs_read, .release = rgpgfs_release, .readdir = rgpgfs_readdir, .access = rgpgfs_access, }; int main(int argc, char *argv[]) { printf("libfuse version %s\n", fuse_pkgversion()); return fuse_main(argc, argv, &rgpgfs_fuse_operations, NULL); }