summaryrefslogtreecommitdiff
path: root/lib9p/tests
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-10 00:06:34 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-10 00:06:34 -0700
commit6cd125e1ffd44fdf62c44d22c519561a8c9d7268 (patch)
treebf2b4a8225fe0d6f00084a1577c70bb564a20600 /lib9p/tests
parentf466cff948ec638f26a9a77a391904ebe03c4dfb (diff)
parenta51875001eb672d73c9d84d44bb32abce327b931 (diff)
Merge branch 'lukeshu/libobj-simple'
Diffstat (limited to 'lib9p/tests')
-rwxr-xr-xlib9p/tests/runtest2
-rw-r--r--lib9p/tests/test_server/main.c179
2 files changed, 95 insertions, 86 deletions
diff --git a/lib9p/tests/runtest b/lib9p/tests/runtest
index bb83a83..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 (0000000000000008 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 07fc74b..10f67a3 100644
--- a/lib9p/tests/test_server/main.c
+++ b/lib9p/tests/test_server/main.c
@@ -10,6 +10,7 @@
#include <libcr/coroutine.h>
#include <libhw/generic/net.h>
#include <libhw/generic/alarmclock.h>
+#include <libhw/host_alarmclock.h>
#include <libhw/host_net.h>
#include <libmisc/macro.h>
#include <util9p/static.h>
@@ -26,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";
@@ -42,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,
@@ -85,85 +86,89 @@ 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++)
- VCALL(&globals.listeners[i], close);
+ 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 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 = __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 = __COUNTER__, \
- .name = NAME, \
- .perm = 0555, \
- .atime = 1728337905, \
- .mtime = 1728337904, \
- }
-
-#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 _box(nam, obj) \
+ ((struct lib9p_srv_file){ \
+ .self = obj, \
+ .vtable = (void*)&_lo_##nam##_lib9p_srv_file_vtable, \
})
-
-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 = __COUNTER__,
- }),
- NULL,
- },
-};
-
-static implements_lib9p_srv_file *get_root(struct lib9p_srv_ctx *LM_UNUSED(ctx), struct lib9p_s LM_UNUSED(treename)) {
- return &root;
+#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) \
+ lo_box_util9p_static_file_as_lib9p_srv_file(&((struct util9p_static_file){ \
+ ._util9p_static_common = { \
+ .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_DIR(STRNAME, ...) \
+ lo_box_util9p_static_dir_as_lib9p_srv_file(&((struct util9p_static_dir){ \
+ ._util9p_static_common = { \
+ .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__(,) 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 ***********************************************************************/
@@ -174,7 +179,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();
}
@@ -199,6 +204,10 @@ static COROUTINE init_cr(void *) {
}
int main() {
+ struct hostclock clock_monotonic = {
+ .clock_id = CLOCK_MONOTONIC,
+ };
+ bootclock = lo_box_hostclock_as_alarmclock(&clock_monotonic);
coroutine_add("init", init_cr, NULL);
coroutine_main();
return 0;