1
0
mirror of https://github.com/falk-werner/webfuse synced 2025-06-13 12:54:15 +00:00

moves mountpoint handling into filesystem: mountpoints are removed during session cleanup

This commit is contained in:
Falk Werner 2019-04-13 23:09:06 +02:00
parent 1b15f30f2f
commit d33f0f36cc
4 changed files with 62 additions and 55 deletions

View File

@ -3,6 +3,11 @@
#include "webfuse/adapter/impl/session.h" #include "webfuse/adapter/impl/session.h"
#include <libwebsockets.h> #include <libwebsockets.h>
#include <uuid/uuid.h>
#include <sys/stat.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h> #include <stdlib.h>
#include <stddef.h> #include <stddef.h>
@ -19,36 +24,44 @@ static struct fuse_lowlevel_ops const filesystem_operations =
.read = &wf_impl_operation_read .read = &wf_impl_operation_read
}; };
struct wf_impl_filesystem * wf_impl_filesystem_create( static char * wf_impl_filesystem_create_id(void)
struct wf_impl_session * session,
char const * mount_point)
{ {
struct wf_impl_filesystem * filesystem = malloc(sizeof(struct wf_impl_filesystem)); uuid_t uuid;
if (NULL != filesystem) uuid_generate(uuid);
{ char id[UUID_STR_LEN];
bool success = wf_impl_filesystem_init(filesystem, session, mount_point); uuid_unparse(uuid, id);
if (!success)
{ return strdup(id);
free(filesystem);
filesystem = NULL;
}
} }
return filesystem; static void wf_impl_filesystem_cleanup(
}
void wf_impl_filesystem_dispose(
struct wf_impl_filesystem * filesystem) struct wf_impl_filesystem * filesystem)
{ {
wf_impl_filesystem_cleanup(filesystem); fuse_session_reset(filesystem->session);
free(filesystem); 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_filesystem * filesystem,
struct wf_impl_session * session, struct wf_impl_session * session,
char const * mount_point) char const * name)
{ {
bool result = false; bool result = false;
wf_dlist_item_init(&filesystem->item); wf_dlist_item_init(&filesystem->item);
@ -60,8 +73,17 @@ bool wf_impl_filesystem_init(
filesystem->user_data.session = session; filesystem->user_data.session = session;
filesystem->user_data.timeout = 1.0; 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)); 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->session = fuse_session_new(
&filesystem->args, &filesystem->args,
&filesystem_operations, &filesystem_operations,
@ -69,7 +91,7 @@ bool wf_impl_filesystem_init(
&filesystem->user_data); &filesystem->user_data);
if (NULL != filesystem->session) if (NULL != filesystem->session)
{ {
result = (0 == fuse_session_mount(filesystem->session, mount_point)); result = (0 == fuse_session_mount(filesystem->session, path));
} }
if (result) if (result)
@ -90,25 +112,29 @@ bool wf_impl_filesystem_init(
return result; return result;
} }
void wf_impl_filesystem_cleanup( struct wf_impl_filesystem * wf_impl_filesystem_create(
struct wf_impl_filesystem * filesystem) 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); bool success = wf_impl_filesystem_init(filesystem, session, name);
fuse_session_unmount(filesystem->session); if (!success)
fuse_session_destroy(filesystem->session); {
filesystem->session = NULL; free(filesystem);
filesystem = NULL;
}
} }
free(filesystem->buffer.mem); return filesystem;
fuse_opt_free_args(&filesystem->args);
} }
int wf_impl_filesystem_get_fd( void wf_impl_filesystem_dispose(
struct wf_impl_filesystem * filesystem) struct wf_impl_filesystem * filesystem)
{ {
return fuse_session_fd(filesystem->session); wf_impl_filesystem_cleanup(filesystem);
free(filesystem);
} }
void wf_impl_filesystem_process_request( void wf_impl_filesystem_process_request(

View File

@ -25,26 +25,17 @@ struct wf_impl_filesystem
struct fuse_buf buffer; struct fuse_buf buffer;
struct wf_impl_operations_context user_data; struct wf_impl_operations_context user_data;
struct lws * wsi; struct lws * wsi;
char * name;
char * id;
}; };
extern struct wf_impl_filesystem * wf_impl_filesystem_create( extern struct wf_impl_filesystem * wf_impl_filesystem_create(
struct wf_impl_session * session, struct wf_impl_session * session,
char const * mount_point); char const * name);
extern void wf_impl_filesystem_dispose( extern void wf_impl_filesystem_dispose(
struct wf_impl_filesystem * filesystem); 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( extern void wf_impl_filesystem_process_request(
struct wf_impl_filesystem * filesystem); struct wf_impl_filesystem * filesystem);

View File

@ -14,6 +14,7 @@ struct wf_impl_operations_context
{ {
struct wf_impl_session * session; struct wf_impl_session * session;
double timeout; double timeout;
char * name;
}; };
extern void wf_impl_operation_lookup ( extern void wf_impl_operation_lookup (

View File

@ -9,8 +9,6 @@
#include "webfuse/core/container_of.h" #include "webfuse/core/container_of.h"
#include "webfuse/core/util.h" #include "webfuse/core/util.h"
#include <uuid/uuid.h>
#include <libwebsockets.h> #include <libwebsockets.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
@ -103,16 +101,7 @@ bool wf_impl_session_add_filesystem(
struct wf_impl_session * session, struct wf_impl_session * session,
char const * name) char const * name)
{ {
uuid_t uuid; struct wf_impl_filesystem * filesystem = wf_impl_filesystem_create(session, name);
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);
wf_dlist_prepend(&session->filesystems, &filesystem->item); wf_dlist_prepend(&session->filesystems, &filesystem->item);
return (NULL != filesystem); return (NULL != filesystem);
} }