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:
13
lib/webfuse/core/container_of.h
Normal file
13
lib/webfuse/core/container_of.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef WF_CONTAINER_OF_H
|
||||
#define WF_CONTAINER_OF_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#include <stddef.h>
|
||||
#else
|
||||
#include <cstddef>
|
||||
#endif
|
||||
|
||||
#define WF_CONTAINER_OF(pointer, type, member) \
|
||||
(type *) (((char *) pointer) - offsetof(type, member))
|
||||
|
||||
#endif
|
||||
@@ -16,7 +16,6 @@ extern struct wf_message * wf_message_create(json_t const * value)
|
||||
{
|
||||
message->data = &data[sizeof(struct wf_message) + LWS_PRE];
|
||||
message->length = length;
|
||||
message->next = NULL;
|
||||
|
||||
json_dumpb(value, message->data, length, JSON_COMPACT);
|
||||
}
|
||||
|
||||
@@ -9,10 +9,11 @@ using std::size_t;
|
||||
#endif
|
||||
|
||||
#include <jansson.h>
|
||||
#include "webfuse/core/slist.h"
|
||||
|
||||
struct wf_message
|
||||
{
|
||||
struct wf_message * next;
|
||||
struct wf_slist_item item;
|
||||
char * data;
|
||||
size_t length;
|
||||
};
|
||||
@@ -22,7 +23,8 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern struct wf_message * wf_message_create(json_t const * value);
|
||||
extern struct wf_message * wf_message_create(
|
||||
json_t const * value);
|
||||
|
||||
extern void wf_message_dispose(
|
||||
struct wf_message * message);
|
||||
|
||||
@@ -1,63 +1,17 @@
|
||||
#include "webfuse/core/message_queue.h"
|
||||
#include "webfuse/core/message.h"
|
||||
|
||||
void wf_message_queue_init(
|
||||
struct wf_message_queue * queue)
|
||||
{
|
||||
queue->first = NULL;
|
||||
queue->last = NULL;
|
||||
|
||||
}
|
||||
#include "webfuse/core/container_of.h"
|
||||
|
||||
void wf_message_queue_cleanup(
|
||||
struct wf_message_queue * queue)
|
||||
struct wf_slist * queue)
|
||||
{
|
||||
struct wf_message * message = queue->first;
|
||||
while (NULL != message)
|
||||
struct wf_slist_item * item = queue->first;
|
||||
while (NULL != item)
|
||||
{
|
||||
struct wf_message * next = message->next;
|
||||
struct wf_slist_item * next = item->next;
|
||||
struct wf_message * message = WF_CONTAINER_OF(item, struct wf_message, item);
|
||||
wf_message_dispose(message);
|
||||
message = next;
|
||||
item = next;
|
||||
}
|
||||
wf_message_queue_init(queue);
|
||||
}
|
||||
|
||||
bool wf_message_queue_empty(
|
||||
struct wf_message_queue * queue)
|
||||
{
|
||||
return (NULL == queue->first);
|
||||
}
|
||||
|
||||
void wf_message_queue_push(
|
||||
struct wf_message_queue * queue,
|
||||
struct wf_message * message)
|
||||
{
|
||||
message->next = NULL;
|
||||
|
||||
if (NULL != queue->last)
|
||||
{
|
||||
queue->last->next = message;
|
||||
queue->last = message;
|
||||
}
|
||||
else
|
||||
{
|
||||
queue->first = message;
|
||||
queue->last = message;
|
||||
}
|
||||
}
|
||||
|
||||
struct wf_message * wf_message_queue_pop(
|
||||
struct wf_message_queue * queue)
|
||||
{
|
||||
struct wf_message * const result = queue->first;
|
||||
if (NULL != result)
|
||||
{
|
||||
queue->first = queue->first->next;
|
||||
if (NULL == queue->first)
|
||||
{
|
||||
queue->last = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
wf_slist_init(queue);
|
||||
}
|
||||
|
||||
@@ -1,39 +1,16 @@
|
||||
#ifndef WF_MESSAGE_QUEUE_H
|
||||
#define WF_MESSAGE_QUEUE_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
struct wf_message_queue;
|
||||
struct wf_message;
|
||||
|
||||
struct wf_message_queue
|
||||
{
|
||||
struct wf_message * first;
|
||||
struct wf_message * last;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern void wf_message_queue_init(
|
||||
struct wf_message_queue * queue);
|
||||
struct wf_slist;
|
||||
|
||||
extern void wf_message_queue_cleanup(
|
||||
struct wf_message_queue * queue);
|
||||
struct wf_slist * queue);
|
||||
|
||||
extern bool wf_message_queue_empty(
|
||||
struct wf_message_queue * queue);
|
||||
|
||||
extern void wf_message_queue_push(
|
||||
struct wf_message_queue * queue,
|
||||
struct wf_message * message);
|
||||
|
||||
extern struct wf_message * wf_message_queue_pop(
|
||||
struct wf_message_queue * queue);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
77
lib/webfuse/core/slist.c
Normal file
77
lib/webfuse/core/slist.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "webfuse/core/slist.h"
|
||||
#include <stddef.h>
|
||||
|
||||
void wf_slist_init(
|
||||
struct wf_slist * list)
|
||||
{
|
||||
list->first = NULL;
|
||||
list->last = NULL;
|
||||
}
|
||||
|
||||
bool wf_slist_empty(
|
||||
struct wf_slist * list)
|
||||
{
|
||||
return (NULL == list->first);
|
||||
}
|
||||
|
||||
void wf_slist_append(
|
||||
struct wf_slist * list,
|
||||
struct wf_slist_item * item)
|
||||
{
|
||||
item->next = NULL;
|
||||
|
||||
if (NULL != list->last)
|
||||
{
|
||||
list->last->next = item;
|
||||
list->last = item;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->first = item;
|
||||
list->last = item;
|
||||
}
|
||||
}
|
||||
|
||||
struct wf_slist_item * wf_slist_remove_first(
|
||||
struct wf_slist * list)
|
||||
{
|
||||
struct wf_slist_item * const result = list->first;
|
||||
if (NULL != result)
|
||||
{
|
||||
list->first = list->first->next;
|
||||
if (NULL == list->first)
|
||||
{
|
||||
list->last = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct wf_slist_item * wf_slist_remove_after(
|
||||
struct wf_slist * list,
|
||||
struct wf_slist_item * prev)
|
||||
{
|
||||
struct wf_slist_item * result = NULL;
|
||||
|
||||
if (NULL != prev)
|
||||
{
|
||||
result = prev->next;
|
||||
if ((NULL != result) && (NULL != result->next))
|
||||
{
|
||||
prev->next = result->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->last = prev;
|
||||
prev->next = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
result = wf_slist_remove_first(list);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
45
lib/webfuse/core/slist.h
Normal file
45
lib/webfuse/core/slist.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#ifndef WF_SLIST_H
|
||||
#define WF_SLIST_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct wf_slist_item
|
||||
{
|
||||
struct wf_slist_item * next;
|
||||
};
|
||||
|
||||
struct wf_slist
|
||||
{
|
||||
struct wf_slist_item * first;
|
||||
struct wf_slist_item * last;
|
||||
};
|
||||
|
||||
extern void wf_slist_init(
|
||||
struct wf_slist * list);
|
||||
|
||||
extern bool wf_slist_empty(
|
||||
struct wf_slist * list);
|
||||
|
||||
extern void wf_slist_append(
|
||||
struct wf_slist * list,
|
||||
struct wf_slist_item * item);
|
||||
|
||||
extern struct wf_slist_item * wf_slist_remove_first(
|
||||
struct wf_slist * list);
|
||||
|
||||
extern struct wf_slist_item * wf_slist_remove_after(
|
||||
struct wf_slist * list,
|
||||
struct wf_slist_item * prev);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
35
lib/webfuse/core/string.c
Normal file
35
lib/webfuse/core/string.c
Normal file
@@ -0,0 +1,35 @@
|
||||
#include "webfuse/core/string.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
char * wf_create_string(char const * format, ...)
|
||||
{
|
||||
char * result = NULL;
|
||||
|
||||
va_list measure_args;
|
||||
va_start(measure_args, format);
|
||||
char buffer;
|
||||
int needed = vsnprintf(&buffer, 1, format, measure_args); /* Flawfinder: ignore */
|
||||
va_end(measure_args);
|
||||
|
||||
if (0 <= needed)
|
||||
{
|
||||
result = malloc(needed + 1);
|
||||
if (NULL != result)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
int count = vsnprintf(result, needed + 1, format, args); /* Flawfinder: ignore */
|
||||
va_end(args);
|
||||
|
||||
if ((count < 0) || (needed < count))
|
||||
{
|
||||
free(result);
|
||||
result = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
21
lib/webfuse/core/string.h
Normal file
21
lib/webfuse/core/string.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef WF_CORE_STRING_H
|
||||
#define WF_CORE_STRING_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <cstdarg>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern char * wf_create_string(char const * format, ...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user