From d33f0f36cca7d34d8217986cf44be2caec637123 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 13 Apr 2019 23:09:06 +0200 Subject: [PATCH] moves mountpoint handling into filesystem: mountpoints are removed during session cleanup --- lib/webfuse/adapter/impl/filesystem.c | 88 +++++++++++++++++---------- lib/webfuse/adapter/impl/filesystem.h | 15 +---- lib/webfuse/adapter/impl/operations.h | 1 + lib/webfuse/adapter/impl/session.c | 13 +--- 4 files changed, 62 insertions(+), 55 deletions(-) diff --git a/lib/webfuse/adapter/impl/filesystem.c b/lib/webfuse/adapter/impl/filesystem.c index 22d18bf..75e0f26 100644 --- a/lib/webfuse/adapter/impl/filesystem.c +++ b/lib/webfuse/adapter/impl/filesystem.c @@ -3,6 +3,11 @@ #include "webfuse/adapter/impl/session.h" #include +#include + +#include +#include +#include #include #include @@ -19,36 +24,44 @@ static struct fuse_lowlevel_ops const filesystem_operations = .read = &wf_impl_operation_read }; -struct wf_impl_filesystem * wf_impl_filesystem_create( - struct wf_impl_session * session, - char const * mount_point) +static char * wf_impl_filesystem_create_id(void) { - struct wf_impl_filesystem * filesystem = malloc(sizeof(struct wf_impl_filesystem)); - if (NULL != filesystem) - { - bool success = wf_impl_filesystem_init(filesystem, session, mount_point); - if (!success) - { - free(filesystem); - filesystem = NULL; - } - } + uuid_t uuid; + uuid_generate(uuid); + char id[UUID_STR_LEN]; + uuid_unparse(uuid, id); - return filesystem; + return strdup(id); } -void wf_impl_filesystem_dispose( +static void wf_impl_filesystem_cleanup( struct wf_impl_filesystem * filesystem) { - wf_impl_filesystem_cleanup(filesystem); - free(filesystem); + fuse_session_reset(filesystem->session); + fuse_session_unmount(filesystem->session); + fuse_session_destroy(filesystem->session); + filesystem->session = NULL; + + free(filesystem->buffer.mem); + fuse_opt_free_args(&filesystem->args); + + struct wf_impl_session * session = filesystem->user_data.session; + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s/%s/%s", session->mount_point, filesystem->user_data.name, filesystem->id); + rmdir(path); + + snprintf(path, PATH_MAX, "%s/%s", session->mount_point, filesystem->user_data.name); + rmdir(path); + + free(filesystem->user_data.name); + free(filesystem->id); } -bool wf_impl_filesystem_init( +static bool wf_impl_filesystem_init( struct wf_impl_filesystem * filesystem, struct wf_impl_session * session, - char const * mount_point) + char const * name) { bool result = false; wf_dlist_item_init(&filesystem->item); @@ -60,8 +73,17 @@ bool wf_impl_filesystem_init( filesystem->user_data.session = session; filesystem->user_data.timeout = 1.0; + filesystem->user_data.name = strdup(name); + filesystem->id = wf_impl_filesystem_create_id(); memset(&filesystem->buffer, 0, sizeof(struct fuse_buf)); + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s/%s", session->mount_point, name); + mkdir(path, 0755); + + snprintf(path, PATH_MAX, "%s/%s/%s", session->mount_point, name, filesystem->id); + mkdir(path, 0755); + filesystem->session = fuse_session_new( &filesystem->args, &filesystem_operations, @@ -69,7 +91,7 @@ bool wf_impl_filesystem_init( &filesystem->user_data); if (NULL != filesystem->session) { - result = (0 == fuse_session_mount(filesystem->session, mount_point)); + result = (0 == fuse_session_mount(filesystem->session, path)); } if (result) @@ -90,25 +112,29 @@ bool wf_impl_filesystem_init( return result; } -void wf_impl_filesystem_cleanup( - struct wf_impl_filesystem * filesystem) +struct wf_impl_filesystem * wf_impl_filesystem_create( + struct wf_impl_session * session, + char const * name) { - if (NULL != filesystem->session) + struct wf_impl_filesystem * filesystem = malloc(sizeof(struct wf_impl_filesystem)); + if (NULL != filesystem) { - fuse_session_reset(filesystem->session); - fuse_session_unmount(filesystem->session); - fuse_session_destroy(filesystem->session); - filesystem->session = NULL; + bool success = wf_impl_filesystem_init(filesystem, session, name); + if (!success) + { + free(filesystem); + filesystem = NULL; + } } - free(filesystem->buffer.mem); - fuse_opt_free_args(&filesystem->args); + return filesystem; } -int wf_impl_filesystem_get_fd( +void wf_impl_filesystem_dispose( struct wf_impl_filesystem * filesystem) { - return fuse_session_fd(filesystem->session); + wf_impl_filesystem_cleanup(filesystem); + free(filesystem); } void wf_impl_filesystem_process_request( diff --git a/lib/webfuse/adapter/impl/filesystem.h b/lib/webfuse/adapter/impl/filesystem.h index 7d13b07..4374963 100644 --- a/lib/webfuse/adapter/impl/filesystem.h +++ b/lib/webfuse/adapter/impl/filesystem.h @@ -25,26 +25,17 @@ struct wf_impl_filesystem struct fuse_buf buffer; struct wf_impl_operations_context user_data; struct lws * wsi; + char * name; + char * id; }; extern struct wf_impl_filesystem * wf_impl_filesystem_create( struct wf_impl_session * session, - char const * mount_point); + char const * name); extern void wf_impl_filesystem_dispose( struct wf_impl_filesystem * filesystem); -extern bool wf_impl_filesystem_init( - struct wf_impl_filesystem * filesystem, - struct wf_impl_session * session, - char const * mount_point); - -extern void wf_impl_filesystem_cleanup( - struct wf_impl_filesystem * filesystem); - -extern int wf_impl_filesystem_get_fd( - struct wf_impl_filesystem * filesystem); - extern void wf_impl_filesystem_process_request( struct wf_impl_filesystem * filesystem); diff --git a/lib/webfuse/adapter/impl/operations.h b/lib/webfuse/adapter/impl/operations.h index 5d6d35b..debe4fa 100644 --- a/lib/webfuse/adapter/impl/operations.h +++ b/lib/webfuse/adapter/impl/operations.h @@ -14,6 +14,7 @@ struct wf_impl_operations_context { struct wf_impl_session * session; double timeout; + char * name; }; extern void wf_impl_operation_lookup ( diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index 2aa5ab5..1455de3 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -9,8 +9,6 @@ #include "webfuse/core/container_of.h" #include "webfuse/core/util.h" -#include - #include #include #include @@ -103,16 +101,7 @@ bool wf_impl_session_add_filesystem( struct wf_impl_session * session, char const * name) { - uuid_t uuid; - uuid_generate(uuid); - char id[UUID_STR_LEN]; - uuid_unparse(uuid, id); - - char mount_point[PATH_MAX]; - snprintf(mount_point, PATH_MAX, "%s/%s/%s", session->mount_point, name, id); - mkdir(mount_point, 0755); - - struct wf_impl_filesystem * filesystem = wf_impl_filesystem_create(session, mount_point); + struct wf_impl_filesystem * filesystem = wf_impl_filesystem_create(session, name); wf_dlist_prepend(&session->filesystems, &filesystem->item); return (NULL != filesystem); }