mirror of
https://github.com/falk-werner/webfuse-provider
synced 2026-03-02 04:09:18 +00:00
feat(webfuse): add multiclient support (#23)
* fixes verbosity option when set through command line * adds support for build type and allows to run gdb in container * adds missing toolchain headers to project * renames container macros * adds gdbserver * fixes verbosity option when set through command line * adds support for build type and allows to run gdb in container * adds missing toolchain headers to project * renames container macros * adds gdbserver * removes language settings, which contains alternating values * adds wrapper script to launch gdbserver * fix docker command in wrapper script * fixes run in dind setup * replaces docker's init through dump-init * moves filesystem to session * fixes verbosity option when set through command line * adds support for build type and allows to run gdb in container * renames container macros * adds gdbserver * fixes verbosity option when set through command line * adds support for build type and allows to run gdb in container * renames container macros * adds gdbserver * adds wrapper script to launch gdbserver * fix docker command in wrapper script * fixes run in dind setup * replaces docker's init through dump-init * moves filesystem to session * adds container_of * added dlist * allows multiple clients to connect * removes directory when session is closed * adds dependecy to uuid-dev * allow clients to register filesystems * updates documentation * moves mountpoint handling into filesystem: mountpoints are removed during session cleanup * adds filesystem name/id to request parameters * fixes security issue: add_filesystem did not check name * removes default link, if it is broken * recreates symlink "default", if filesystem is gone * updates documentation * fixes memory leak * makes authentication work .. again * updates provider to support changed protocol * removes execute right of hello.txt * fixes style issues * fixes javascript style issues * fixes flase positive from Flawfinder * fixes some javascript style issues * removes use of PATH_MAX * removes use of GNU extensions in container_of implementation * ignores findings of flawfinder * replaces dlist by slist * removes duplicate implementation of slist (message_queue)
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#include "webfuse/provider/impl/provider.h"
|
||||
#include "webfuse/core/util.h"
|
||||
#include "webfuse/core/message.h"
|
||||
#include "webfuse/core/message_queue.h"
|
||||
#include "webfuse/core/container_of.h"
|
||||
|
||||
static void wfp_impl_client_protocol_respond(
|
||||
json_t * response,
|
||||
@@ -20,7 +22,7 @@ static void wfp_impl_client_protocol_respond(
|
||||
struct wf_message * message = wf_message_create(response);
|
||||
if (NULL != message)
|
||||
{
|
||||
wf_message_queue_push(&protocol->queue, message);
|
||||
wf_slist_append(&protocol->messages, &message->item);
|
||||
lws_callback_on_writable(protocol->wsi);
|
||||
}
|
||||
}
|
||||
@@ -45,6 +47,26 @@ static void wfp_impl_client_protocol_process_request(
|
||||
}
|
||||
}
|
||||
|
||||
static void wfp_impl_client_protocol_add_filesystem(
|
||||
struct wfp_client_protocol * protocol)
|
||||
{
|
||||
json_t * params = json_array();
|
||||
json_array_append_new(params, json_string("cprovider"));
|
||||
|
||||
json_t * request = json_object();
|
||||
json_object_set_new(request, "method", json_string("add_filesystem"));
|
||||
json_object_set_new(request, "params", params);
|
||||
json_object_set_new(request, "id", json_integer(42));
|
||||
|
||||
struct wf_message * message = wf_message_create(request);
|
||||
if (NULL != message)
|
||||
{
|
||||
wf_slist_append(&protocol->messages, &message->item);
|
||||
lws_callback_on_writable(protocol->wsi);
|
||||
}
|
||||
|
||||
json_decref(request);
|
||||
}
|
||||
|
||||
static int wfp_impl_client_protocol_callback(
|
||||
struct lws * wsi,
|
||||
@@ -61,6 +83,7 @@ static int wfp_impl_client_protocol_callback(
|
||||
switch (reason)
|
||||
{
|
||||
case LWS_CALLBACK_CLIENT_ESTABLISHED:
|
||||
wfp_impl_client_protocol_add_filesystem(protocol);
|
||||
protocol->provider.connected(protocol->user_data);
|
||||
break;
|
||||
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
|
||||
@@ -75,13 +98,14 @@ static int wfp_impl_client_protocol_callback(
|
||||
case LWS_CALLBACK_SERVER_WRITEABLE:
|
||||
// fall-through
|
||||
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
||||
if ((wsi == protocol->wsi) && (!wf_message_queue_empty(&protocol->queue)))
|
||||
if ((wsi == protocol->wsi) && (!wf_slist_empty(&protocol->messages)))
|
||||
{
|
||||
struct wf_message * message = wf_message_queue_pop(&protocol->queue);
|
||||
struct wf_slist_item * item = wf_slist_remove_first(&protocol->messages);
|
||||
struct wf_message * message = WF_CONTAINER_OF(item, struct wf_message, item);
|
||||
lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT);
|
||||
wf_message_dispose(message);
|
||||
|
||||
if (!wf_message_queue_empty(&protocol->queue))
|
||||
if (!wf_slist_empty(&protocol->messages))
|
||||
{
|
||||
lws_callback_on_writable(wsi);
|
||||
|
||||
@@ -102,7 +126,7 @@ void wfp_impl_client_protocol_init(
|
||||
struct wfp_provider const * provider,
|
||||
void * user_data)
|
||||
{
|
||||
wf_message_queue_init(&protocol->queue);
|
||||
wf_slist_init(&protocol->messages);
|
||||
|
||||
protocol->wsi = NULL;
|
||||
|
||||
@@ -116,7 +140,7 @@ void wfp_impl_client_protocol_init(
|
||||
void wfp_impl_client_protocol_cleanup(
|
||||
struct wfp_client_protocol * protocol)
|
||||
{
|
||||
wf_message_queue_cleanup(&protocol->queue);
|
||||
wf_message_queue_cleanup(&protocol->messages);
|
||||
}
|
||||
|
||||
struct wfp_client_protocol * wfp_impl_client_protocol_create(
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "webfuse/provider/impl/provider.h"
|
||||
#include "webfuse/provider/impl/request.h"
|
||||
|
||||
#include "webfuse/core/message_queue.h"
|
||||
#include "webfuse/core/slist.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
@@ -20,7 +20,7 @@ struct wfp_client_protocol
|
||||
struct wfp_provider provider;
|
||||
void * user_data;
|
||||
struct lws * wsi;
|
||||
struct wf_message_queue queue;
|
||||
struct wf_slist messages;
|
||||
};
|
||||
|
||||
extern void wfp_impl_client_protocol_init(
|
||||
|
||||
@@ -8,11 +8,11 @@ void wfp_impl_close(
|
||||
int WF_UNUSED_PARAM(id))
|
||||
{
|
||||
size_t const param_count = json_array_size(params);
|
||||
if (3 == param_count)
|
||||
if (4 == param_count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * handle_holder = json_array_get(params, 1);
|
||||
json_t * flags_holder = json_array_get(params, 2);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
json_t * handle_holder = json_array_get(params, 2);
|
||||
json_t * flags_holder = json_array_get(params, 3);
|
||||
|
||||
if (json_is_integer(inode_holder) &&
|
||||
json_is_integer(handle_holder) &&
|
||||
|
||||
@@ -13,9 +13,9 @@ void wfp_impl_getattr(
|
||||
int id)
|
||||
{
|
||||
size_t const count = json_array_size(params);
|
||||
if (1 == count)
|
||||
if (2 == count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
|
||||
if (json_is_integer(inode_holder))
|
||||
{
|
||||
|
||||
@@ -12,10 +12,10 @@ void wfp_impl_lookup(
|
||||
int id)
|
||||
{
|
||||
size_t const count = json_array_size(params);
|
||||
if (2 == count)
|
||||
if (3 == count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * name_holder = json_array_get(params, 1);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
json_t * name_holder = json_array_get(params, 2);
|
||||
|
||||
if (json_is_integer(inode_holder) &&
|
||||
json_is_string(name_holder))
|
||||
|
||||
@@ -9,10 +9,10 @@ void wfp_impl_open(
|
||||
int id)
|
||||
{
|
||||
size_t const count = json_array_size(params);
|
||||
if (2 == count)
|
||||
if (3 == count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * flags_holder = json_array_get(params, 1);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
json_t * flags_holder = json_array_get(params, 2);
|
||||
|
||||
if (json_is_integer(inode_holder) &&
|
||||
json_is_integer(flags_holder))
|
||||
|
||||
@@ -13,12 +13,12 @@ void wfp_impl_read(
|
||||
int id)
|
||||
{
|
||||
size_t const count = json_array_size(params);
|
||||
if (4 == count)
|
||||
if (5 == count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * handle_holder = json_array_get(params, 1);
|
||||
json_t * offset_holder = json_array_get(params, 2);
|
||||
json_t * length_holder = json_array_get(params, 3);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
json_t * handle_holder = json_array_get(params, 2);
|
||||
json_t * offset_holder = json_array_get(params, 3);
|
||||
json_t * length_holder = json_array_get(params, 4);
|
||||
|
||||
if (json_is_integer(inode_holder) &&
|
||||
json_is_integer(handle_holder) &&
|
||||
|
||||
@@ -10,9 +10,9 @@ void wfp_impl_readdir(
|
||||
int id)
|
||||
{
|
||||
size_t const count = json_array_size(params);
|
||||
if (1 == count)
|
||||
if (2 == count)
|
||||
{
|
||||
json_t * inode_holder = json_array_get(params, 0);
|
||||
json_t * inode_holder = json_array_get(params, 1);
|
||||
|
||||
if ((NULL != inode_holder) && (json_is_integer(inode_holder)))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user