|
@@ -0,0 +1,87 @@
|
|
|
+#include <errno.h>
|
|
|
+#include <stdio.h>
|
|
|
+#include <string.h>
|
|
|
+
|
|
|
+
|
|
|
+#include <dirent.h>
|
|
|
+#include <sys/stat.h>
|
|
|
+#include <unistd.h>
|
|
|
+
|
|
|
+#define FUSE_USE_VERSION 31
|
|
|
+#include <fuse.h>
|
|
|
+
|
|
|
+static int rgpgfs_getattr(const char *path, struct stat *statbuf,
|
|
|
+ struct fuse_file_info *fi) {
|
|
|
+ int res = lstat(path, statbuf);
|
|
|
+
|
|
|
+ if (res == -1)
|
|
|
+ return -errno;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int rgpgfs_access(const char *path, int mask) {
|
|
|
+ int res = access(path, mask);
|
|
|
+
|
|
|
+ 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[]) {
|
|
|
+ return fuse_main(argc, argv, &rgpgfs_fuse_operations, NULL);
|
|
|
+}
|