summaryrefslogtreecommitdiff
path: root/cmd/srv9p
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/srv9p')
-rw-r--r--cmd/srv9p/CMakeLists.txt1
-rw-r--r--cmd/srv9p/main.c30
-rw-r--r--cmd/srv9p/static.c84
-rw-r--r--cmd/srv9p/static.h27
4 files changed, 141 insertions, 1 deletions
diff --git a/cmd/srv9p/CMakeLists.txt b/cmd/srv9p/CMakeLists.txt
index 3db8795..8aadb28 100644
--- a/cmd/srv9p/CMakeLists.txt
+++ b/cmd/srv9p/CMakeLists.txt
@@ -5,6 +5,7 @@
add_executable(srv9p
main.c
+ static.c
)
target_include_directories(srv9p PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/config)
target_link_libraries(srv9p
diff --git a/cmd/srv9p/main.c b/cmd/srv9p/main.c
index 2c403df..f62617d 100644
--- a/cmd/srv9p/main.c
+++ b/cmd/srv9p/main.c
@@ -5,16 +5,44 @@
#include <libnetio/netio.h>
#include <lib9p/srv.h>
+#include "static.h"
+
#define USE_CONFIG_COROUTINE
#include "config.h"
+#define UNUSED(name) /* name __attribute__((unused)) */
+
+static struct static_dir_data root = {
+ .u_name = "root", .u_num = 0, /* owner user */
+ .g_name = "root", .g_num = 0, /* owner group */
+ .m_name = "root", .m_num = 0, /* last-modified-by user */
+
+ .pathnum = __COUNTER__,
+ .name = "",
+ .perm = 0555,
+ .atime = 1728337904,
+ .mtime = 1728337904,
+
+ .members = {
+ NULL,
+ },
+};
+
+struct lib9p_srv_file fs_root(struct lib9p_srv_ctx *UNUSED(ctx), char *UNUSED(treename)) {
+ return (struct lib9p_srv_file){
+ .vtable = static_dir_vtable,
+ .impldata = &root,
+ };
+}
+
int main() {
int sock = netio_listen(9000);
if (sock < 0)
error(1, -sock, "netio_listen");
struct lib9p_srv srv = {
- .sockfd = sock,
+ .sockfd = sock,
+ .rootdir = fs_root,
};
for (int i = 0; i < CONFIG_NETIO_NUM_CONNS; i++)
diff --git a/cmd/srv9p/static.c b/cmd/srv9p/static.c
new file mode 100644
index 0000000..f992764
--- /dev/null
+++ b/cmd/srv9p/static.c
@@ -0,0 +1,84 @@
+#include <assert.h>
+
+#include "static.h"
+
+#define UNUSED(name) /* name __attribute__((unused)) */
+
+static struct lib9p_srv_io static_dir_io(struct lib9p_srv_ctx *ctx, void *UNUSED(impl), lib9p_o_t UNUSED(flags)) {
+ struct lib9p_srv_io iohandle = {0};
+ lib9p_error(&ctx->basectx, LINUX_EFAULT, "TODO: io");
+ return iohandle;
+}
+
+#define p9_str(cstr) ((struct lib9p_s){ .len = strlen(cstr), .utf8 = cstr })
+#define p9_nulstr ((struct lib9p_s){ .len = 0, .utf8 = NULL })
+
+static struct lib9p_stat static_dir_stat(struct lib9p_srv_ctx *UNUSED(ctx), void *_data) {
+ struct static_dir_data *data = _data;
+ assert(data);
+
+ struct lib9p_stat stat = {
+ .kern_type = 0,
+ .kern_dev = 0,
+ .file_qid = {
+ .type = LIB9P_QT_DIR,
+ .vers = 1,
+ .path = data->pathnum,
+ },
+ .file_mode = LIB9P_DM_DIR | (data->perm & 0555),
+ .file_atime = data->atime,
+ .file_mtime = data->mtime,
+ .file_size = 0,
+ .file_name = p9_str(data->name),
+ .file_owner_uid = p9_str(data->u_name),
+ .file_owner_gid = p9_str(data->g_name),
+ .file_last_modified_uid = p9_str(data->m_name),
+ .file_extension = p9_nulstr,
+ .file_owner_n_uid = data->u_num,
+ .file_owner_n_gid = data->g_num,
+ .file_last_modified_n_uid = data->m_num,
+ };
+ return stat;
+}
+
+static void static_dir_wstat(struct lib9p_srv_ctx *ctx, void *UNUSED(_data),
+ struct lib9p_stat UNUSED(new)) {
+ lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem");
+}
+
+static void static_dir_remove(struct lib9p_srv_ctx *ctx, void *UNUSED(_data)) {
+ lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem");
+}
+
+static void static_dir_free(struct lib9p_srv_ctx *UNUSED(ctx), void *UNUSED(_data)) {}
+
+static struct lib9p_srv_file static_dir_dopen(struct lib9p_srv_ctx *ctx, void *UNUSED(_data),
+ char *UNUSED(childname)) {
+ struct lib9p_srv_file file= {0};
+ lib9p_error(&ctx->basectx, LINUX_EFAULT, "TODO: dopen");
+ return file;
+}
+
+static struct lib9p_srv_file static_dir_dcreate(struct lib9p_srv_ctx *ctx, void *UNUSED(_data),
+ char *UNUSED(childname),
+ lib9p_dm_t UNUSED(perm), lib9p_o_t UNUSED(flags)) {
+ struct lib9p_srv_file file = {0};
+ lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem");
+ return file;
+}
+
+struct lib9p_srv_file_vtable static_dir_vtable = {
+ .io = static_dir_io,
+ .stat = static_dir_stat,
+ .wstat = static_dir_wstat,
+ .remove = static_dir_remove,
+ .free = static_dir_free,
+ .dopen = static_dir_dopen,
+ .dcreate = static_dir_dcreate,
+};
+
+/*
+ struct lib9p_srv_io_dir_vtable static_dir_io_vtable = {
+ .readdir = TODO,
+ };
+*/
diff --git a/cmd/srv9p/static.h b/cmd/srv9p/static.h
new file mode 100644
index 0000000..90bad4b
--- /dev/null
+++ b/cmd/srv9p/static.h
@@ -0,0 +1,27 @@
+#ifndef _STATIC_H_
+#define _STATIC_H_
+
+#include <lib9p/srv.h>
+
+struct static_dir_data {
+ char *u_name;
+ uint32_t u_num;
+ char *g_name;
+ uint32_t g_num;
+ char *m_name;
+ uint32_t m_num;
+
+ uint64_t pathnum;
+ char *name;
+ lib9p_dm_t perm;
+ uint32_t atime, mtime;
+
+ /* NULL-terminated */
+ struct lib9p_srv_file *members[];
+};
+
+extern struct lib9p_srv_file_vtable static_dir_vtable;
+
+//extern struct lib9p_srv_io_dir_vtable static_dir_io_vtable;
+
+#endif /* _STATIC_H_ */