From 026afb5113fbeed097308a0fe43da105b549c807 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 9 Feb 2025 20:23:55 -0700 Subject: lib9p: test_server: Make the pathnums more stable --- lib9p/tests/runtest | 2 +- lib9p/tests/test_server/main.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'lib9p/tests') diff --git a/lib9p/tests/runtest b/lib9p/tests/runtest index bb83a83..02cd791 100755 --- a/lib9p/tests/runtest +++ b/lib9p/tests/runtest @@ -43,7 +43,7 @@ expect_lines \ out=$("${client[@]}" stat 'Documentation/x') expect_lines \ - "'x' 'root' 'root' 'root' q (0000000000000008 1 ) m 0444 at 1728337905 mt 1728337904 l 4 t 0 d 0" + "'x' 'root' 'root' 'root' q (0000000000000003 1 ) m 0444 at 1728337905 mt 1728337904 l 4 t 0 d 0" out=$("${client[@]}" write 'shutdown' <<<1) expect_lines '' diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index 07fc74b..7211322 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -108,6 +108,9 @@ static struct lib9p_srv_file_vtable api_file_vtable = { /* file tree ******************************************************************/ +enum { PATH_BASE = __COUNTER__ }; +#define PATH_COUNTER __COUNTER__ - PATH_BASE + #define FILE_COMMON(NAME) { \ .vtable = &util9p_static_file_vtable, \ \ @@ -115,7 +118,7 @@ static struct lib9p_srv_file_vtable api_file_vtable = { .g_name = "root", .g_num = 0, /* owner group */ \ .m_name = "root", .m_num = 0, /* last-modified-by user */ \ \ - .pathnum = __COUNTER__, \ + .pathnum = PATH_COUNTER, \ .name = NAME, \ .perm = 0444, \ .atime = 1728337905, \ @@ -129,7 +132,7 @@ static struct lib9p_srv_file_vtable api_file_vtable = { .g_name = "root", .g_num = 0, /* owner group */ \ .m_name = "root", .m_num = 0, /* last-modified-by user */ \ \ - .pathnum = __COUNTER__, \ + .pathnum = PATH_COUNTER, \ .name = NAME, \ .perm = 0555, \ .atime = 1728337905, \ @@ -156,7 +159,7 @@ static struct util9p_static_dir root = { STATIC_FILE("README.md", README_md), &((struct api_file){ .vtable = &api_file_vtable, - .pathnum = __COUNTER__, + .pathnum = PATH_COUNTER, }), NULL, }, -- cgit v1.2.3-2-g168b From fa10ceb13e66309ba24605dd5df91c4d626f0614 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 9 Feb 2025 22:20:00 -0700 Subject: lib9p: test_server: Simplify construction of the file tree --- lib9p/tests/runtest | 2 +- lib9p/tests/test_server/main.c | 91 +++++++++++++++++++----------------------- 2 files changed, 42 insertions(+), 51 deletions(-) (limited to 'lib9p/tests') diff --git a/lib9p/tests/runtest b/lib9p/tests/runtest index 02cd791..0966000 100755 --- a/lib9p/tests/runtest +++ b/lib9p/tests/runtest @@ -43,7 +43,7 @@ expect_lines \ out=$("${client[@]}" stat 'Documentation/x') expect_lines \ - "'x' 'root' 'root' 'root' q (0000000000000003 1 ) m 0444 at 1728337905 mt 1728337904 l 4 t 0 d 0" + "'x' 'root' 'root' 'root' q (0000000000000001 1 ) m 0444 at 1728337905 mt 1728337904 l 4 t 0 d 0" out=$("${client[@]}" write 'shutdown' <<<1) expect_lines '' diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index 7211322..f4b21db 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -111,59 +111,50 @@ static struct lib9p_srv_file_vtable api_file_vtable = { enum { PATH_BASE = __COUNTER__ }; #define PATH_COUNTER __COUNTER__ - PATH_BASE -#define FILE_COMMON(NAME) { \ - .vtable = &util9p_static_file_vtable, \ - \ - .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 = PATH_COUNTER, \ - .name = NAME, \ - .perm = 0444, \ - .atime = 1728337905, \ - .mtime = 1728337904, \ - } - -#define DIR_COMMON(NAME) { \ - .vtable = &util9p_static_dir_vtable, \ - \ - .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 = PATH_COUNTER, \ - .name = NAME, \ - .perm = 0555, \ - .atime = 1728337905, \ - .mtime = 1728337904, \ - } +#define STATIC_FILE(STRNAME, SYMNAME) \ + ((struct util9p_static_file){ \ + ._util9p_static_common = { \ + .vtable = &util9p_static_file_vtable, \ + \ + .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 = PATH_COUNTER, \ + .name = STRNAME, \ + .perm = 0444, \ + .atime = 1728337905, \ + .mtime = 1728337904, \ + }, \ + .data_start = _binary_static_##SYMNAME##_start, \ + .data_end = _binary_static_##SYMNAME##_end, \ + }) -#define STATIC_FILE(STRNAME, SYMNAME) \ - &((static struct util9p_static_file){ \ - ._util9p_static_common = FILE_COMMON(STRNAME), \ - .data_start = _binary_static_##SYMNAME##_start, \ - .data_end = _binary_static_##SYMNAME##_end, \ +#define STATIC_DIR(STRNAME, ...) \ + ((struct util9p_static_dir){ \ + ._util9p_static_common = { \ + .vtable = &util9p_static_dir_vtable, \ + \ + .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 = PATH_COUNTER, \ + .name = STRNAME, \ + .perm = 0555, \ + .atime = 1728337905, \ + .mtime = 1728337904, \ + }, \ + .members = { __VA_ARGS__ __VA_OPT__(,) NULL }, \ }) -static struct util9p_static_dir root = { - ._util9p_static_common = DIR_COMMON(""), - .members = { - &((static struct util9p_static_dir){ - ._util9p_static_common = DIR_COMMON("Documentation"), - .members = { - STATIC_FILE("x", Documentation_x), - NULL - }, - }), - STATIC_FILE("README.md", README_md), - &((struct api_file){ - .vtable = &api_file_vtable, - .pathnum = PATH_COUNTER, - }), - NULL, - }, -}; +/* NB: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118814 */ +static struct util9p_static_dir root = + STATIC_DIR("", + &STATIC_DIR("Documentation", + &STATIC_FILE("x", Documentation_x)), + &STATIC_FILE("README.md", README_md), + &((struct api_file){.vtable = &api_file_vtable, .pathnum = PATH_COUNTER})); static implements_lib9p_srv_file *get_root(struct lib9p_srv_ctx *LM_UNUSED(ctx), struct lib9p_s LM_UNUSED(treename)) { return &root; -- cgit v1.2.3-2-g168b From 4a6fbecab34616a7b16a859f9458a21b339bb6b0 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 2 Feb 2025 02:01:30 -0700 Subject: Have main() set `bootclock` --- lib9p/tests/test_server/main.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib9p/tests') diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index f4b21db..b979a4b 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -193,6 +194,11 @@ static COROUTINE init_cr(void *) { } int main() { + struct hostclock clock_monotonic = { + .vtable = &hostclock_vtable, + .clock_id = CLOCK_MONOTONIC, + }; + bootclock = &clock_monotonic; coroutine_add("init", init_cr, NULL); coroutine_main(); return 0; -- cgit v1.2.3-2-g168b From 41ac4f8dfddc8d003cb3174d466a58fa14701d35 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 2 Feb 2025 02:01:30 -0700 Subject: libhw_generic: alarmclock: Use libobj instead of vcall.h --- lib9p/tests/test_server/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib9p/tests') diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index b979a4b..8df3da0 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "static.h" @@ -195,10 +196,9 @@ static COROUTINE init_cr(void *) { int main() { struct hostclock clock_monotonic = { - .vtable = &hostclock_vtable, .clock_id = CLOCK_MONOTONIC, }; - bootclock = &clock_monotonic; + bootclock = lo_box_hostclock_as_alarmclock(&clock_monotonic); coroutine_add("init", init_cr, NULL); coroutine_main(); return 0; -- cgit v1.2.3-2-g168b From 06eed899486daeec8ad2718c74d70f91fa0dbb25 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 2 Feb 2025 02:01:30 -0700 Subject: libhw_generic: net: Use libobj instead of vcall.h --- lib9p/tests/test_server/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib9p/tests') diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index 8df3da0..6655f67 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -91,7 +91,7 @@ static uint32_t api_pwrite(implements_lib9p_srv_file *, struct lib9p_srv_ctx *, if (byte_count == 0) return 0; for (int i = 0; i < CONFIG_SRV9P_NUM_CONNS; i++) - VCALL(&globals.listeners[i], close); + LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&globals.listeners[i]), close); return byte_count; } @@ -170,7 +170,7 @@ static COROUTINE read_cr(void *_i) { hostnet_tcp_listener_init(&globals.listeners[i], 9000); - lib9p_srv_read_cr(&globals.srv, &globals.listeners[i]); + lib9p_srv_read_cr(&globals.srv, lo_box_hostnet_tcplist_as_net_stream_listener(&globals.listeners[i])); cr_end(); } -- cgit v1.2.3-2-g168b From 3f81fba2750222d633f972cd61b4e06f01f52482 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 2 Feb 2025 10:02:33 -0700 Subject: lib9p: srv: Use libobj instead of vcall.h --- lib9p/tests/test_server/main.c | 107 ++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 49 deletions(-) (limited to 'lib9p/tests') diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c index 6655f67..10f67a3 100644 --- a/lib9p/tests/test_server/main.c +++ b/lib9p/tests/test_server/main.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include "static.h" @@ -28,7 +27,7 @@ /* globals ********************************************************************/ -static implements_lib9p_srv_file *get_root(struct lib9p_srv_ctx *, struct lib9p_s); +static lo_interface lib9p_srv_file get_root(struct lib9p_srv_ctx *, struct lib9p_s); const char *hexdig = "0123456789abcdef"; @@ -44,31 +43,31 @@ struct { /* api ************************************************************************/ struct api_file { - implements_lib9p_srv_file; - uint64_t pathnum; }; +LO_IMPLEMENTATION_H(lib9p_srv_file, struct api_file, api) +LO_IMPLEMENTATION_C(lib9p_srv_file, struct api_file, api, static) -static void api_free(implements_lib9p_srv_file *) {} -static uint32_t api_chio(implements_lib9p_srv_file *, struct lib9p_srv_ctx *, bool, bool, bool) { return 0; } - -static void api_wstat(implements_lib9p_srv_file *, struct lib9p_srv_ctx *ctx, struct lib9p_stat) { lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot wstat API file"); } -static void api_remove(implements_lib9p_srv_file *, struct lib9p_srv_ctx *ctx) { lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot remove API file"); } - -static struct lib9p_qid api_qid(implements_lib9p_srv_file *_self) { - struct api_file *self = VCALL_SELF(struct api_file, implements_lib9p_srv_file, _self); +static void api_free(struct api_file *self) { + assert(self); +} +static struct lib9p_qid api_qid(struct api_file *self) { assert(self); - return (struct lib9p_qid){ .type = LIB9P_QT_FILE, .vers = 1, .path = self->pathnum, }; } -static struct lib9p_stat api_stat(implements_lib9p_srv_file *_self, struct lib9p_srv_ctx *) { - struct api_file *self = VCALL_SELF(struct api_file, implements_lib9p_srv_file, _self); +static uint32_t api_chio(struct api_file *self, struct lib9p_srv_ctx *ctx, bool, bool, bool) { assert(self); + assert(ctx); + return 0; +} +static struct lib9p_stat api_stat(struct api_file *self, struct lib9p_srv_ctx *ctx) { + assert(self); + assert(ctx); return (struct lib9p_stat){ .kern_type = 0, .kern_dev = 0, @@ -87,37 +86,50 @@ static struct lib9p_stat api_stat(implements_lib9p_srv_file *_self, struct lib9p .file_last_modified_n_uid = 0, }; } -static uint32_t api_pwrite(implements_lib9p_srv_file *, struct lib9p_srv_ctx *, void *, uint32_t byte_count, uint64_t) { +static void api_wstat(struct api_file *self, struct lib9p_srv_ctx *ctx, struct lib9p_stat) { + assert(self); + assert(ctx); + lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot wstat API file"); +} +static void api_remove(struct api_file *self, struct lib9p_srv_ctx *ctx) { + assert(self); + assert(ctx); + lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot remove API file"); +} + +LIB9P_SRV_NOTDIR(struct api_file, api) + +static uint32_t api_pwrite(struct api_file *self, struct lib9p_srv_ctx *ctx, void *buf, uint32_t byte_count, uint64_t LM_UNUSED(offset)) { + assert(self); + assert(ctx); + assert(buf); if (byte_count == 0) return 0; for (int i = 0; i < CONFIG_SRV9P_NUM_CONNS; i++) LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&globals.listeners[i]), close); return byte_count; } - -static struct lib9p_srv_file_vtable api_file_vtable = { - .free = api_free, - .qid = api_qid, - .chio = api_chio, - - .stat = api_stat, - .wstat = api_wstat, - .remove = api_remove, - - .pread = NULL, - .pwrite = api_pwrite, -}; +static uint32_t api_pread(struct api_file *, struct lib9p_srv_ctx *, void *, uint32_t, uint64_t) { + assert_notreached("not readable"); +} /* file tree ******************************************************************/ +#define _box(nam, obj) \ + ((struct lib9p_srv_file){ \ + .self = obj, \ + .vtable = (void*)&_lo_##nam##_lib9p_srv_file_vtable, \ + }) +#define lo_box_util9p_static_file_as_lib9p_srv_file(obj) _box(util9p_static_file, obj) +#define lo_box_util9p_static_dir_as_lib9p_srv_file(obj) _box(util9p_static_dir, obj) +#define lo_box_api_as_lib9p_srv_file(obj) _box(api, obj) + enum { PATH_BASE = __COUNTER__ }; #define PATH_COUNTER __COUNTER__ - PATH_BASE #define STATIC_FILE(STRNAME, SYMNAME) \ - ((struct util9p_static_file){ \ + lo_box_util9p_static_file_as_lib9p_srv_file(&((struct util9p_static_file){ \ ._util9p_static_common = { \ - .vtable = &util9p_static_file_vtable, \ - \ .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 */ \ @@ -130,13 +142,11 @@ enum { PATH_BASE = __COUNTER__ }; }, \ .data_start = _binary_static_##SYMNAME##_start, \ .data_end = _binary_static_##SYMNAME##_end, \ - }) + })) #define STATIC_DIR(STRNAME, ...) \ - ((struct util9p_static_dir){ \ + lo_box_util9p_static_dir_as_lib9p_srv_file(&((struct util9p_static_dir){ \ ._util9p_static_common = { \ - .vtable = &util9p_static_dir_vtable, \ - \ .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 */ \ @@ -147,19 +157,18 @@ enum { PATH_BASE = __COUNTER__ }; .atime = 1728337905, \ .mtime = 1728337904, \ }, \ - .members = { __VA_ARGS__ __VA_OPT__(,) NULL }, \ - }) - -/* NB: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118814 */ -static struct util9p_static_dir root = - STATIC_DIR("", - &STATIC_DIR("Documentation", - &STATIC_FILE("x", Documentation_x)), - &STATIC_FILE("README.md", README_md), - &((struct api_file){.vtable = &api_file_vtable, .pathnum = PATH_COUNTER})); - -static implements_lib9p_srv_file *get_root(struct lib9p_srv_ctx *LM_UNUSED(ctx), struct lib9p_s LM_UNUSED(treename)) { - return &root; + .members = { __VA_ARGS__ __VA_OPT__(,) LO_NULL(lib9p_srv_file) }, \ + })) + +struct lib9p_srv_file root = + STATIC_DIR("", + STATIC_DIR("Documentation", + STATIC_FILE("x", Documentation_x)), + STATIC_FILE("README.md", README_md), + lo_box_api_as_lib9p_srv_file(&(struct api_file){.pathnum = PATH_COUNTER})); + +static lo_interface lib9p_srv_file get_root(struct lib9p_srv_ctx *LM_UNUSED(ctx), struct lib9p_s LM_UNUSED(treename)) { + return root; } /* main ***********************************************************************/ -- cgit v1.2.3-2-g168b