summaryrefslogtreecommitdiff
path: root/lib9p/tests
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-02 10:02:33 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-09 23:45:29 -0700
commit3f81fba2750222d633f972cd61b4e06f01f52482 (patch)
tree587f120e90e2c7962052e02b3fe92261f8bfc7b7 /lib9p/tests
parent06eed899486daeec8ad2718c74d70f91fa0dbb25 (diff)
lib9p: srv: Use libobj instead of vcall.h
Diffstat (limited to 'lib9p/tests')
-rw-r--r--lib9p/tests/test_server/main.c107
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 ***********************************************************************/