diff options
-rw-r--r-- | lib9p/srv.c | 27 | ||||
-rw-r--r-- | lib9p/tests/test_server/fs_shutdown.c | 37 | ||||
-rw-r--r-- | lib9p/tests/test_server/fs_slowread.c | 41 |
3 files changed, 78 insertions, 27 deletions
diff --git a/lib9p/srv.c b/lib9p/srv.c index 5660f08..5ff083f 100644 --- a/lib9p/srv.c +++ b/lib9p/srv.c @@ -182,7 +182,7 @@ static void respond_error(struct _lib9p_srv_req *req) { struct lib9p_msg_Rerror host = { .tag = req->tag, .errstr = lib9p_strn(req->ctx.basectx.err_msg, - CONFIG_9P_MAX_ERR_SIZE), + CONFIG_9P_MAX_ERR_SIZE), #if CONFIG_9P_ENABLE_9P2000_u .errnum = req->ctx.basectx.err_num, #endif @@ -251,6 +251,8 @@ void lib9p_srv_accept_and_read_loop(struct lib9p_srv *srv, lo_interface net_stre } } +static void clunkremove(struct _lib9p_srv_req *ctx, lib9p_fid_t fid, bool remove); + void lib9p_srv_read(struct lib9p_srv *srv, lo_interface net_stream_conn _conn) { assert(srv); assert(srv->rootdir); @@ -326,9 +328,28 @@ void lib9p_srv_read(struct lib9p_srv *srv, lo_interface net_stream_conn _conn) { assert(map_len(&sess.reqs) == 0); io_close_write(conn.fd); } - map_free(&sess.paths); - map_free(&sess.fids); + + assert(map_len(&sess.reqs) == 0); map_free(&sess.reqs); + + MAP_FOREACH(&sess.fids, fid, fidinfo) { + struct _lib9p_srv_req req = { + .parent_sess = &sess, + .ctx = { + .basectx = { + .version = sess.version, + .max_msg_size = sess.max_msg_size, + }, + }, + }; + clunkremove(&req, fid, false); + if (lib9p_ctx_has_error(&req.ctx.basectx)) + errorf("clunk: %.*s", CONFIG_9P_MAX_ERR_SIZE, req.ctx.basectx.err_msg); + } + map_free(&sess.fids); + + assert(map_len(&sess.paths) == 0); + map_free(&sess.paths); } /* write coroutine ************************************************************/ diff --git a/lib9p/tests/test_server/fs_shutdown.c b/lib9p/tests/test_server/fs_shutdown.c index 3f88985..26a8a10 100644 --- a/lib9p/tests/test_server/fs_shutdown.c +++ b/lib9p/tests/test_server/fs_shutdown.c @@ -4,12 +4,17 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +#include <stdlib.h> + #include "fs_shutdown.h" LO_IMPLEMENTATION_C(lib9p_srv_file, struct shutdown_file, shutdown_file, static); -LO_IMPLEMENTATION_H(lib9p_srv_fio, struct shutdown_file, shutdown_file); -LO_IMPLEMENTATION_C(lib9p_srv_fio, struct shutdown_file, shutdown_file, static); +struct shutdown_fio { + struct shutdown_file *parent; +}; +LO_IMPLEMENTATION_H(lib9p_srv_fio, struct shutdown_fio, shutdown_fio); +LO_IMPLEMENTATION_C(lib9p_srv_fio, struct shutdown_fio, shutdown_fio, static); /* srv_file *******************************************************************/ @@ -62,32 +67,42 @@ LIB9P_SRV_NOTDIR(struct shutdown_file, shutdown_file) static lo_interface lib9p_srv_fio shutdown_file_fopen(struct shutdown_file *self, struct lib9p_srv_ctx *ctx, bool, bool, bool) { assert(self); assert(ctx); - return lo_box_shutdown_file_as_lib9p_srv_fio(self); + + struct shutdown_fio *ret = malloc(sizeof(struct shutdown_fio)); + ret->parent = self; + + return lo_box_shutdown_fio_as_lib9p_srv_fio(ret); } /* srv_fio ********************************************************************/ -static void shutdown_file_iofree(struct shutdown_file *self) { +static void shutdown_fio_iofree(struct shutdown_fio *self) { + assert(self); + free(self); +} + +static struct lib9p_qid shutdown_fio_qid(struct shutdown_fio *self) { assert(self); + return shutdown_file_qid(self->parent); } -static uint32_t shutdown_file_iounit(struct shutdown_file *self) { +static uint32_t shutdown_fio_iounit(struct shutdown_fio *self) { assert(self); return 0; } -static uint32_t shutdown_file_pwrite(struct shutdown_file *self, struct lib9p_srv_ctx *ctx, void *buf, uint32_t byte_count, uint64_t LM_UNUSED(offset)) { +static uint32_t shutdown_fio_pwrite(struct shutdown_fio *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 (size_t i = 0; i < self->nlisteners; i++) - LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&self->listeners[i]), close); + for (size_t i = 0; i < self->parent->nlisteners; i++) + LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&self->parent->listeners[i]), close); return byte_count; } -static void shutdown_file_pread(struct shutdown_file *LM_UNUSED(self), struct lib9p_srv_ctx *LM_UNUSED(ctx), - uint32_t LM_UNUSED(byte_count), uint64_t LM_UNUSED(byte_offset), - struct iovec *LM_UNUSED(ret)) { +static void shutdown_fio_pread(struct shutdown_fio *LM_UNUSED(self), struct lib9p_srv_ctx *LM_UNUSED(ctx), + uint32_t LM_UNUSED(byte_count), uint64_t LM_UNUSED(byte_offset), + struct iovec *LM_UNUSED(ret)) { assert_notreached("not readable"); } diff --git a/lib9p/tests/test_server/fs_slowread.c b/lib9p/tests/test_server/fs_slowread.c index 520edd2..c5db896 100644 --- a/lib9p/tests/test_server/fs_slowread.c +++ b/lib9p/tests/test_server/fs_slowread.c @@ -4,12 +4,17 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +#include <stdlib.h> + #include "fs_slowread.h" LO_IMPLEMENTATION_C(lib9p_srv_file, struct slowread_file, slowread_file, static); -LO_IMPLEMENTATION_H(lib9p_srv_fio, struct slowread_file, slowread_file); -LO_IMPLEMENTATION_C(lib9p_srv_fio, struct slowread_file, slowread_file, static); +struct slowread_fio { + struct slowread_file *parent; +}; +LO_IMPLEMENTATION_H(lib9p_srv_fio, struct slowread_fio, slowread_fio); +LO_IMPLEMENTATION_C(lib9p_srv_fio, struct slowread_fio, slowread_fio, static); /* srv_file *******************************************************************/ @@ -62,36 +67,46 @@ LIB9P_SRV_NOTDIR(struct slowread_file, slowread_file) static lo_interface lib9p_srv_fio slowread_file_fopen(struct slowread_file *self, struct lib9p_srv_ctx *ctx, bool, bool, bool) { assert(self); assert(ctx); - return lo_box_slowread_file_as_lib9p_srv_fio(self); + + struct slowread_fio *ret = malloc(sizeof(struct slowread_fio)); + ret->parent = self; + + return lo_box_slowread_fio_as_lib9p_srv_fio(ret); } /* srv_fio ********************************************************************/ -static void slowread_file_iofree(struct slowread_file *self) { +static void slowread_fio_iofree(struct slowread_fio *self) { + assert(self); + free(self); +} + +static struct lib9p_qid slowread_fio_qid(struct slowread_fio *self) { assert(self); + return slowread_file_qid(self->parent); } -static uint32_t slowread_file_iounit(struct slowread_file *self) { +static uint32_t slowread_fio_iounit(struct slowread_fio *self) { assert(self); return 0; } -static uint32_t slowread_file_pwrite(struct slowread_file *LM_UNUSED(self), - struct lib9p_srv_ctx *LM_UNUSED(ctx), - void *LM_UNUSED(buf), uint32_t LM_UNUSED(byte_count), - uint64_t LM_UNUSED(offset)) { +static uint32_t slowread_fio_pwrite(struct slowread_fio *LM_UNUSED(self), + struct lib9p_srv_ctx *LM_UNUSED(ctx), + void *LM_UNUSED(buf), uint32_t LM_UNUSED(byte_count), + uint64_t LM_UNUSED(offset)) { assert_notreached("not writable"); } -static void slowread_file_pread(struct slowread_file *self, struct lib9p_srv_ctx *ctx, - uint32_t byte_count, uint64_t LM_UNUSED(byte_offset), - struct iovec *ret) { +static void slowread_fio_pread(struct slowread_fio *self, struct lib9p_srv_ctx *ctx, + uint32_t byte_count, uint64_t LM_UNUSED(byte_offset), + struct iovec *ret) { assert(self); assert(ctx); assert(ret); while (!lib9p_srv_flush_requested(ctx)) cr_yield(); - if (self->flushable) + if (self->parent->flushable) lib9p_srv_acknowledge_flush(ctx); else *ret = (struct iovec){ |