From 36fcc8458892b8742340a88da10dbe0983b347de Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 30 Mar 2019 23:49:28 +0100 Subject: [PATCH 1/2] moves server into session --- CMakeLists.txt | 2 +- lib/webfuse/adapter/impl/filesystem.c | 4 +- lib/webfuse/adapter/impl/filesystem.h | 4 +- lib/webfuse/adapter/impl/jsonrpc/method.c | 28 ---- lib/webfuse/adapter/impl/jsonrpc/method.h | 31 ----- .../adapter/impl/jsonrpc/method_intern.h | 31 ----- lib/webfuse/adapter/impl/jsonrpc/server.c | 122 ++++++------------ lib/webfuse/adapter/impl/jsonrpc/server.h | 30 +++-- lib/webfuse/adapter/impl/operation/close.c | 10 +- lib/webfuse/adapter/impl/operation/getattr.c | 21 ++- lib/webfuse/adapter/impl/operation/lookup.c | 21 ++- lib/webfuse/adapter/impl/operation/open.c | 11 +- lib/webfuse/adapter/impl/operation/read.c | 15 ++- lib/webfuse/adapter/impl/operation/readdir.c | 10 +- lib/webfuse/adapter/impl/operations.c | 20 +++ lib/webfuse/adapter/impl/operations.h | 8 +- lib/webfuse/adapter/impl/server_protocol.c | 28 +--- lib/webfuse/adapter/impl/session.c | 69 +++++----- lib/webfuse/adapter/impl/session.h | 11 +- lib/webfuse/adapter/impl/session_manager.c | 21 ++- lib/webfuse/adapter/impl/session_manager.h | 8 +- 21 files changed, 220 insertions(+), 285 deletions(-) delete mode 100644 lib/webfuse/adapter/impl/jsonrpc/method.c delete mode 100644 lib/webfuse/adapter/impl/jsonrpc/method.h delete mode 100644 lib/webfuse/adapter/impl/jsonrpc/method_intern.h create mode 100644 lib/webfuse/adapter/impl/operations.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 08cc332..271ee03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,7 @@ add_library(webfuse-adapter-static STATIC lib/webfuse/adapter/impl/authenticator.c lib/webfuse/adapter/impl/authenticators.c lib/webfuse/adapter/impl/credentials.c + lib/webfuse/adapter/impl/operations.c lib/webfuse/adapter/impl/time/timepoint.c lib/webfuse/adapter/impl/time/timer.c lib/webfuse/adapter/impl/time/timeout_manager.c @@ -84,7 +85,6 @@ add_library(webfuse-adapter-static STATIC lib/webfuse/adapter/impl/operation/close.c lib/webfuse/adapter/impl/operation/read.c lib/webfuse/adapter/impl/jsonrpc/server.c - lib/webfuse/adapter/impl/jsonrpc/method.c lib/webfuse/adapter/impl/jsonrpc/request.c lib/webfuse/adapter/impl/jsonrpc/response.c lib/webfuse/adapter/impl/jsonrpc/util.c diff --git a/lib/webfuse/adapter/impl/filesystem.c b/lib/webfuse/adapter/impl/filesystem.c index 2e9cce9..4edbc11 100644 --- a/lib/webfuse/adapter/impl/filesystem.c +++ b/lib/webfuse/adapter/impl/filesystem.c @@ -19,7 +19,7 @@ static struct fuse_lowlevel_ops const filesystem_operations = bool wf_impl_filesystem_init( struct wf_impl_filesystem * filesystem, - struct wf_impl_jsonrpc_server * rpc, + struct wf_impl_session_manager * session_manager, char * mount_point) { bool result = false; @@ -29,7 +29,7 @@ bool wf_impl_filesystem_init( filesystem->args.argv = argv; filesystem->args.allocated = 0; - filesystem->user_data.rpc = rpc; + filesystem->user_data.session_manager = session_manager; filesystem->user_data.timeout = 1.0; memset(&filesystem->buffer, 0, sizeof(struct fuse_buf)); diff --git a/lib/webfuse/adapter/impl/filesystem.h b/lib/webfuse/adapter/impl/filesystem.h index 0a3adad..af07c32 100644 --- a/lib/webfuse/adapter/impl/filesystem.h +++ b/lib/webfuse/adapter/impl/filesystem.h @@ -13,7 +13,7 @@ extern "C" { #endif -struct wf_impl_jsonrpc_server; +struct wf_impl_session_manager; struct wf_impl_filesystem { @@ -25,7 +25,7 @@ struct wf_impl_filesystem extern bool wf_impl_filesystem_init( struct wf_impl_filesystem * filesystem, - struct wf_impl_jsonrpc_server * rpc, + struct wf_impl_session_manager * session_manager, char * mount_point); extern void wf_impl_filesystem_cleanup( diff --git a/lib/webfuse/adapter/impl/jsonrpc/method.c b/lib/webfuse/adapter/impl/jsonrpc/method.c deleted file mode 100644 index ddc7df5..0000000 --- a/lib/webfuse/adapter/impl/jsonrpc/method.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "webfuse/adapter/impl/jsonrpc/method_intern.h" - -#include -#include - -struct wf_impl_jsonrpc_method * wf_impl_jsonrpc_method_create( - char const * name, - wf_impl_jsonrpc_method_invoke_fn * invoke, - void * user_data) -{ - struct wf_impl_jsonrpc_method * method = malloc(sizeof(struct wf_impl_jsonrpc_method)); - if (NULL != method) - { - method->next = NULL; - method->name = strdup(name); - method->invoke = invoke; - method->user_data = user_data; - } - - return method; -} - -void wf_impl_jsonrpc_method_dispose( - struct wf_impl_jsonrpc_method * method) -{ - free(method->name); - free(method); -} diff --git a/lib/webfuse/adapter/impl/jsonrpc/method.h b/lib/webfuse/adapter/impl/jsonrpc/method.h deleted file mode 100644 index f102f60..0000000 --- a/lib/webfuse/adapter/impl/jsonrpc/method.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef WF_ADAPTER_IMPL_JSONRPC_METHOD_H -#define WF_ADAPTER_IMPL_JSONRPC_METHOD_H - -#ifndef __cplusplus -#include -#endif - -#include -#include "webfuse/core/status.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -typedef bool wf_impl_jsonrpc_method_invoke_fn( - void * user_data, - struct json_t const * method_call); - -typedef void wf_impl_jsonrpc_method_finished_fn( - void * user_data, - wf_status status, - struct json_t const * result); - -#ifdef __cplusplus -} -#endif - - - -#endif diff --git a/lib/webfuse/adapter/impl/jsonrpc/method_intern.h b/lib/webfuse/adapter/impl/jsonrpc/method_intern.h deleted file mode 100644 index 0a1190d..0000000 --- a/lib/webfuse/adapter/impl/jsonrpc/method_intern.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef WF_ADAPTER_IMPL_JSONRPC_METHOD_INTERN_H -#define WF_ADAPTER_IMPL_JSONRPC_METHOD_INTERN_H - -#include "webfuse/adapter/impl/jsonrpc/method.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wf_impl_jsonrpc_method -{ - struct wf_impl_jsonrpc_method * next; - char * name; - wf_impl_jsonrpc_method_invoke_fn * invoke; - void * user_data; -}; - -extern struct wf_impl_jsonrpc_method * wf_impl_jsonrpc_method_create( - char const * name, - wf_impl_jsonrpc_method_invoke_fn * invoke, - void * user_data); - -extern void wf_impl_jsonrpc_method_dispose( - struct wf_impl_jsonrpc_method * method); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/adapter/impl/jsonrpc/server.c b/lib/webfuse/adapter/impl/jsonrpc/server.c index 613e27d..71b92aa 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/server.c +++ b/lib/webfuse/adapter/impl/jsonrpc/server.c @@ -1,25 +1,11 @@ #include "webfuse/adapter/impl/jsonrpc/server.h" #include -#include "webfuse/adapter/impl/jsonrpc/method_intern.h" #include "webfuse/adapter/impl/jsonrpc/request.h" #include "webfuse/adapter/impl/jsonrpc/response.h" #define WF_DEFAULT_TIMEOUT (10 * 1000) -static struct wf_impl_jsonrpc_method const * wf_impl_jsonrpc_server_getmethod( - struct wf_impl_jsonrpc_server * server, - char const * name) -{ - struct wf_impl_jsonrpc_method * method = server->methods; - while ((NULL != method) && (0 == strcmp(name, method->name))) - { - method = method->next; - } - - return method; -} - static void wf_impl_jsonrpc_server_timeout( struct wf_impl_timer * timer) { @@ -27,7 +13,7 @@ static void wf_impl_jsonrpc_server_timeout( if (server->request.is_pending) { - wf_impl_jsonrpc_method_finished_fn * finished = server->request.finished; + wf_impl_jsonrpc_server_finished_fn * finished = server->request.finished; void * user_data = server->request.user_data; server->request.is_pending = false; @@ -42,9 +28,12 @@ static void wf_impl_jsonrpc_server_timeout( void wf_impl_jsonrpc_server_init( struct wf_impl_jsonrpc_server * server, - struct wf_impl_timeout_manager * timeout_manager) + struct wf_impl_timeout_manager * timeout_manager, + wf_impl_jsonrpc_server_send_fn * send, + void * user_data) { - server->methods = NULL; + server->send = send; + server->user_data = user_data; server->request.is_pending = false; wf_impl_timer_init(&server->request.timer, timeout_manager); @@ -60,32 +49,11 @@ void wf_impl_jsonrpc_server_cleanup( server->request.finished(server->request.user_data, WF_BAD, NULL); server->request.is_pending = false; } - - struct wf_impl_jsonrpc_method * method = server->methods; - while (NULL != method) - { - struct wf_impl_jsonrpc_method * next = method->next; - method->next = NULL; - wf_impl_jsonrpc_method_dispose(method); - method = next; - } - server->methods = NULL; -} - -void wf_impl_jsonrpc_server_add( - struct wf_impl_jsonrpc_server * server, - char const * name, - wf_impl_jsonrpc_method_invoke_fn * invoke, - void * user_data) -{ - struct wf_impl_jsonrpc_method * method = wf_impl_jsonrpc_method_create(name, invoke, user_data); - method->next = server->methods; - server->methods = method; } void wf_impl_jsonrpc_server_invoke( struct wf_impl_jsonrpc_server * server, - wf_impl_jsonrpc_method_finished_fn * finished, + wf_impl_jsonrpc_server_finished_fn * finished, void * user_data, char const * method_name, char const * param_info, @@ -94,39 +62,31 @@ void wf_impl_jsonrpc_server_invoke( { if (!server->request.is_pending) { - struct wf_impl_jsonrpc_method const * method = wf_impl_jsonrpc_server_getmethod(server, method_name); - if (NULL != method) + server->request.is_pending = true; + server->request.finished = finished; + server->request.user_data = user_data; + server->request.id = 42; + wf_impl_timer_start(&server->request.timer, wf_impl_timepoint_in_msec(WF_DEFAULT_TIMEOUT), + &wf_impl_jsonrpc_server_timeout, server); + + va_list args; + va_start(args, param_info); + json_t * request = wf_impl_jsonrpc_request_create(method_name, server->request.id, param_info, args); + va_end(args); + if (NULL != request) { - server->request.is_pending = true; - server->request.finished = finished; - server->request.user_data = user_data; - server->request.id = 42; - wf_impl_timer_start(&server->request.timer, wf_impl_timepoint_in_msec(WF_DEFAULT_TIMEOUT), - &wf_impl_jsonrpc_server_timeout, server); - - va_list args; - va_start(args, param_info); - json_t * request = wf_impl_jsonrpc_request_create(method_name, server->request.id, param_info, args); - va_end(args); - if (NULL != request) + if (!server->send(request, server->user_data)) { - if (!method->invoke(method->user_data, request)) - { - server->request.is_pending = false; - server->request.finished = NULL; - server->request.user_data = NULL; - server->request.id = 0; - wf_impl_timer_cancel(&server->request.timer); + server->request.is_pending = false; + server->request.finished = NULL; + server->request.user_data = NULL; + server->request.id = 0; + wf_impl_timer_cancel(&server->request.timer); - finished(user_data, WF_BAD, NULL); - } - json_decref(request); + finished(user_data, WF_BAD, NULL); } + json_decref(request); } - else - { - finished(user_data, WF_BAD_NOTIMPLEMENTED, NULL); - } } else { @@ -140,22 +100,16 @@ extern void wf_impl_jsonrpc_server_notify( char const * param_info, ... ) -{ - struct wf_impl_jsonrpc_method const * method = wf_impl_jsonrpc_server_getmethod(server, method_name); - if (NULL != method) - { - - va_list args; - va_start(args, param_info); - json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args); - va_end(args); - if (NULL != request) - { - method->invoke(method->user_data, request); - json_decref(request); - } - } - +{ + va_list args; + va_start(args, param_info); + json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args); + va_end(args); + if (NULL != request) + { + server->send(request, server->user_data); + json_decref(request); + } } @@ -169,7 +123,7 @@ void wf_impl_jsonrpc_server_onresult( if ((server->request.is_pending) && (response.id == server->request.id)) { - wf_impl_jsonrpc_method_finished_fn * finished = server->request.finished; + wf_impl_jsonrpc_server_finished_fn * finished = server->request.finished; void * user_data = server->request.user_data; server->request.is_pending = false; diff --git a/lib/webfuse/adapter/impl/jsonrpc/server.h b/lib/webfuse/adapter/impl/jsonrpc/server.h index e5e53cb..1bb56b9 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/server.h +++ b/lib/webfuse/adapter/impl/jsonrpc/server.h @@ -12,18 +12,29 @@ using std::size_t; #endif #include -#include "webfuse/adapter/impl/jsonrpc/method.h" #include "webfuse/adapter/impl/time/timeout_manager.h" #include "webfuse/adapter/impl/time/timer.h" +#include "webfuse/core/status.h" #ifdef __cplusplus extern "C" { #endif +typedef bool wf_impl_jsonrpc_server_send_fn( + json_t * request, + void * user_data); + + +typedef void wf_impl_jsonrpc_server_finished_fn( + void * user_data, + wf_status status, + struct json_t const * result); + + struct wf_impl_jsonrpc_request { bool is_pending; - wf_impl_jsonrpc_method_finished_fn * finished; + wf_impl_jsonrpc_server_finished_fn * finished; void * user_data; int id; struct wf_impl_timer timer; @@ -31,26 +42,23 @@ struct wf_impl_jsonrpc_request struct wf_impl_jsonrpc_server { - struct wf_impl_jsonrpc_method * methods; struct wf_impl_jsonrpc_request request; + wf_impl_jsonrpc_server_send_fn * send; + void * user_data; }; extern void wf_impl_jsonrpc_server_init( struct wf_impl_jsonrpc_server * server, - struct wf_impl_timeout_manager * manager); + struct wf_impl_timeout_manager * manager, + wf_impl_jsonrpc_server_send_fn * send, + void * user_data); extern void wf_impl_jsonrpc_server_cleanup( struct wf_impl_jsonrpc_server * server); -extern void wf_impl_jsonrpc_server_add( - struct wf_impl_jsonrpc_server * server, - char const * name, - wf_impl_jsonrpc_method_invoke_fn * invoke, - void * user_data ); - extern void wf_impl_jsonrpc_server_invoke( struct wf_impl_jsonrpc_server * server, - wf_impl_jsonrpc_method_finished_fn * finished, + wf_impl_jsonrpc_server_finished_fn * finished, void * user_data, char const * method_name, char const * param_info, diff --git a/lib/webfuse/adapter/impl/operation/close.c b/lib/webfuse/adapter/impl/operation/close.c index fcf0645..f46e641 100644 --- a/lib/webfuse/adapter/impl/operation/close.c +++ b/lib/webfuse/adapter/impl/operation/close.c @@ -13,9 +13,13 @@ void wf_impl_operation_close( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); - int handle = (int) (file_info->fh & INT_MAX); - wf_impl_jsonrpc_server_notify(rpc, "close", "iii", inode, handle, file_info->flags); + if (NULL != rpc) + { + int handle = (int) (file_info->fh & INT_MAX); + wf_impl_jsonrpc_server_notify(rpc, "close", "iii", inode, handle, file_info->flags); + } + fuse_reply_err(request, 0); } diff --git a/lib/webfuse/adapter/impl/operation/getattr.c b/lib/webfuse/adapter/impl/operation/getattr.c index 6a3c359..16e886b 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.c +++ b/lib/webfuse/adapter/impl/operation/getattr.c @@ -81,13 +81,20 @@ void wf_impl_operation_getattr ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); - struct wf_impl_operation_getattr_context * getattr_context = malloc(sizeof(struct wf_impl_operation_getattr_context)); - getattr_context->request = request; - getattr_context->uid = context->uid; - getattr_context->gid = context->gid; - getattr_context->timeout = user_data->timeout; + if (NULL != rpc) + { + struct wf_impl_operation_getattr_context * getattr_context = malloc(sizeof(struct wf_impl_operation_getattr_context)); + getattr_context->request = request; + getattr_context->uid = context->uid; + getattr_context->gid = context->gid; + getattr_context->timeout = user_data->timeout; - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "i", inode); + wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "i", inode); + } + else + { + fuse_reply_err(request, ENOENT); + } } diff --git a/lib/webfuse/adapter/impl/operation/lookup.c b/lib/webfuse/adapter/impl/operation/lookup.c index 321be8a..4646974 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.c +++ b/lib/webfuse/adapter/impl/operation/lookup.c @@ -90,13 +90,20 @@ void wf_impl_operation_lookup ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, parent); - struct wf_impl_operation_lookup_context * lookup_context = malloc(sizeof(struct wf_impl_operation_lookup_context)); - lookup_context->request = request; - lookup_context->uid = context->uid; - lookup_context->gid = context->gid; - lookup_context->timeout = user_data->timeout; + if (NULL != rpc) + { + struct wf_impl_operation_lookup_context * lookup_context = malloc(sizeof(struct wf_impl_operation_lookup_context)); + lookup_context->request = request; + lookup_context->uid = context->uid; + lookup_context->gid = context->gid; + lookup_context->timeout = user_data->timeout; - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "is", (int) (parent & INT_MAX), name); + wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "is", (int) (parent & INT_MAX), name); + } + else + { + fuse_reply_err(request, ENOENT); + } } diff --git a/lib/webfuse/adapter/impl/operation/open.c b/lib/webfuse/adapter/impl/operation/open.c index b9e78d4..c98d21a 100644 --- a/lib/webfuse/adapter/impl/operation/open.c +++ b/lib/webfuse/adapter/impl/operation/open.c @@ -47,7 +47,14 @@ void wf_impl_operation_open( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "ii", inode, file_info->flags); + if (NULL != rpc) + { + wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "ii", inode, file_info->flags); + } + else + { + fuse_reply_err(request, ENOENT); + } } diff --git a/lib/webfuse/adapter/impl/operation/read.c b/lib/webfuse/adapter/impl/operation/read.c index 7be1b01..a828ac1 100644 --- a/lib/webfuse/adapter/impl/operation/read.c +++ b/lib/webfuse/adapter/impl/operation/read.c @@ -87,9 +87,16 @@ void wf_impl_operation_read( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); - int const length = (size <= WF_MAX_READ_LENGTH) ? (int) size : WF_MAX_READ_LENGTH; - int handle = (file_info->fh & INT_MAX); - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "iiii", inode, handle, (int) offset, length); + if (NULL != rpc) + { + int const length = (size <= WF_MAX_READ_LENGTH) ? (int) size : WF_MAX_READ_LENGTH; + int handle = (file_info->fh & INT_MAX); + wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "iiii", inode, handle, (int) offset, length); + } + else + { + fuse_reply_err(request, ENOENT); + } } diff --git a/lib/webfuse/adapter/impl/operation/readdir.c b/lib/webfuse/adapter/impl/operation/readdir.c index 8c027ee..634e467 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.c +++ b/lib/webfuse/adapter/impl/operation/readdir.c @@ -137,11 +137,19 @@ void wf_impl_operation_readdir ( struct fuse_file_info * WF_UNUSED_PARAM(file_info)) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = user_data->rpc; + struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + + if (NULL != rpc) + { struct wf_impl_operation_readdir_context * readdir_context = malloc(sizeof(struct wf_impl_operation_readdir_context)); readdir_context->request = request; readdir_context->size = size; readdir_context->offset = offset; wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "i", inode); + } + else + { + fuse_reply_err(request, ENOENT); + } } diff --git a/lib/webfuse/adapter/impl/operations.c b/lib/webfuse/adapter/impl/operations.c new file mode 100644 index 0000000..8139d5c --- /dev/null +++ b/lib/webfuse/adapter/impl/operations.c @@ -0,0 +1,20 @@ +#include "webfuse/adapter/impl/operations.h" +#include "webfuse/adapter/impl/session_manager.h" +#include "webfuse/adapter/impl/session.h" +#include + +struct wf_impl_jsonrpc_server * wf_impl_operations_context_get_server( + struct wf_impl_operations_context * context, + fuse_ino_t inode) +{ + struct wf_impl_jsonrpc_server * server = NULL; + + struct wf_impl_session_manager * session_manger = context->session_manager; + struct wf_impl_session * session = wf_impl_session_manager_get_by_inode(session_manger, inode); + if (NULL != session) + { + server = &session->rpc; + } + + return server; +} diff --git a/lib/webfuse/adapter/impl/operations.h b/lib/webfuse/adapter/impl/operations.h index 74875ae..08da67c 100644 --- a/lib/webfuse/adapter/impl/operations.h +++ b/lib/webfuse/adapter/impl/operations.h @@ -7,11 +7,11 @@ extern "C" { #endif -struct wf_impl_jsonrpc_server; +struct wf_impl_session_manager; struct wf_impl_operations_context { - struct wf_impl_jsonrpc_server * rpc; + struct wf_impl_session_manager * session_manager; double timeout; }; @@ -47,6 +47,10 @@ extern void wf_impl_operation_read( fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi); +extern struct wf_impl_jsonrpc_server * wf_impl_operations_context_get_server( + struct wf_impl_operations_context * context, + fuse_ino_t inode); + #ifdef __cplusplus } #endif diff --git a/lib/webfuse/adapter/impl/server_protocol.c b/lib/webfuse/adapter/impl/server_protocol.c index 2d817ab..e4666e1 100644 --- a/lib/webfuse/adapter/impl/server_protocol.c +++ b/lib/webfuse/adapter/impl/server_protocol.c @@ -38,7 +38,7 @@ static int wf_impl_server_protocol_callback( &protocol->session_manager, wsi, &protocol->authenticators, - &protocol->rpc); + &protocol->timeout_manager); if (NULL != session) { @@ -70,20 +70,6 @@ static int wf_impl_server_protocol_callback( return 0; } -static bool wf_impl_server_protocol_invoke( - void * user_data, - json_t const * request) -{ - struct wf_server_protocol * protocol = user_data; - struct wf_impl_session * session = &protocol->session_manager.session; - struct wf_message * message = wf_message_create(request); - - bool const result = wf_impl_session_send(session, message); - - return result; -} - - struct wf_server_protocol * wf_impl_server_protocol_create( char * mount_point) { @@ -124,20 +110,11 @@ bool wf_impl_server_protocol_init( wf_impl_session_manager_init(&protocol->session_manager); wf_impl_authenticators_init(&protocol->authenticators); - wf_impl_jsonrpc_server_init(&protocol->rpc, &protocol->timeout_manager); - wf_impl_jsonrpc_server_add(&protocol->rpc, "lookup", &wf_impl_server_protocol_invoke, protocol); - wf_impl_jsonrpc_server_add(&protocol->rpc, "getattr", &wf_impl_server_protocol_invoke, protocol); - wf_impl_jsonrpc_server_add(&protocol->rpc, "readdir", &wf_impl_server_protocol_invoke, protocol); - wf_impl_jsonrpc_server_add(&protocol->rpc, "open", &wf_impl_server_protocol_invoke, protocol); - wf_impl_jsonrpc_server_add(&protocol->rpc, "close", &wf_impl_server_protocol_invoke, protocol); - wf_impl_jsonrpc_server_add(&protocol->rpc, "read", &wf_impl_server_protocol_invoke, protocol); - - bool const success = wf_impl_filesystem_init(&protocol->filesystem, &protocol->rpc, mount_point); + bool const success = wf_impl_filesystem_init(&protocol->filesystem, &protocol->session_manager, mount_point); // cleanup on error if (!success) { - wf_impl_jsonrpc_server_cleanup(&protocol->rpc); wf_impl_authenticators_cleanup(&protocol->authenticators); wf_impl_timeout_manager_cleanup(&protocol->timeout_manager); wf_impl_session_manager_cleanup(&protocol->session_manager); @@ -150,7 +127,6 @@ void wf_impl_server_protocol_cleanup( struct wf_server_protocol * protocol) { wf_impl_filesystem_cleanup(&protocol->filesystem); - wf_impl_jsonrpc_server_cleanup(&protocol->rpc); wf_impl_timeout_manager_cleanup(&protocol->timeout_manager); wf_impl_authenticators_cleanup(&protocol->authenticators); wf_impl_session_manager_cleanup(&protocol->session_manager); diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index 101a950..2918d72 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -7,40 +7,13 @@ #include #include -void wf_impl_session_init( - struct wf_impl_session * session, - struct lws * wsi, - struct wf_impl_authenticators * authenticators, - struct wf_impl_jsonrpc_server * rpc) - { - session->wsi = wsi; - session->is_authenticated = false; - session->authenticators = authenticators; - session->rpc = rpc; - wf_message_queue_init(&session->queue); - } - -void wf_impl_session_cleanup( - struct wf_impl_session * session) +static bool wf_impl_session_send( + json_t * request, + void * user_data) { - wf_message_queue_cleanup(&session->queue); - session->is_authenticated = false; - session->wsi = NULL; - session->authenticators = NULL; - session->rpc = NULL; -} + struct wf_impl_session * session = user_data; + struct wf_message * message = wf_message_create(request); -void wf_impl_session_authenticate( - struct wf_impl_session * session, - struct wf_credentials * creds) -{ - session->is_authenticated = wf_impl_authenticators_authenticate(session->authenticators, creds); -} - -bool wf_impl_session_send( - struct wf_impl_session * session, - struct wf_message * message) -{ bool result = (session->is_authenticated) && (NULL != session->wsi); if (result) @@ -58,6 +31,36 @@ bool wf_impl_session_send( return result; } +void wf_impl_session_init( + struct wf_impl_session * session, + struct lws * wsi, + struct wf_impl_authenticators * authenticators, + struct wf_impl_timeout_manager * timeout_manager) + { + session->wsi = wsi; + session->is_authenticated = false; + session->authenticators = authenticators; + wf_impl_jsonrpc_server_init(&session->rpc, timeout_manager, &wf_impl_session_send, session); + wf_message_queue_init(&session->queue); + } + +void wf_impl_session_cleanup( + struct wf_impl_session * session) +{ + wf_impl_jsonrpc_server_cleanup(&session->rpc); + wf_message_queue_cleanup(&session->queue); + session->is_authenticated = false; + session->wsi = NULL; + session->authenticators = NULL; +} + +void wf_impl_session_authenticate( + struct wf_impl_session * session, + struct wf_credentials * creds) +{ + session->is_authenticated = wf_impl_authenticators_authenticate(session->authenticators, creds); +} + void wf_impl_session_onwritable( struct wf_impl_session * session) { @@ -80,5 +83,5 @@ void wf_impl_session_receive( char const * data, size_t length) { - wf_impl_jsonrpc_server_onresult(session->rpc, data, length); + wf_impl_jsonrpc_server_onresult(&session->rpc, data, length); } \ No newline at end of file diff --git a/lib/webfuse/adapter/impl/session.h b/lib/webfuse/adapter/impl/session.h index 598c551..79388ec 100644 --- a/lib/webfuse/adapter/impl/session.h +++ b/lib/webfuse/adapter/impl/session.h @@ -10,6 +10,7 @@ using std::size_t; #endif #include "webfuse/core/message_queue.h" +#include "webfuse/adapter/impl/jsonrpc/server.h" #ifdef __cplusplus extern "C" @@ -20,7 +21,7 @@ struct lws; struct wf_message; struct wf_credentials; struct wf_impl_authenticators; -struct wf_impl_jsonrpc_server; +struct wf_impl_timeout_manager; struct wf_impl_session { @@ -28,23 +29,19 @@ struct wf_impl_session bool is_authenticated; struct wf_message_queue queue; struct wf_impl_authenticators * authenticators; - struct wf_impl_jsonrpc_server * rpc; + struct wf_impl_jsonrpc_server rpc; }; extern void wf_impl_session_init( struct wf_impl_session * session, struct lws * wsi, struct wf_impl_authenticators * authenticators, - struct wf_impl_jsonrpc_server * rpc); + struct wf_impl_timeout_manager * timeout_manager); extern void wf_impl_session_authenticate( struct wf_impl_session * session, struct wf_credentials * creds); -extern bool wf_impl_session_send( - struct wf_impl_session * session, - struct wf_message * message); - extern void wf_impl_session_receive( struct wf_impl_session * session, char const * data, diff --git a/lib/webfuse/adapter/impl/session_manager.c b/lib/webfuse/adapter/impl/session_manager.c index e1f61c2..3883a71 100644 --- a/lib/webfuse/adapter/impl/session_manager.c +++ b/lib/webfuse/adapter/impl/session_manager.c @@ -1,4 +1,5 @@ #include "webfuse/adapter/impl/session_manager.h" +#include "webfuse/core/util.h" #include void wf_impl_session_manager_init( @@ -17,13 +18,13 @@ struct wf_impl_session * wf_impl_session_manager_add( struct wf_impl_session_manager * manager, struct lws * wsi, struct wf_impl_authenticators * authenticators, - struct wf_impl_jsonrpc_server * rpc) + struct wf_impl_timeout_manager * timeout_manager) { struct wf_impl_session * session = NULL; if (NULL == manager->session.wsi) { session = &manager->session; - wf_impl_session_init(&manager->session, wsi, authenticators, rpc); + wf_impl_session_init(&manager->session, wsi, authenticators, timeout_manager); } return session; @@ -42,6 +43,22 @@ struct wf_impl_session * wf_impl_session_manager_get( return session; } +struct wf_impl_session * wf_impl_session_manager_get_by_inode( + struct wf_impl_session_manager * manager, + fuse_ino_t WF_UNUSED_PARAM(inode)) +{ + // ToDo: use inode to determine session manager + + struct wf_impl_session * session = NULL; + if (NULL != manager->session.wsi) + { + session = &manager->session; + } + + return session; +} + + void wf_impl_session_manager_remove( struct wf_impl_session_manager * manager, struct lws * wsi) diff --git a/lib/webfuse/adapter/impl/session_manager.h b/lib/webfuse/adapter/impl/session_manager.h index 562d078..3b01304 100644 --- a/lib/webfuse/adapter/impl/session_manager.h +++ b/lib/webfuse/adapter/impl/session_manager.h @@ -6,6 +6,7 @@ #endif #include "webfuse/adapter/impl/session.h" +#include "webfuse/adapter/impl/fuse_wrapper.h" #ifdef __cplusplus extern "C" @@ -13,6 +14,7 @@ extern "C" #endif struct lws; +struct wf_impl_timeout_manager; struct wf_impl_session_manager { @@ -29,12 +31,16 @@ extern struct wf_impl_session * wf_impl_session_manager_add( struct wf_impl_session_manager * manager, struct lws * wsi, struct wf_impl_authenticators * authenticators, - struct wf_impl_jsonrpc_server * rpc); + struct wf_impl_timeout_manager * timeout_manager); extern struct wf_impl_session * wf_impl_session_manager_get( struct wf_impl_session_manager * manager, struct lws * wsi); +extern struct wf_impl_session * wf_impl_session_manager_get_by_inode( + struct wf_impl_session_manager * session_manger, + fuse_ino_t inode); + extern void wf_impl_session_manager_remove( struct wf_impl_session_manager * manager, struct lws * wsi); From 4a90a24500f951501d87004a8fa00bc6794d7a28 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sun, 31 Mar 2019 00:14:09 +0100 Subject: [PATCH 2/2] renames jsonrpc server to jsonrpc proxy --- CMakeLists.txt | 2 +- lib/webfuse/adapter/impl/filesystem.c | 2 +- lib/webfuse/adapter/impl/jsonrpc/proxy.c | 140 ++++++++++++++++++ .../impl/jsonrpc/{server.h => proxy.h} | 38 ++--- lib/webfuse/adapter/impl/jsonrpc/server.c | 140 ------------------ lib/webfuse/adapter/impl/operation/close.c | 6 +- lib/webfuse/adapter/impl/operation/getattr.c | 6 +- lib/webfuse/adapter/impl/operation/lookup.c | 6 +- lib/webfuse/adapter/impl/operation/open.c | 6 +- lib/webfuse/adapter/impl/operation/read.c | 6 +- lib/webfuse/adapter/impl/operation/readdir.c | 6 +- lib/webfuse/adapter/impl/operations.c | 8 +- lib/webfuse/adapter/impl/operations.h | 3 +- lib/webfuse/adapter/impl/server_protocol.h | 4 +- lib/webfuse/adapter/impl/session.c | 8 +- lib/webfuse/adapter/impl/session.h | 4 +- 16 files changed, 193 insertions(+), 192 deletions(-) create mode 100644 lib/webfuse/adapter/impl/jsonrpc/proxy.c rename lib/webfuse/adapter/impl/jsonrpc/{server.h => proxy.h} (53%) delete mode 100644 lib/webfuse/adapter/impl/jsonrpc/server.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 271ee03..84b6fb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,7 +84,7 @@ add_library(webfuse-adapter-static STATIC lib/webfuse/adapter/impl/operation/open.c lib/webfuse/adapter/impl/operation/close.c lib/webfuse/adapter/impl/operation/read.c - lib/webfuse/adapter/impl/jsonrpc/server.c + lib/webfuse/adapter/impl/jsonrpc/proxy.c lib/webfuse/adapter/impl/jsonrpc/request.c lib/webfuse/adapter/impl/jsonrpc/response.c lib/webfuse/adapter/impl/jsonrpc/util.c diff --git a/lib/webfuse/adapter/impl/filesystem.c b/lib/webfuse/adapter/impl/filesystem.c index 4edbc11..0e52b9f 100644 --- a/lib/webfuse/adapter/impl/filesystem.c +++ b/lib/webfuse/adapter/impl/filesystem.c @@ -1,7 +1,7 @@ #include "webfuse/adapter/impl/filesystem.h" #include "webfuse/adapter/impl/operations.h" -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include #include #include #include diff --git a/lib/webfuse/adapter/impl/jsonrpc/proxy.c b/lib/webfuse/adapter/impl/jsonrpc/proxy.c new file mode 100644 index 0000000..2c682ee --- /dev/null +++ b/lib/webfuse/adapter/impl/jsonrpc/proxy.c @@ -0,0 +1,140 @@ +#include "webfuse/adapter/impl/jsonrpc/proxy.h" +#include + +#include "webfuse/adapter/impl/jsonrpc/request.h" +#include "webfuse/adapter/impl/jsonrpc/response.h" + +#define WF_DEFAULT_TIMEOUT (10 * 1000) + +static void wf_impl_jsonrpc_proxy_timeout( + struct wf_impl_timer * timer) +{ + struct wf_impl_jsonrpc_proxy * proxy = timer->user_data; + + if (proxy->request.is_pending) + { + wf_impl_jsonrpc_proxy_finished_fn * finished = proxy->request.finished; + void * user_data = proxy->request.user_data; + + proxy->request.is_pending = false; + proxy->request.id = 0; + proxy->request.user_data = NULL; + proxy->request.finished = NULL; + wf_impl_timer_cancel(&proxy->request.timer); + + finished(user_data, WF_BAD_TIMEOUT, NULL); + } +} + +void wf_impl_jsonrpc_proxy_init( + struct wf_impl_jsonrpc_proxy * proxy, + struct wf_impl_timeout_manager * timeout_manager, + wf_impl_jsonrpc_proxy_send_fn * send, + void * user_data) +{ + proxy->send = send; + proxy->user_data = user_data; + proxy->request.is_pending = false; + + wf_impl_timer_init(&proxy->request.timer, timeout_manager); +} + +void wf_impl_jsonrpc_proxy_cleanup( + struct wf_impl_jsonrpc_proxy * proxy) +{ + wf_impl_timer_cleanup(&proxy->request.timer); + + if (proxy->request.is_pending) + { + proxy->request.finished(proxy->request.user_data, WF_BAD, NULL); + proxy->request.is_pending = false; + } +} + +void wf_impl_jsonrpc_proxy_invoke( + struct wf_impl_jsonrpc_proxy * proxy, + wf_impl_jsonrpc_proxy_finished_fn * finished, + void * user_data, + char const * method_name, + char const * param_info, + ... +) +{ + if (!proxy->request.is_pending) + { + proxy->request.is_pending = true; + proxy->request.finished = finished; + proxy->request.user_data = user_data; + proxy->request.id = 42; + wf_impl_timer_start(&proxy->request.timer, wf_impl_timepoint_in_msec(WF_DEFAULT_TIMEOUT), + &wf_impl_jsonrpc_proxy_timeout, proxy); + + va_list args; + va_start(args, param_info); + json_t * request = wf_impl_jsonrpc_request_create(method_name, proxy->request.id, param_info, args); + va_end(args); + if (NULL != request) + { + if (!proxy->send(request, proxy->user_data)) + { + proxy->request.is_pending = false; + proxy->request.finished = NULL; + proxy->request.user_data = NULL; + proxy->request.id = 0; + wf_impl_timer_cancel(&proxy->request.timer); + + finished(user_data, WF_BAD, NULL); + } + json_decref(request); + } + } + else + { + finished(user_data, WF_BAD_BUSY, NULL); + } +} + +extern void wf_impl_jsonrpc_proxy_notify( + struct wf_impl_jsonrpc_proxy * proxy, + char const * method_name, + char const * param_info, + ... +) +{ + va_list args; + va_start(args, param_info); + json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args); + va_end(args); + if (NULL != request) + { + proxy->send(request, proxy->user_data); + json_decref(request); + } +} + + +void wf_impl_jsonrpc_proxy_onresult( + struct wf_impl_jsonrpc_proxy * proxy, + char const * message, + size_t length) +{ + struct wf_impl_jsonrpc_response response; + wf_impl_jsonrpc_response_init(&response, message, length); + + if ((proxy->request.is_pending) && (response.id == proxy->request.id)) + { + wf_impl_jsonrpc_proxy_finished_fn * finished = proxy->request.finished; + void * user_data = proxy->request.user_data; + + proxy->request.is_pending = false; + proxy->request.id = 0; + proxy->request.user_data = NULL; + proxy->request.finished = NULL; + wf_impl_timer_cancel(&proxy->request.timer); + + finished(user_data, response.status, response.result); + } + + wf_impl_jsonrpc_response_cleanup(&response); +} + diff --git a/lib/webfuse/adapter/impl/jsonrpc/server.h b/lib/webfuse/adapter/impl/jsonrpc/proxy.h similarity index 53% rename from lib/webfuse/adapter/impl/jsonrpc/server.h rename to lib/webfuse/adapter/impl/jsonrpc/proxy.h index 1bb56b9..420fe25 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/server.h +++ b/lib/webfuse/adapter/impl/jsonrpc/proxy.h @@ -1,5 +1,5 @@ -#ifndef WF_ADAPTER_IMPL_JSONRPC_SERVER_H -#define WF_ADAPTER_IMPL_JSONRPC_SERVER_H +#ifndef WF_ADAPTER_IMPL_JSONRPC_PROXY_H +#define WF_ADAPTER_IMPL_JSONRPC_PROXY_H #ifndef __cplusplus #include @@ -20,12 +20,12 @@ using std::size_t; extern "C" { #endif -typedef bool wf_impl_jsonrpc_server_send_fn( +typedef bool wf_impl_jsonrpc_proxy_send_fn( json_t * request, void * user_data); -typedef void wf_impl_jsonrpc_server_finished_fn( +typedef void wf_impl_jsonrpc_proxy_finished_fn( void * user_data, wf_status status, struct json_t const * result); @@ -34,46 +34,46 @@ typedef void wf_impl_jsonrpc_server_finished_fn( struct wf_impl_jsonrpc_request { bool is_pending; - wf_impl_jsonrpc_server_finished_fn * finished; + wf_impl_jsonrpc_proxy_finished_fn * finished; void * user_data; int id; struct wf_impl_timer timer; }; -struct wf_impl_jsonrpc_server +struct wf_impl_jsonrpc_proxy { struct wf_impl_jsonrpc_request request; - wf_impl_jsonrpc_server_send_fn * send; + wf_impl_jsonrpc_proxy_send_fn * send; void * user_data; }; -extern void wf_impl_jsonrpc_server_init( - struct wf_impl_jsonrpc_server * server, +extern void wf_impl_jsonrpc_proxy_init( + struct wf_impl_jsonrpc_proxy * proxy, struct wf_impl_timeout_manager * manager, - wf_impl_jsonrpc_server_send_fn * send, + wf_impl_jsonrpc_proxy_send_fn * send, void * user_data); -extern void wf_impl_jsonrpc_server_cleanup( - struct wf_impl_jsonrpc_server * server); +extern void wf_impl_jsonrpc_proxy_cleanup( + struct wf_impl_jsonrpc_proxy * proxy); -extern void wf_impl_jsonrpc_server_invoke( - struct wf_impl_jsonrpc_server * server, - wf_impl_jsonrpc_server_finished_fn * finished, +extern void wf_impl_jsonrpc_proxy_invoke( + struct wf_impl_jsonrpc_proxy * proxy, + wf_impl_jsonrpc_proxy_finished_fn * finished, void * user_data, char const * method_name, char const * param_info, ... ); -extern void wf_impl_jsonrpc_server_notify( - struct wf_impl_jsonrpc_server * server, +extern void wf_impl_jsonrpc_proxy_notify( + struct wf_impl_jsonrpc_proxy * proxy, char const * method_name, char const * param_info, ... ); -extern void wf_impl_jsonrpc_server_onresult( - struct wf_impl_jsonrpc_server * server, +extern void wf_impl_jsonrpc_proxy_onresult( + struct wf_impl_jsonrpc_proxy * proxy, char const * message, size_t length); diff --git a/lib/webfuse/adapter/impl/jsonrpc/server.c b/lib/webfuse/adapter/impl/jsonrpc/server.c deleted file mode 100644 index 71b92aa..0000000 --- a/lib/webfuse/adapter/impl/jsonrpc/server.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "webfuse/adapter/impl/jsonrpc/server.h" -#include - -#include "webfuse/adapter/impl/jsonrpc/request.h" -#include "webfuse/adapter/impl/jsonrpc/response.h" - -#define WF_DEFAULT_TIMEOUT (10 * 1000) - -static void wf_impl_jsonrpc_server_timeout( - struct wf_impl_timer * timer) -{ - struct wf_impl_jsonrpc_server * server = timer->user_data; - - if (server->request.is_pending) - { - wf_impl_jsonrpc_server_finished_fn * finished = server->request.finished; - void * user_data = server->request.user_data; - - server->request.is_pending = false; - server->request.id = 0; - server->request.user_data = NULL; - server->request.finished = NULL; - wf_impl_timer_cancel(&server->request.timer); - - finished(user_data, WF_BAD_TIMEOUT, NULL); - } -} - -void wf_impl_jsonrpc_server_init( - struct wf_impl_jsonrpc_server * server, - struct wf_impl_timeout_manager * timeout_manager, - wf_impl_jsonrpc_server_send_fn * send, - void * user_data) -{ - server->send = send; - server->user_data = user_data; - server->request.is_pending = false; - - wf_impl_timer_init(&server->request.timer, timeout_manager); -} - -void wf_impl_jsonrpc_server_cleanup( - struct wf_impl_jsonrpc_server * server) -{ - wf_impl_timer_cleanup(&server->request.timer); - - if (server->request.is_pending) - { - server->request.finished(server->request.user_data, WF_BAD, NULL); - server->request.is_pending = false; - } -} - -void wf_impl_jsonrpc_server_invoke( - struct wf_impl_jsonrpc_server * server, - wf_impl_jsonrpc_server_finished_fn * finished, - void * user_data, - char const * method_name, - char const * param_info, - ... -) -{ - if (!server->request.is_pending) - { - server->request.is_pending = true; - server->request.finished = finished; - server->request.user_data = user_data; - server->request.id = 42; - wf_impl_timer_start(&server->request.timer, wf_impl_timepoint_in_msec(WF_DEFAULT_TIMEOUT), - &wf_impl_jsonrpc_server_timeout, server); - - va_list args; - va_start(args, param_info); - json_t * request = wf_impl_jsonrpc_request_create(method_name, server->request.id, param_info, args); - va_end(args); - if (NULL != request) - { - if (!server->send(request, server->user_data)) - { - server->request.is_pending = false; - server->request.finished = NULL; - server->request.user_data = NULL; - server->request.id = 0; - wf_impl_timer_cancel(&server->request.timer); - - finished(user_data, WF_BAD, NULL); - } - json_decref(request); - } - } - else - { - finished(user_data, WF_BAD_BUSY, NULL); - } -} - -extern void wf_impl_jsonrpc_server_notify( - struct wf_impl_jsonrpc_server * server, - char const * method_name, - char const * param_info, - ... -) -{ - va_list args; - va_start(args, param_info); - json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args); - va_end(args); - if (NULL != request) - { - server->send(request, server->user_data); - json_decref(request); - } -} - - -void wf_impl_jsonrpc_server_onresult( - struct wf_impl_jsonrpc_server * server, - char const * message, - size_t length) -{ - struct wf_impl_jsonrpc_response response; - wf_impl_jsonrpc_response_init(&response, message, length); - - if ((server->request.is_pending) && (response.id == server->request.id)) - { - wf_impl_jsonrpc_server_finished_fn * finished = server->request.finished; - void * user_data = server->request.user_data; - - server->request.is_pending = false; - server->request.id = 0; - server->request.user_data = NULL; - server->request.finished = NULL; - wf_impl_timer_cancel(&server->request.timer); - - finished(user_data, response.status, response.result); - } - - wf_impl_jsonrpc_response_cleanup(&response); -} - diff --git a/lib/webfuse/adapter/impl/operation/close.c b/lib/webfuse/adapter/impl/operation/close.c index f46e641..6ccefc8 100644 --- a/lib/webfuse/adapter/impl/operation/close.c +++ b/lib/webfuse/adapter/impl/operation/close.c @@ -4,7 +4,7 @@ #include #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/core/util.h" void wf_impl_operation_close( @@ -13,12 +13,12 @@ void wf_impl_operation_close( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); if (NULL != rpc) { int handle = (int) (file_info->fh & INT_MAX); - wf_impl_jsonrpc_server_notify(rpc, "close", "iii", inode, handle, file_info->flags); + wf_impl_jsonrpc_proxy_notify(rpc, "close", "iii", inode, handle, file_info->flags); } fuse_reply_err(request, 0); diff --git a/lib/webfuse/adapter/impl/operation/getattr.c b/lib/webfuse/adapter/impl/operation/getattr.c index 16e886b..98993e8 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.c +++ b/lib/webfuse/adapter/impl/operation/getattr.c @@ -7,7 +7,7 @@ #include #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/adapter/impl/jsonrpc/util.h" #include "webfuse/core/util.h" @@ -81,7 +81,7 @@ void wf_impl_operation_getattr ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); if (NULL != rpc) { @@ -91,7 +91,7 @@ void wf_impl_operation_getattr ( getattr_context->gid = context->gid; getattr_context->timeout = user_data->timeout; - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "i", inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "i", inode); } else { diff --git a/lib/webfuse/adapter/impl/operation/lookup.c b/lib/webfuse/adapter/impl/operation/lookup.c index 4646974..840a754 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.c +++ b/lib/webfuse/adapter/impl/operation/lookup.c @@ -10,7 +10,7 @@ #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/adapter/impl/jsonrpc/util.h" #include "webfuse/core/util.h" @@ -90,7 +90,7 @@ void wf_impl_operation_lookup ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, parent); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, parent); if (NULL != rpc) { @@ -100,7 +100,7 @@ void wf_impl_operation_lookup ( lookup_context->gid = context->gid; lookup_context->timeout = user_data->timeout; - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "is", (int) (parent & INT_MAX), name); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "is", (int) (parent & INT_MAX), name); } else { diff --git a/lib/webfuse/adapter/impl/operation/open.c b/lib/webfuse/adapter/impl/operation/open.c index c98d21a..51894fa 100644 --- a/lib/webfuse/adapter/impl/operation/open.c +++ b/lib/webfuse/adapter/impl/operation/open.c @@ -4,7 +4,7 @@ #include #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/core/util.h" #include "webfuse/core/status.h" @@ -47,11 +47,11 @@ void wf_impl_operation_open( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); if (NULL != rpc) { - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "ii", inode, file_info->flags); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "ii", inode, file_info->flags); } else { diff --git a/lib/webfuse/adapter/impl/operation/read.c b/lib/webfuse/adapter/impl/operation/read.c index a828ac1..8c956fb 100644 --- a/lib/webfuse/adapter/impl/operation/read.c +++ b/lib/webfuse/adapter/impl/operation/read.c @@ -6,7 +6,7 @@ #include #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #define WF_MAX_READ_LENGTH 4096 @@ -87,13 +87,13 @@ void wf_impl_operation_read( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); if (NULL != rpc) { int const length = (size <= WF_MAX_READ_LENGTH) ? (int) size : WF_MAX_READ_LENGTH; int handle = (file_info->fh & INT_MAX); - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "iiii", inode, handle, (int) offset, length); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "iiii", inode, handle, (int) offset, length); } else { diff --git a/lib/webfuse/adapter/impl/operation/readdir.c b/lib/webfuse/adapter/impl/operation/readdir.c index 634e467..104e807 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.c +++ b/lib/webfuse/adapter/impl/operation/readdir.c @@ -8,7 +8,7 @@ #include #include -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/core/util.h" @@ -137,7 +137,7 @@ void wf_impl_operation_readdir ( struct fuse_file_info * WF_UNUSED_PARAM(file_info)) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_server * rpc = wf_impl_operations_context_get_server(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); if (NULL != rpc) { @@ -146,7 +146,7 @@ void wf_impl_operation_readdir ( readdir_context->size = size; readdir_context->offset = offset; - wf_impl_jsonrpc_server_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "i", inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "i", inode); } else { diff --git a/lib/webfuse/adapter/impl/operations.c b/lib/webfuse/adapter/impl/operations.c index 8139d5c..75949b5 100644 --- a/lib/webfuse/adapter/impl/operations.c +++ b/lib/webfuse/adapter/impl/operations.c @@ -3,18 +3,18 @@ #include "webfuse/adapter/impl/session.h" #include -struct wf_impl_jsonrpc_server * wf_impl_operations_context_get_server( +struct wf_impl_jsonrpc_proxy * wf_impl_operations_context_get_proxy( struct wf_impl_operations_context * context, fuse_ino_t inode) { - struct wf_impl_jsonrpc_server * server = NULL; + struct wf_impl_jsonrpc_proxy * proxy = NULL; struct wf_impl_session_manager * session_manger = context->session_manager; struct wf_impl_session * session = wf_impl_session_manager_get_by_inode(session_manger, inode); if (NULL != session) { - server = &session->rpc; + proxy = &session->rpc; } - return server; + return proxy; } diff --git a/lib/webfuse/adapter/impl/operations.h b/lib/webfuse/adapter/impl/operations.h index 08da67c..fe1a540 100644 --- a/lib/webfuse/adapter/impl/operations.h +++ b/lib/webfuse/adapter/impl/operations.h @@ -8,6 +8,7 @@ extern "C" { #endif struct wf_impl_session_manager; +struct wf_impl_jsonrpc_proxy; struct wf_impl_operations_context { @@ -47,7 +48,7 @@ extern void wf_impl_operation_read( fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi); -extern struct wf_impl_jsonrpc_server * wf_impl_operations_context_get_server( +extern struct wf_impl_jsonrpc_proxy * wf_impl_operations_context_get_proxy( struct wf_impl_operations_context * context, fuse_ino_t inode); diff --git a/lib/webfuse/adapter/impl/server_protocol.h b/lib/webfuse/adapter/impl/server_protocol.h index 599f9a5..bae1c8b 100644 --- a/lib/webfuse/adapter/impl/server_protocol.h +++ b/lib/webfuse/adapter/impl/server_protocol.h @@ -2,7 +2,7 @@ #define WF_ADAPTER_IMPL_SERVER_PROTOCOL_H #include "webfuse/adapter/impl/filesystem.h" -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/adapter/impl/time/timeout_manager.h" #include "webfuse/adapter/impl/authenticators.h" #include "webfuse/adapter/impl/session_manager.h" @@ -18,7 +18,7 @@ struct wf_server_protocol { struct wf_impl_timeout_manager timeout_manager; struct wf_impl_filesystem filesystem; - struct wf_impl_jsonrpc_server rpc; + struct wf_impl_jsonrpc_proxy rpc; struct wf_impl_authenticators authenticators; struct wf_impl_session_manager session_manager; }; diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index 2918d72..4d25fe2 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -2,7 +2,7 @@ #include "webfuse/adapter/impl/authenticators.h" #include "webfuse/core/message_queue.h" #include "webfuse/core/message.h" -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #include #include @@ -40,14 +40,14 @@ void wf_impl_session_init( session->wsi = wsi; session->is_authenticated = false; session->authenticators = authenticators; - wf_impl_jsonrpc_server_init(&session->rpc, timeout_manager, &wf_impl_session_send, session); + wf_impl_jsonrpc_proxy_init(&session->rpc, timeout_manager, &wf_impl_session_send, session); wf_message_queue_init(&session->queue); } void wf_impl_session_cleanup( struct wf_impl_session * session) { - wf_impl_jsonrpc_server_cleanup(&session->rpc); + wf_impl_jsonrpc_proxy_cleanup(&session->rpc); wf_message_queue_cleanup(&session->queue); session->is_authenticated = false; session->wsi = NULL; @@ -83,5 +83,5 @@ void wf_impl_session_receive( char const * data, size_t length) { - wf_impl_jsonrpc_server_onresult(&session->rpc, data, length); + wf_impl_jsonrpc_proxy_onresult(&session->rpc, data, length); } \ No newline at end of file diff --git a/lib/webfuse/adapter/impl/session.h b/lib/webfuse/adapter/impl/session.h index 79388ec..b6bb7ee 100644 --- a/lib/webfuse/adapter/impl/session.h +++ b/lib/webfuse/adapter/impl/session.h @@ -10,7 +10,7 @@ using std::size_t; #endif #include "webfuse/core/message_queue.h" -#include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/jsonrpc/proxy.h" #ifdef __cplusplus extern "C" @@ -29,7 +29,7 @@ struct wf_impl_session bool is_authenticated; struct wf_message_queue queue; struct wf_impl_authenticators * authenticators; - struct wf_impl_jsonrpc_server rpc; + struct wf_impl_jsonrpc_proxy rpc; }; extern void wf_impl_session_init(