diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-02 10:02:33 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-09 23:45:29 -0700 |
commit | 3f81fba2750222d633f972cd61b4e06f01f52482 (patch) | |
tree | 587f120e90e2c7962052e02b3fe92261f8bfc7b7 /lib9p/tests | |
parent | 06eed899486daeec8ad2718c74d70f91fa0dbb25 (diff) |
lib9p: srv: Use libobj instead of vcall.h
Diffstat (limited to 'lib9p/tests')
-rw-r--r-- | lib9p/tests/test_server/main.c | 107 |
1 files changed, 58 insertions, 49 deletions
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 <libhw/host_alarmclock.h> #include <libhw/host_net.h> #include <libmisc/macro.h> -#include <libmisc/vcall.h> #include <util9p/static.h> #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 ***********************************************************************/ |