diff options
author | Javier <dev.git@javispedro.com> | 2015-02-12 00:21:02 +0100 |
---|---|---|
committer | Javier <dev.git@javispedro.com> | 2015-02-12 00:21:02 +0100 |
commit | 33225cb16d5313892d6e6b37c671194a8f0bcad2 (patch) | |
tree | b711312cbe32bdc0a4238c6184ecea6eff5b0129 /src/usersfs.c | |
parent | 17a0a7bcc8f6ddd54bde9cc6062aaa791e5dd2f5 (diff) | |
download | volumefs-33225cb16d5313892d6e6b37c671194a8f0bcad2.tar.gz volumefs-33225cb16d5313892d6e6b37c671194a8f0bcad2.zip |
use udisks2 instead of gvfs
Diffstat (limited to 'src/usersfs.c')
-rw-r--r-- | src/usersfs.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/usersfs.c b/src/usersfs.c new file mode 100644 index 0000000..52b9f05 --- /dev/null +++ b/src/usersfs.c @@ -0,0 +1,87 @@ +#define FUSE_USE_VERSION 30 + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <pwd.h> + +#include <fuse.h> + +static void * usersfs_init(struct fuse_conn_info *conn) +{ + +} + +static void usersfs_destroy(void *user_data) +{ + +} + +static int usersfs_getattr(const char *path, struct stat *stbuf) +{ + if (strcmp(path, "/") == 0) { + stbuf->st_mode = S_IFDIR | 0755; + stbuf->st_nlink = 2; + } else { + struct passwd *pwent = getpwnam(path + 1); + if (pwent && pwent->pw_dir) { + stbuf->st_mode = S_IFLNK | 0444; + stbuf->st_nlink = 1; + } else { + return -ENOENT; + } + } + return 0; +} + +static int usersfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi) +{ + if (strcmp(path, "/") != 0) { + return -ENOENT; + } + + (void) offset; + (void) fi; + + filler(buf, ".", NULL, 0); + filler(buf, "..", NULL, 0); + + struct passwd *pwent; + setpwent(); + while (pwent = getpwent()) { + if ((pwent->pw_uid == 0 || pwent->pw_uid >= 1000) && pwent->pw_name && pwent->pw_dir) { + filler(buf, pwent->pw_name, NULL, 0); + } + } + setpwent(); + +} + +static int usersfs_readlink(const char *path, char *buf, size_t size) +{ + if (strcmp(path, "/") == 0) { + return -EINVAL; + } + + struct passwd *pwent = getpwnam(path + 1); + if (pwent && pwent->pw_dir) { + strcpy(buf, pwent->pw_dir); + return 0; + } else { + return -ENOENT; + } +} + +static struct fuse_operations usersfs_oper = { + .getattr = usersfs_getattr, + .readdir = usersfs_readdir, + .readlink = usersfs_readlink +}; + +int main(int argc, char *argv[]) +{ + return fuse_main(argc, argv, &usersfs_oper, NULL); +} |