diff options
author | Omar Rizwan <omar.rizwan@gmail.com> | 2018-11-10 00:20:57 -0800 |
---|---|---|
committer | Omar Rizwan <omar.rizwan@gmail.com> | 2018-11-10 00:20:57 -0800 |
commit | 3708425a99b8cda83f7fc0f1ce4e5c38948de065 (patch) | |
tree | cde7df448938b041276cfb4dee62cd4bdd74868d /fs |
Initial commit. C stub with Web grafted on.
Diffstat (limited to 'fs')
-rw-r--r-- | fs/Makefile | 30 | ||||
-rw-r--r-- | fs/hello.c | 178 | ||||
m--------- | fs/mmx | 0 |
3 files changed, 208 insertions, 0 deletions
diff --git a/fs/Makefile b/fs/Makefile new file mode 100644 index 0000000..a854880 --- /dev/null +++ b/fs/Makefile @@ -0,0 +1,30 @@ +TARGETS = hello + +# Root for OSXFUSE includes and libraries +OSXFUSE_ROOT = /usr/local +#OSXFUSE_ROOT = /opt/local + +INCLUDE_DIR = $(OSXFUSE_ROOT)/include/osxfuse/fuse +LIBRARY_DIR = $(OSXFUSE_ROOT)/lib + +CC ?= gcc + +CFLAGS_OSXFUSE = -I$(INCLUDE_DIR) -L$(LIBRARY_DIR) +CFLAGS_OSXFUSE += -DFUSE_USE_VERSION=26 +CFLAGS_OSXFUSE += -D_FILE_OFFSET_BITS=64 +CFLAGS_OSXFUSE += -D_DARWIN_USE_64_BIT_INODE + +CFLAGS_EXTRA = -Wall -g $(CFLAGS) + +LIBS = -losxfuse + +.c: + $(CC) $(CFLAGS_OSXFUSE) $(CFLAGS_EXTRA) -o $@ $< $(LIBS) + +all: $(TARGETS) + +hello: hello.c + +clean: + rm -f $(TARGETS) *.o + rm -rf *.dSYM diff --git a/fs/hello.c b/fs/hello.c new file mode 100644 index 0000000..d136cf8 --- /dev/null +++ b/fs/hello.c @@ -0,0 +1,178 @@ +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <stdlib.h> +#include <fuse.h> + +#define WBY_STATIC +#define WBY_IMPLEMENTATION +#define WBY_USE_FIXED_TYPES +#define WBY_USE_ASSERT +#include "mmx/web.h" + + +#define MAX_WSCONN 8 +struct server_state { + int quit; + unsigned frame_counter; + struct wby_con *conn[MAX_WSCONN]; + int conn_count; +}; + + +static const char *file_path = "/hello.txt"; +static const char file_content[] = "Hello World!\n"; +static const size_t file_size = sizeof(file_content)/sizeof(char) - 1; + +static int +hello_getattr(const char *path, struct stat *stbuf) +{ + memset(stbuf, 0, sizeof(struct stat)); + + if (strcmp(path, "/") == 0) { /* The root directory of our file system. */ + stbuf->st_mode = S_IFDIR | 0755; + stbuf->st_nlink = 3; + } else if (strcmp(path, file_path) == 0) { /* The only file we have. */ + stbuf->st_mode = S_IFREG | 0444; + stbuf->st_nlink = 1; + stbuf->st_size = file_size; + } else /* We reject everything else. */ + return -ENOENT; + + return 0; +} + +static int +hello_open(const char *path, struct fuse_file_info *fi) +{ + if (strcmp(path, file_path) != 0) /* We only recognize one file. */ + return -ENOENT; + + if ((fi->flags & O_ACCMODE) != O_RDONLY) /* Only reading allowed. */ + return -EACCES; + + return 0; +} + +static int +hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi) +{ + if (strcmp(path, "/") != 0) /* We only recognize the root directory. */ + return -ENOENT; + + filler(buf, ".", NULL, 0); /* Current directory (.) */ + filler(buf, "..", NULL, 0); /* Parent directory (..) */ + filler(buf, file_path + 1, NULL, 0); /* The only file we have. */ + + return 0; +} + +static int +hello_read(const char *path, char *buf, size_t size, off_t offset, + struct fuse_file_info *fi) +{ + if (strcmp(path, file_path) != 0) + return -ENOENT; + + if (offset >= file_size) /* Trying to read past the end of file. */ + return 0; + + if (offset + size > file_size) /* Trim the read to the file size. */ + size = file_size - offset; + + memcpy(buf, file_content + offset, size); /* Provide the content. */ + + return size; +} + +static struct fuse_operations hello_filesystem_operations = { + .getattr = hello_getattr, /* To provide size, permissions, etc. */ + .open = hello_open, /* To enforce read-only access. */ + .read = hello_read, /* To provide file content. */ + .readdir = hello_readdir, /* To provide directory listing. */ +}; + +static int +dispatch(struct wby_con *connection, void *userdata) +{ + struct server_state *state = (struct server_state*)userdata; + if (!strcmp("/foo", connection->request.uri)) { + wby_response_begin(connection, 200, 14, NULL, 0); + wby_write(connection, "Hello, world!\n", 14); + wby_response_end(connection); + return 0; + } else if (!strcmp("/bar", connection->request.uri)) { + wby_response_begin(connection, 200, -1, NULL, 0); + wby_write(connection, "Hello, world!\n", 14); + wby_write(connection, "Hello, world?\n", 14); + wby_response_end(connection); + return 0; + } else if (!strcmp("/quit", connection->request.uri)) { + wby_response_begin(connection, 200, -1, NULL, 0); + wby_write(connection, "Goodbye, cruel world\n", 22); + wby_response_end(connection); + state->quit = 1; + return 0; + } else return 1; +} + +int +main(int argc, char **argv) +{ + void *memory = NULL; + wby_size needed_memory = 0; + struct server_state state; + struct wby_server server; + + struct wby_config config; + memset(&config, 0, sizeof config); + config.userdata = &state; + config.address = "127.0.0.1"; + config.port = 8888; + config.connection_max = 4; + config.request_buffer_size = 2048; + config.io_buffer_size = 8192; + /* config.log = test_log; */ + config.dispatch = dispatch; + /* config.ws_connect = websocket_connect; */ + /* config.ws_connected = websocket_connected; */ + /* config.ws_frame = websocket_frame; */ + /* config.ws_closed = websocket_closed; */ + +#if defined(_WIN32) + {WORD wsa_version = MAKEWORD(2,2); + WSADATA wsa_data; + if (WSAStartup(wsa_version, &wsa_data)) { + fprintf(stderr, "WSAStartup failed\n"); + return 1; + }} +#endif + + wby_init(&server, &config, &needed_memory); + memory = calloc(needed_memory, 1); + wby_start(&server, memory); + + memset(&state, 0, sizeof state); + while (!state.quit) { + int i = 0; + wby_update(&server); + /* Push some test data over websockets */ + if (!(state.frame_counter & 0x7f)) { + for (i = 0; i < state.conn_count; ++i) { + wby_frame_begin(state.conn[i], WBY_WSOP_TEXT_FRAME); + wby_write(state.conn[i], "Hello world over websockets!\n", 29); + wby_frame_end(state.conn[i]); + } + } + /* sleep_for(30); */ + ++state.frame_counter; + } + wby_stop(&server); + free(memory); +#if defined(_WIN32) + WSACleanup(); +#endif + return 0; + // return fuse_main(argc, argv, &hello_filesystem_operations, NULL); +} diff --git a/fs/mmx b/fs/mmx new file mode 160000 +Subproject 0de21306c5131cf1e51bb7356fc39d13c5ee847 |