summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib9p/srv.c27
-rw-r--r--lib9p/tests/test_server/fs_shutdown.c37
-rw-r--r--lib9p/tests/test_server/fs_slowread.c41
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){