From f6b4897e86ee68836794caa641cf0d4a93131c0f Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Thu, 9 Jan 2025 23:29:30 -0700 Subject: mv cmd/srv9p lib9p/tests/test_server # and supporting changes --- lib9p/tests/test_server/main.c | 129 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 lib9p/tests/test_server/main.c (limited to 'lib9p/tests/test_server/main.c') diff --git a/lib9p/tests/test_server/main.c b/lib9p/tests/test_server/main.c new file mode 100644 index 0000000..adeba38 --- /dev/null +++ b/lib9p/tests/test_server/main.c @@ -0,0 +1,129 @@ +/* lib9p/tests/test_server/main.c - Main entry point for test 9P server + * + * Copyright (C) 2024-2025 Luke T. Shumaker + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "static.h" + +/* configuration **************************************************************/ + +#include "config.h" + +#ifndef CONFIG_SRV9P_NUM_CONNS + #error config.h must define CONFIG_SRV9P_NUM_CONNS +#endif + +/* implementation *************************************************************/ + +/* 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, \ + }) + +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), + NULL, + }, +}; + +static implements_lib9p_srv_file *get_root(struct lib9p_srv_ctx *LM_UNUSED(ctx), char *LM_UNUSED(treename)) { + return &root; +} + +/* main ***********************************************************************/ + +static COROUTINE read_cr(void *_srv) { + struct lib9p_srv *srv = _srv; + assert(srv); + + cr_begin(); + + struct hostnet_tcp_listener listener; + hostnet_tcp_listener_init(&listener, 9000); + + lib9p_srv_read_cr(srv, &listener); + + cr_end(); +} + +const char *hexdig = "0123456789abcdef"; + +struct lib9p_srv srv = { + .rootdir = get_root, +}; + +static COROUTINE init_cr(void *) { + cr_begin(); + + for (int i = 0; i < CONFIG_SRV9P_NUM_CONNS; i++) { + char name[] = {'r', 'e', 'a', 'd', '-', hexdig[i], '\0'}; + if (!coroutine_add(name, read_cr, &srv)) + error(1, 0, "coroutine_add(read_cr, &srv)"); + sleep_for_s(1); + } + for (int i = 0; i < 2*CONFIG_SRV9P_NUM_CONNS; i++) { + char name[] = {'w', 'r', 'i', 't', 'e', '-', hexdig[i], '\0'}; + if (!coroutine_add(name, lib9p_srv_write_cr, &srv)) + error(1, 0, "coroutine_add(lib9p_srv_write_cr, &srv)"); + sleep_for_s(1); + } + + cr_exit(); +} + +int main() { + coroutine_add("init", init_cr, NULL); + coroutine_main(); +} -- cgit v1.2.3-2-g168b