parent
9036aba41b
commit
4e1c9e144c
@ -0,0 +1,162 @@
|
||||
#include "webfuse/provider.hpp"
|
||||
#include <csignal>
|
||||
#include <iostream>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
static bool shutdown_requested = false;
|
||||
|
||||
void on_signal(int _)
|
||||
{
|
||||
(void) _;
|
||||
shutdown_requested = true;
|
||||
}
|
||||
|
||||
class filesystem: public webfuse::filesystem_i
|
||||
{
|
||||
public:
|
||||
explicit filesystem(std::string const & base_path)
|
||||
: base_path_(base_path)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
~filesystem() override
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int access(std::string const & path, int mode) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int getattr(std::string const & path, struct stat * attr) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int readlink(std::string const & path, std::string & out) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int symlink(std::string const & target, std::string const & linkpath) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int link(std::string const & old_path, std::string const & new_path) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int rename(std::string const & old_path, std::string const & new_path, int flags) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int chmod(std::string const & path, mode_t mode) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int chown(std::string const & path, uid_t uid, gid_t gid) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int truncate(std::string const & path, uint64_t size, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int fsync(std::string const & path, bool is_datasync, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int utimens(std::string const &path, struct timespec tv[2], uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int open(std::string const & path, int flags, uint64_t & handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int mknod(std::string const & path, mode_t mode, dev_t rdev) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int create(std::string const & path, mode_t mode, uint64_t & handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int release(std::string const & path, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int unlink(std::string const & path) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int read(std::string const & path, char * buffer, size_t buffer_size, uint64_t offset, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int write(std::string const & path, char const * buffer, size_t buffer_size, uint64_t offset, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int mkdir(std::string const & path, mode_t mode) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int readdir(std::string const & path, std::vector<std::string> & entries, uint64_t handle) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int rmdir(std::string const & path) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int statfs(std::string const & path, struct statvfs * statistics) override
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
std::string base_path_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGINT, &on_signal);
|
||||
signal(SIGTERM, &on_signal);
|
||||
|
||||
filesystem fs(".");
|
||||
webfuse::provider provider(fs);
|
||||
provider.connect("ws://localhost:8080/");
|
||||
while (!shutdown_requested)
|
||||
{
|
||||
provider.service();
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
#ifndef WEBFUSE_MESSAGETYPE_HPP
|
||||
#define WEBFUSE_MESSAGETYPE_HPP
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
enum class message_type: uint8_t
|
||||
{
|
||||
access_req = 0x01,
|
||||
getattr_req = 0x02,
|
||||
readlink_req = 0x03,
|
||||
symlink_req = 0x04,
|
||||
link_req = 0x05,
|
||||
rename_req = 0x06,
|
||||
chmod_req = 0x07,
|
||||
chown_req = 0x08,
|
||||
truncate_req = 0x09,
|
||||
fsync_req = 0x0a,
|
||||
open_req = 0x0b,
|
||||
mknod_req = 0x0c,
|
||||
create_req = 0x0d,
|
||||
release_req = 0x0e,
|
||||
unlink_req = 0x0f,
|
||||
read_req = 0x10,
|
||||
write_req = 0x11,
|
||||
mkdir_req = 0x12,
|
||||
readdir_req = 0x13,
|
||||
rmdir_req = 0x14,
|
||||
statfs_req = 0x15,
|
||||
utimens_req = 0x16
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,94 @@
|
||||
#include "webfuse/provider.hpp"
|
||||
#include "webfuse/ws/client.hpp"
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
class provider::detail
|
||||
{
|
||||
public:
|
||||
detail(filesystem_i & fs)
|
||||
: fs_(fs)
|
||||
, client([this](auto& reader) { return this->on_message(reader); })
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
~detail()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void connect(std::string const & url)
|
||||
{
|
||||
client.connect(url);
|
||||
}
|
||||
|
||||
void service()
|
||||
{
|
||||
client.service();
|
||||
}
|
||||
|
||||
messagewriter on_message(messagereader & reader)
|
||||
{
|
||||
auto message_id = reader.read_u32();
|
||||
auto request_type = reader.read_u8();
|
||||
|
||||
messagewriter writer(response_type::unknown);
|
||||
writer.set_id(message_id);
|
||||
|
||||
switch (request_type)
|
||||
{
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return std::move(writer);
|
||||
}
|
||||
private:
|
||||
filesystem_i & fs_;
|
||||
ws_client client;
|
||||
};
|
||||
|
||||
provider::provider(filesystem_i & fs)
|
||||
: d(new detail(fs))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
provider::~provider()
|
||||
{
|
||||
delete d;
|
||||
}
|
||||
|
||||
provider::provider(provider && other)
|
||||
{
|
||||
this->d = other.d;
|
||||
other.d = nullptr;
|
||||
}
|
||||
|
||||
provider& provider::operator=(provider && other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
delete this->d;
|
||||
this->d = other.d;
|
||||
other.d = nullptr;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void provider::connect(std::string const & url)
|
||||
{
|
||||
d->connect(url);
|
||||
}
|
||||
|
||||
void provider::service()
|
||||
{
|
||||
d->service();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
#ifndef WEBFUSE_PROVIDER_I_HPP
|
||||
#define WEBFUSE_PROVIDER_I_HPP
|
||||
|
||||
#include "webfuse/filesystem/filesystem_i.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
class provider
|
||||
{
|
||||
provider(provider const &) = delete;
|
||||
provider& operator=(provider const &) = delete;
|
||||
public:
|
||||
provider(filesystem_i & fs);
|
||||
~provider();
|
||||
provider(provider && other);
|
||||
provider& operator=(provider && other);
|
||||
void connect(std::string const & url);
|
||||
void service();
|
||||
private:
|
||||
class detail;
|
||||
detail * d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,38 @@
|
||||
#ifndef WEBFUSE_REQUEST_TYPE
|
||||
#define WEBFUSE_REQUEST_TYPE
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
enum class request_type: uint8_t
|
||||
{
|
||||
unknown = 0x00,
|
||||
access = 0x01,
|
||||
getattr = 0x02,
|
||||
readlink = 0x03,
|
||||
symlink = 0x04,
|
||||
link = 0x05,
|
||||
rename = 0x06,
|
||||
chmod = 0x07,
|
||||
chown = 0x08,
|
||||
truncate = 0x09,
|
||||
fsync = 0x0a,
|
||||
open = 0x0b,
|
||||
mknod = 0x0c,
|
||||
create = 0x0d,
|
||||
release = 0x0e,
|
||||
unlink = 0x0f,
|
||||
read = 0x10,
|
||||
write = 0x11,
|
||||
mkdir = 0x12,
|
||||
readdir = 0x13,
|
||||
rmdir = 0x14,
|
||||
statfs = 0x15,
|
||||
utimens = 0x16
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,38 @@
|
||||
#ifndef WEBFUSE_RESPONSE_TYPE
|
||||
#define WEBFUSE_RESPONSE_TYPE
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
enum class response_type: uint8_t
|
||||
{
|
||||
unknown = 0x80,
|
||||
access = 0x81,
|
||||
getattr = 0x82,
|
||||
readlink = 0x83,
|
||||
symlink = 0x84,
|
||||
link = 0x85,
|
||||
rename = 0x86,
|
||||
chmod = 0x87,
|
||||
chown = 0x88,
|
||||
truncate = 0x89,
|
||||
fsync = 0x8a,
|
||||
open = 0x8b,
|
||||
mknod = 0x8c,
|
||||
create = 0x8d,
|
||||
release = 0x8e,
|
||||
unlink = 0x8f,
|
||||
read = 0x90,
|
||||
write = 0x91,
|
||||
mkdir = 0x92,
|
||||
readdir = 0x93,
|
||||
rmdir = 0x94,
|
||||
statfs = 0x95,
|
||||
utimens = 0x96
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,150 @@
|
||||
#include "webfuse/ws/client.hpp"
|
||||
#include <libwebsockets.h>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
extern "C" int webfuse_client_callback(lws * wsi, lws_callback_reasons reason, void* user, void * in, size_t length)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
lws_protocols const * protocol = lws_get_protocol(wsi);
|
||||
|
||||
if (nullptr != protocol)
|
||||
{
|
||||
switch(reason)
|
||||
{
|
||||
case LWS_CALLBACK_CLIENT_ESTABLISHED:
|
||||
std::cout << "established" << std::endl;
|
||||
break;
|
||||
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
|
||||
std::cout << "connect error" << std::endl;
|
||||
break;
|
||||
case LWS_CALLBACK_CLIENT_CLOSED:
|
||||
std::cout << "closed" << std::endl;
|
||||
break;
|
||||
case LWS_CALLBACK_CLIENT_RECEIVE:
|
||||
std::cout << "receive" << std::endl;
|
||||
break;
|
||||
case LWS_CALLBACK_SERVER_WRITEABLE:
|
||||
// fall-through
|
||||
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
||||
std::cout << "writable" << std::endl;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
class ws_client::detail
|
||||
{
|
||||
detail(detail const &) = delete;
|
||||
detail& operator=(detail const &) = delete;
|
||||
detail(detail &&) = delete;
|
||||
detail& operator=(detail &&) = delete;
|
||||
public:
|
||||
detail(ws_client_handler handler)
|
||||
: handler_(handler)
|
||||
{
|
||||
memset(reinterpret_cast<void*>(protocols), 0, sizeof(lws_protocols) * 2);
|
||||
protocols[0].callback = &webfuse_client_callback;
|
||||
protocols[0].name = "webfuse2-client";
|
||||
protocols[0].per_session_data_size = 0;
|
||||
protocols[0].user = nullptr;
|
||||
|
||||
memset(reinterpret_cast<void*>(&info), 0, sizeof(lws_context_creation_info));
|
||||
info.port = CONTEXT_PORT_NO_LISTEN;
|
||||
info.protocols = protocols;
|
||||
info.uid = -1;
|
||||
info.gid = -1;
|
||||
|
||||
context = lws_create_context(&info);
|
||||
}
|
||||
|
||||
~detail()
|
||||
{
|
||||
lws_context_destroy(context);
|
||||
}
|
||||
|
||||
void connect(std::string const & url)
|
||||
{
|
||||
lws_client_connect_info info;
|
||||
memset(reinterpret_cast<void*>(&info), 0, sizeof(lws_client_connect_info));
|
||||
info.context = context;
|
||||
info.port = 8081;
|
||||
info.address = "localhost";
|
||||
info.host = "localhost";
|
||||
info.path = "/";
|
||||
info.origin = "localhost";
|
||||
info.ssl_connection = 0;
|
||||
info.protocol = "webfuse2";
|
||||
info.local_protocol_name = "webfuse2-client";
|
||||
info.pwsi = &wsi;
|
||||
|
||||
lws_client_connect_via_info(&info);
|
||||
}
|
||||
|
||||
void service()
|
||||
{
|
||||
lws_service(context, 0);
|
||||
}
|
||||
|
||||
private:
|
||||
ws_client_handler handler_;
|
||||
lws_context_creation_info info;
|
||||
lws_protocols protocols[2];
|
||||
lws_context * context;
|
||||
lws * wsi;
|
||||
};
|
||||
|
||||
ws_client::ws_client(ws_client_handler handler)
|
||||
: d(new detail(handler))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ws_client::~ws_client()
|
||||
{
|
||||
delete d;
|
||||
}
|
||||
|
||||
ws_client::ws_client(ws_client && other)
|
||||
{
|
||||
this->d = other.d;
|
||||
other.d = nullptr;
|
||||
}
|
||||
|
||||
ws_client& ws_client::operator=(ws_client && other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
delete this->d;
|
||||
this->d = other.d;
|
||||
other.d = nullptr;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void ws_client::connect(std::string url)
|
||||
{
|
||||
d->connect(url);
|
||||
}
|
||||
|
||||
void ws_client::service()
|
||||
{
|
||||
d->service();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
#ifndef WEBFUSE_WSCLIENT_HPP
|
||||
#define WEBFUSE_WSCLIENT_HPP
|
||||
|
||||
#include "webfuse/ws/messagewriter.hpp"
|
||||
#include "webfuse/ws/messagereader.hpp"
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace webfuse
|
||||
{
|
||||
|
||||
using ws_client_handler = std::function<messagewriter (messagereader & reader)>;
|
||||
|
||||
class ws_client
|
||||
{
|
||||
ws_client(ws_client const &) = delete;
|
||||
ws_client& operator=(ws_client const &) = delete;
|
||||
public:
|
||||
ws_client(ws_client_handler handler);
|
||||
~ws_client();
|
||||
ws_client(ws_client && other);
|
||||
ws_client& operator=(ws_client && other);
|
||||
|
||||
void connect(std::string url);
|
||||
void service();
|
||||
private:
|
||||
class detail;
|
||||
detail * d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in new issue