diff --git a/src/fuse_operations.c b/src/fuse_operations.c index 2ae2de1..0df92d6 100644 --- a/src/fuse_operations.c +++ b/src/fuse_operations.c @@ -39,20 +39,20 @@ #include "sourcefs.h" #include "ui-socket.h" -// TODO: move this to other file const char *get_process_name_by_pid(const int pid) { char *name = (char *)calloc(1024, sizeof(char)); if (name) { sprintf(name, "/proc/%d/cmdline", pid); - FILE *f = fopen(name, "r"); - if (f) { - size_t size; - size = fread(name, sizeof(char), 1024, f); + FILE *file = fopen(name, "r"); + if (file) { + size_t size = 0; + size = fread(name, sizeof(char), 1024, file); if (size > 0) { - if ('\n' == name[size - 1]) + if ('\n' == name[size - 1]) { name[size - 1] = '\0'; + } } - fclose(f); + fclose(file); } } return name; @@ -70,8 +70,8 @@ static void *xmp_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { To make parallel_direct_writes valid, need either set cfg->direct_io in current function (recommended in high level API) or set fi->direct_io in xmp_create() or xmp_open(). */ - // cfg->direct_io = 1; - // cfg->parallel_direct_writes = 1; + cfg->direct_io = 1; + cfg->parallel_direct_writes = 1; /* Pick up changes from lower filesystem right away. This is also necessary for better hardlink support. When the kernel @@ -88,13 +88,13 @@ static void *xmp_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { } static int xmp_getattr(const char *path, struct stat *stbuf, - struct fuse_file_info *fi) { + struct fuse_file_info *file_info) { int res; (void)path; - if (fi) - res = fstat(fi->fh, stbuf); + if (file_info) + res = fstat(file_info->fh, stbuf); else res = source_stat(path, stbuf); if (res == -1) { @@ -106,38 +106,39 @@ static int xmp_getattr(const char *path, struct stat *stbuf, } static int xmp_access(const char *path, int mask) { - int res; + int res = -1; // if mask is F_OK, then we don't need to check the permissions // (is that possible?) if (mask != F_OK) { - struct process_info pi; - struct fuse_context *fc = fuse_get_context(); + struct process_info proc_info; + struct fuse_context *context = fuse_get_context(); - pi.PID = fc->pid; - pi.name = get_process_name_by_pid(pi.PID); + proc_info.PID = context->pid; + proc_info.name = get_process_name_by_pid(proc_info.PID); // fprintf(stderr, "%s, %d\n", path, ask_access(path, pi)); - if (!interactive_access(real_filename(path), pi, 0)) { - free(pi.name); + if (!interactive_access(real_filename(path), proc_info, 0)) { + free((void *)proc_info.name); return -EACCES; } - free(pi.name); + free((void *)proc_info.name); } res = source_access(path, mask); - if (res == -1) + if (res == -1) { return -errno; + } return 0; } static int xmp_readlink(const char *path, char *buf, size_t size) { - int res; + int res = -1; res = readlink(path, buf, size - 1); if (res == -1) @@ -264,17 +265,18 @@ static int xmp_mknod(const char *path, mode_t mode, dev_t rdev) { */ static int xmp_mkdir(const char *path, mode_t mode) { - int res; + int res = -1; res = source_mkdir(path, mode); - if (res == -1) + if (res == -1) { return -errno; + } return 0; } static int xmp_unlink(const char *path) { - int res; + int res = -1; struct process_info pi; struct fuse_context *fc = fuse_get_context(); diff --git a/src/main.c b/src/main.c index bcfbadf..a4b2104 100644 --- a/src/main.c +++ b/src/main.c @@ -10,16 +10,15 @@ See the file LICENSE. */ -#include -#include #define FUSE_USE_VERSION 31 #define _GNU_SOURCE #include - #include #include +#include +#include #include "fuse_operations.h" #include "sourcefs.h" @@ -28,15 +27,25 @@ const char *mountpoint = NULL; int main(int argc, char *argv[]) { + if (argc < 3) { + fprintf(stderr, "Usage: icfs [target directory] [path to " + "the permanent permissions database\n"); + return EXIT_FAILURE; + } + + // if umask != 0, the filesystem will create files with more restrictive + // permissions than it's caller reqested umask(0); - int ret = init_ui_socket(); + // ui socket should always be initialized before anything else, since it + // handles the setuid bits! + int ret = init_ui_socket(argv[argc - 1]); if (ret != 0) { fprintf(stderr, "Could not initalize ui-socket.\n"); exit(EXIT_FAILURE); } - mountpoint = realpath(argv[argc - 1], NULL); + mountpoint = realpath(argv[argc - 2], NULL); ret = source_init(mountpoint); if (ret != 0) { @@ -44,9 +53,9 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - ret = fuse_main(argc, argv, get_fuse_operations(), NULL); + ret = fuse_main(argc - 1, argv, get_fuse_operations(), NULL); - free(mountpoint); + free((void *)mountpoint); destroy_ui_socket(); return ret; } diff --git a/src/ui-socket.c b/src/ui-socket.c index 8c8982f..afbbc27 100644 --- a/src/ui-socket.c +++ b/src/ui-socket.c @@ -22,7 +22,7 @@ #include #include -int init_ui_socket() { +int init_ui_socket(const char *perm_permissions_db_filename) { char line[256]; FILE *fp; @@ -31,8 +31,7 @@ int init_ui_socket() { return 1; } - if (init_perm_permissions_table( - "/home/fedir/Developement/uni/ICFS/test/.pt.db")) { + if (init_perm_permissions_table(perm_permissions_db_filename)) { fprintf(stderr, "Could not initialize permanent permissions table.\n"); return 1; } diff --git a/src/ui-socket.h b/src/ui-socket.h index 6d0ee74..5aa7a4f 100644 --- a/src/ui-socket.h +++ b/src/ui-socket.h @@ -21,7 +21,7 @@ * * @return: 0 on success, -1 on faliure. */ -int init_ui_socket(void); +int init_ui_socket(const char *perm_permissions_db_filename); /** * Close the GUI communication.