use libwebsockets as loop for fuse fd; removed dependency to libuv, since it is not needed anymore; disabled jsonrpc temporary, until refactoring is finished (will not work properly)
parent
84aa5daf32
commit
b74c459942
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef _WSFS_H
|
||||||
|
#define _WSFS_H
|
||||||
|
|
||||||
|
#include "wsfs/api.h"
|
||||||
|
#include "wsfs/server.h"
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef _WSFS_API_H
|
||||||
|
#define _WSFS_API_H
|
||||||
|
|
||||||
|
#ifndef WSFS_API
|
||||||
|
#define WSFS_API
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef _WSFS_SERVER_H
|
||||||
|
#define _WSFS_SERVER_H
|
||||||
|
|
||||||
|
#include "wsfs/api.h"
|
||||||
|
|
||||||
|
struct wsfs_server;
|
||||||
|
struct wsfs_server_config;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern WSFS_API struct wsfs_server * wsfs_server_create(
|
||||||
|
struct wsfs_server_config * config);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_dispose(
|
||||||
|
struct wsfs_server * server);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_run(
|
||||||
|
struct wsfs_server * server);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_shutdown(
|
||||||
|
struct wsfs_server * server);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef _WSFS_SERVER_CONFIG_H
|
||||||
|
#define _WSFS_SERVER_CONFIG_H
|
||||||
|
|
||||||
|
#include "wsfs/api.h"
|
||||||
|
|
||||||
|
struct wsfs_server_config
|
||||||
|
{
|
||||||
|
char * mount_point;
|
||||||
|
char * document_root;
|
||||||
|
char * key_path;
|
||||||
|
char * cert_path;
|
||||||
|
char * vhost_name;
|
||||||
|
int port;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_config_init(
|
||||||
|
struct wsfs_server_config * config);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_config_cleanup(
|
||||||
|
struct wsfs_server_config * config);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_config_clone(
|
||||||
|
struct wsfs_server_config * config,
|
||||||
|
struct wsfs_server_config * clone);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef _WSFS_SERVER_PROTOCOL_H
|
||||||
|
#define _WSFS_SERVER_PROTOCOL_H
|
||||||
|
|
||||||
|
#include "wsfs/api.h"
|
||||||
|
|
||||||
|
struct wsfs_server_protocol;
|
||||||
|
struct lws_protocols;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern WSFS_API struct wsfs_server_protocol * wsfs_server_protocol_create(
|
||||||
|
char * mount_point);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_protocol_dispose(
|
||||||
|
struct wsfs_server_protocol * protocol);
|
||||||
|
|
||||||
|
extern WSFS_API void wsfs_server_protocol_init_lws(
|
||||||
|
struct wsfs_server_protocol * protocol,
|
||||||
|
struct lws_protocols * lws_protocol);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,79 @@
|
|||||||
|
#include "wsfs/filesystem.h"
|
||||||
|
#include "wsfs/operations.h"
|
||||||
|
#include "wsfs/jsonrpc.h"
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
static struct fuse_lowlevel_ops const wsfs_filesystem_operations =
|
||||||
|
{
|
||||||
|
.lookup = &wsfs_operation_lookup,
|
||||||
|
.getattr = &wsfs_operation_getattr,
|
||||||
|
.readdir = &wsfs_operation_readdir,
|
||||||
|
.open = &wsfs_operation_open,
|
||||||
|
.release = &wsfs_operation_close,
|
||||||
|
.read = &wsfs_operation_read
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void wsfs_filesystem_init(
|
||||||
|
struct wsfs_filesystem * filesystem,
|
||||||
|
char * mount_point)
|
||||||
|
{
|
||||||
|
char * argv[] = {"", NULL};
|
||||||
|
filesystem->args.argc = 1;
|
||||||
|
filesystem->args.argv = argv;
|
||||||
|
filesystem->args.allocated = 0;
|
||||||
|
|
||||||
|
filesystem->user_data.rpc = wsfs_jsonrpc_create(NULL, NULL, NULL);
|
||||||
|
filesystem->user_data.timeout = 1.0;
|
||||||
|
memset(&filesystem->buffer, 0, sizeof(struct fuse_buf));
|
||||||
|
|
||||||
|
filesystem->session = fuse_session_new(
|
||||||
|
&filesystem->args,
|
||||||
|
&wsfs_filesystem_operations,
|
||||||
|
sizeof(wsfs_filesystem_operations),
|
||||||
|
&filesystem->user_data);
|
||||||
|
if (NULL != filesystem->session)
|
||||||
|
{
|
||||||
|
fuse_session_mount(filesystem->session, mount_point);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_filesystem_cleanup(
|
||||||
|
struct wsfs_filesystem * filesystem)
|
||||||
|
{
|
||||||
|
if (NULL != filesystem->session)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wsfs_filesystem_get_fd(
|
||||||
|
struct wsfs_filesystem * filesystem)
|
||||||
|
{
|
||||||
|
return fuse_session_fd(filesystem->session);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_filesystem_process_request(
|
||||||
|
struct wsfs_filesystem * filesystem)
|
||||||
|
{
|
||||||
|
int const result = fuse_session_receive_buf(filesystem->session, &filesystem->buffer);
|
||||||
|
if (0 < result)
|
||||||
|
{
|
||||||
|
fuse_session_process_buf(filesystem->session, &filesystem->buffer);
|
||||||
|
}
|
||||||
|
else if (-EINTR != result)
|
||||||
|
{
|
||||||
|
// ToDo
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef _WSFS_FILESYSTEM_H
|
||||||
|
#define _WSFS_FILESYSTEM_H
|
||||||
|
|
||||||
|
#include "wsfs/fuse_wrapper.h"
|
||||||
|
#include "wsfs/operations.h"
|
||||||
|
|
||||||
|
struct wsfs_filesystem
|
||||||
|
{
|
||||||
|
struct fuse_args args;
|
||||||
|
struct fuse_session * session;
|
||||||
|
struct fuse_buf buffer;
|
||||||
|
struct wsfs_operations_context user_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void wsfs_filesystem_init(
|
||||||
|
struct wsfs_filesystem * filesystem,
|
||||||
|
char * mount_point);
|
||||||
|
|
||||||
|
extern void wsfs_filesystem_cleanup(
|
||||||
|
struct wsfs_filesystem * filesystem);
|
||||||
|
|
||||||
|
extern int wsfs_filesystem_get_fd(
|
||||||
|
struct wsfs_filesystem * filesystem);
|
||||||
|
|
||||||
|
extern void wsfs_filesystem_process_request(
|
||||||
|
struct wsfs_filesystem * filesystem);
|
||||||
|
|
||||||
|
#endif
|
@ -1,142 +0,0 @@
|
|||||||
#include "wsfs/operations.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <uv.h>
|
|
||||||
|
|
||||||
#include "wsfs/util.h"
|
|
||||||
|
|
||||||
struct wsfs_fuse_context
|
|
||||||
{
|
|
||||||
struct fuse_args args;
|
|
||||||
struct fuse_session * session;
|
|
||||||
struct fuse_buf buffer;
|
|
||||||
struct wsfs_operations_context user_data;
|
|
||||||
int fd;
|
|
||||||
bool mounted;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct fuse_lowlevel_ops const wsfs_operations =
|
|
||||||
{
|
|
||||||
.lookup = &wsfs_operation_lookup,
|
|
||||||
.getattr = &wsfs_operation_getattr,
|
|
||||||
.readdir = &wsfs_operation_readdir,
|
|
||||||
.open = &wsfs_operation_open,
|
|
||||||
.release = &wsfs_operation_close,
|
|
||||||
.read = &wsfs_operation_read
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static bool wsfs_fuse_init(
|
|
||||||
struct wsfs_fuse_context * context,
|
|
||||||
char * mount_point,
|
|
||||||
struct wsfs_jsonrpc * rpc)
|
|
||||||
{
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
char * argv[] = {"", NULL};
|
|
||||||
context->args.argc = 1;
|
|
||||||
context->args.argv = argv;
|
|
||||||
context->args.allocated = 0;
|
|
||||||
|
|
||||||
context->user_data.rpc = rpc;
|
|
||||||
context->user_data.timeout = 1.0;
|
|
||||||
memset(&context->buffer, 0, sizeof(struct fuse_buf));
|
|
||||||
|
|
||||||
context->session = fuse_session_new(&context->args, &wsfs_operations, sizeof(wsfs_operations), &context->user_data);
|
|
||||||
if (NULL != context->session)
|
|
||||||
{
|
|
||||||
result = (0 == fuse_session_mount(context->session, mount_point));
|
|
||||||
context->fd = fuse_session_fd(context->session);
|
|
||||||
}
|
|
||||||
|
|
||||||
// cleanup on error
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
if (NULL != context->session)
|
|
||||||
{
|
|
||||||
fuse_session_destroy(context->session);
|
|
||||||
context->session = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(context->buffer.mem);
|
|
||||||
fuse_opt_free_args(&context->args);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wsfs_fuse_cleanup(
|
|
||||||
struct wsfs_fuse_context * context)
|
|
||||||
{
|
|
||||||
if (NULL != context->session)
|
|
||||||
{
|
|
||||||
fuse_session_reset(context->session);
|
|
||||||
fuse_session_unmount(context->session);
|
|
||||||
fuse_session_destroy(context->session);
|
|
||||||
context->session = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(context->buffer.mem);
|
|
||||||
fuse_opt_free_args(&context->args);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wsfs_fuse_onreadable(
|
|
||||||
uv_poll_t* handle,
|
|
||||||
int WSFS_UNUSED_PARAM(status),
|
|
||||||
int WSFS_UNUSED_PARAM(events))
|
|
||||||
{
|
|
||||||
struct wsfs_fuse_context * context = handle->data;
|
|
||||||
int const result = fuse_session_receive_buf(context->session, &context->buffer);
|
|
||||||
if (0 < result)
|
|
||||||
{
|
|
||||||
fuse_session_process_buf(context->session, &context->buffer);
|
|
||||||
}
|
|
||||||
else if (-EINTR != result)
|
|
||||||
{
|
|
||||||
uv_poll_stop(handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wsfs_fuse_oninterrupt(uv_signal_t* handle, int WSFS_UNUSED_PARAM(signum))
|
|
||||||
{
|
|
||||||
uv_poll_t * poll_handle = handle->data;
|
|
||||||
uv_poll_stop(poll_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
int wsfs_operations_loop(
|
|
||||||
char * mount_point,
|
|
||||||
struct wsfs_jsonrpc * rpc)
|
|
||||||
{
|
|
||||||
uv_loop_t * loop = malloc(sizeof(uv_loop_t));
|
|
||||||
uv_loop_init(loop);
|
|
||||||
|
|
||||||
struct wsfs_fuse_context context;
|
|
||||||
if (wsfs_fuse_init(&context, mount_point, rpc))
|
|
||||||
{
|
|
||||||
uv_poll_t handle;
|
|
||||||
uv_poll_init(loop, &handle, context.fd);
|
|
||||||
handle.data = &context;
|
|
||||||
uv_poll_start(&handle, UV_READABLE, &wsfs_fuse_onreadable);
|
|
||||||
|
|
||||||
uv_signal_t signal_interrupt;
|
|
||||||
uv_signal_init(loop, &signal_interrupt);
|
|
||||||
signal_interrupt.data = &handle;
|
|
||||||
uv_signal_start_oneshot(&signal_interrupt, &wsfs_fuse_oninterrupt, SIGINT);
|
|
||||||
|
|
||||||
uv_run(loop, UV_RUN_DEFAULT);
|
|
||||||
|
|
||||||
uv_close((uv_handle_t*) &signal_interrupt, NULL);
|
|
||||||
uv_close((uv_handle_t*) &handle, NULL);
|
|
||||||
uv_run(loop, UV_RUN_DEFAULT);
|
|
||||||
|
|
||||||
wsfs_fuse_cleanup(&context);
|
|
||||||
}
|
|
||||||
|
|
||||||
uv_loop_close(loop);
|
|
||||||
free(loop);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
#ifndef _WSFS_SERVER_H
|
|
||||||
#define _WSFS_SERVER_H
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
#include <stddef.h>
|
|
||||||
#else
|
|
||||||
#include <cstddef>
|
|
||||||
using std::size_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct wsfs_server;
|
|
||||||
struct wsfs_jsonrpc;
|
|
||||||
|
|
||||||
struct wsfs_server_config
|
|
||||||
{
|
|
||||||
char * document_root;
|
|
||||||
char * key_path;
|
|
||||||
char * cert_path;
|
|
||||||
char * vhost_name;
|
|
||||||
int port;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void wsfs_server_config_clear(
|
|
||||||
struct wsfs_server_config * config);
|
|
||||||
|
|
||||||
extern struct wsfs_server * wsfs_server_create(
|
|
||||||
struct wsfs_server_config * config);
|
|
||||||
|
|
||||||
extern void wsfs_server_dispose(
|
|
||||||
struct wsfs_server * server);
|
|
||||||
|
|
||||||
extern struct wsfs_jsonrpc * wsfs_server_get_jsonrpc_service(
|
|
||||||
struct wsfs_server * server);
|
|
||||||
|
|
||||||
extern void wsfs_server_start(
|
|
||||||
struct wsfs_server * server);
|
|
||||||
|
|
||||||
extern void wsfs_server_wakeup(
|
|
||||||
struct wsfs_server * server);
|
|
||||||
|
|
||||||
extern void wsfs_server_handle_message(
|
|
||||||
struct wsfs_server * server,
|
|
||||||
char const * message,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
#include "wsfs/server_config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static char * wsfs_server_config_strdup(char const * value)
|
||||||
|
{
|
||||||
|
char * result = NULL;
|
||||||
|
if (NULL != value)
|
||||||
|
{
|
||||||
|
result = strdup(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_config_init(
|
||||||
|
struct wsfs_server_config * config)
|
||||||
|
{
|
||||||
|
memset(config, 0, sizeof(struct wsfs_server_config));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_config_cleanup(
|
||||||
|
struct wsfs_server_config * config)
|
||||||
|
{
|
||||||
|
free(config->mount_point);
|
||||||
|
free(config->document_root);
|
||||||
|
free(config->key_path);
|
||||||
|
free(config->cert_path);
|
||||||
|
free(config->vhost_name);
|
||||||
|
|
||||||
|
wsfs_server_config_init(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_config_clone(
|
||||||
|
struct wsfs_server_config * config,
|
||||||
|
struct wsfs_server_config * clone)
|
||||||
|
{
|
||||||
|
clone->mount_point = wsfs_server_config_strdup(config->mount_point);
|
||||||
|
clone->document_root = wsfs_server_config_strdup(config->document_root);
|
||||||
|
clone->key_path = wsfs_server_config_strdup(config->key_path);
|
||||||
|
clone->cert_path = wsfs_server_config_strdup(config->cert_path);
|
||||||
|
clone->vhost_name = wsfs_server_config_strdup(config->vhost_name);
|
||||||
|
clone->port = config->port;
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
#include "wsfs/server_protocol_intern.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <libwebsockets.h>
|
||||||
|
|
||||||
|
#include "wsfs/filesystem.h"
|
||||||
|
#include "wsfs/util.h"
|
||||||
|
|
||||||
|
static int wsfs_server_protocol_callback(
|
||||||
|
struct lws * wsi,
|
||||||
|
enum lws_callback_reasons reason,
|
||||||
|
void * WSFS_UNUSED_PARAM(user),
|
||||||
|
void * WSFS_UNUSED_PARAM(in),
|
||||||
|
size_t WSFS_UNUSED_PARAM(len))
|
||||||
|
{
|
||||||
|
struct lws_protocols const * ws_protocol = lws_get_protocol(wsi);
|
||||||
|
struct wsfs_server_protocol * protocol = ws_protocol->user;
|
||||||
|
|
||||||
|
switch (reason)
|
||||||
|
{
|
||||||
|
case LWS_CALLBACK_PROTOCOL_INIT:
|
||||||
|
{
|
||||||
|
lws_sock_file_fd_type fd;
|
||||||
|
fd.filefd = wsfs_filesystem_get_fd(&protocol->filesystem);
|
||||||
|
if (!lws_adopt_descriptor_vhost(lws_get_vhost(wsi), LWS_ADOPT_RAW_FILE_DESC, fd, ws_protocol->name, NULL))
|
||||||
|
{
|
||||||
|
puts("error: unable to adopt fd");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LWS_CALLBACK_RAW_RX_FILE:
|
||||||
|
{
|
||||||
|
puts("fd readable");
|
||||||
|
wsfs_filesystem_process_request(&protocol->filesystem);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wsfs_server_protocol * wsfs_server_protocol_create(
|
||||||
|
char * mount_point)
|
||||||
|
{
|
||||||
|
struct wsfs_server_protocol * protocol = malloc(sizeof(struct wsfs_server_protocol));
|
||||||
|
if (NULL != protocol)
|
||||||
|
{
|
||||||
|
wsfs_server_protocol_init(protocol, mount_point);
|
||||||
|
}
|
||||||
|
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_protocol_dispose(
|
||||||
|
struct wsfs_server_protocol * protocol)
|
||||||
|
{
|
||||||
|
wsfs_server_protocol_cleanup(protocol);
|
||||||
|
free(protocol);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_protocol_init_lws(
|
||||||
|
struct wsfs_server_protocol * protocol,
|
||||||
|
struct lws_protocols * lws_protocol)
|
||||||
|
{
|
||||||
|
lws_protocol->callback = &wsfs_server_protocol_callback;
|
||||||
|
lws_protocol->per_session_data_size = 0;
|
||||||
|
lws_protocol->user = protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_protocol_init(
|
||||||
|
struct wsfs_server_protocol * protocol,
|
||||||
|
char * mount_point)
|
||||||
|
{
|
||||||
|
wsfs_filesystem_init(&protocol->filesystem, mount_point);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsfs_server_protocol_cleanup(
|
||||||
|
struct wsfs_server_protocol * protocol)
|
||||||
|
{
|
||||||
|
wsfs_filesystem_cleanup(&protocol->filesystem);
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _WSFS_SERVER_PROTOCOL_INTERN_H
|
||||||
|
#define _WSFS_SERVER_PROTOCOL_INTERN_H
|
||||||
|
|
||||||
|
#include "wsfs/server_protocol.h"
|
||||||
|
#include "wsfs/filesystem.h"
|
||||||
|
|
||||||
|
struct wsfs_server_protocol
|
||||||
|
{
|
||||||
|
struct wsfs_filesystem filesystem;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void wsfs_server_protocol_init(
|
||||||
|
struct wsfs_server_protocol * protocol,
|
||||||
|
char * mount_point);
|
||||||
|
|
||||||
|
extern void wsfs_server_protocol_cleanup(
|
||||||
|
struct wsfs_server_protocol * protocol);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in new issue