summaryrefslogtreecommitdiff
path: root/lib9p/srv.c
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-06-08 07:30:03 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-06-08 07:30:03 -0600
commit286c107a7d6a0275f50147184dc6b4a0bf52df26 (patch)
treeede74f5307e0fa333f0d93b6b446320a90894e2f /lib9p/srv.c
parentc9e10321f50dcc02840c917e16e13531d32cc0c7 (diff)
wip: lib9p_srv: Implement 9P2000.Llukeshu/9p-L
Diffstat (limited to 'lib9p/srv.c')
-rw-r--r--lib9p/srv.c103
1 files changed, 80 insertions, 23 deletions
diff --git a/lib9p/srv.c b/lib9p/srv.c
index 085cc8b..b6df2db 100644
--- a/lib9p/srv.c
+++ b/lib9p/srv.c
@@ -380,29 +380,41 @@ static void srv_write_Rmsg(struct srv_req *req, struct lib9p_Rmsg_send_buf *resp
static void srv_respond_error(struct srv_req *req, error err) {
assert(!ERROR_IS_NULL(err));
- struct lib9p_msg_Rerror host = {
- .tag = req->tag,
- .errstr = lib9p_str((char *)error_msg(err)), /* cast to discard `const` */
-#if CONFIG_9P_ENABLE_9P2000_u
- .errnum = libmisc_to_linuxgeneric_errno(err.num),
-#endif
- };
-
struct srv_sess *sess = req->parent_sess;
+ struct lib9p_Rmsg_send_buf net;
- uint32_t overhead = lib9p_version_min_Rerror_size(sess->version);
-
- /* Truncate the error-string if necessary to avoid needing to
- * return E_POSIX_ERANGE. */
- if (((uint32_t)host.errstr.len) + overhead > sess->max_msg_size)
- host.errstr.len = sess->max_msg_size - overhead;
+#if CONFIG_9P_ENABLE_9P2000_L
+ if (sess->version == LIB9P_VER_9P2000_L) {
+ struct lib9p_msg_Rlerror host = {
+ .tag = req->tag,
+ .errnum = libmisc_to_linuxgeneric_errno(err.num),
+ }
+ lib9p_Rmsg_marshal(&req->basectx,
+ LIB9P_TYP_Rlerror, &host,
+ &net);
+ } else {
+#endif
+ struct lib9p_msg_Rerror host = {
+ .tag = req->tag,
+ .errstr = lib9p_str((char *)error_msg(err)), /* cast to discard `const` */
+#if CONFIG_9P_ENABLE_9P2000_u
+ .errnum = libmisc_to_linuxgeneric_errno(err.num),
+#endif
+ };
- struct lib9p_Rmsg_send_buf net;
+ /* Truncate the error-string if necessary to avoid needing to
+ * return E_POSIX_ERANGE. */
+ uint32_t overhead = lib9p_version_min_Rerror_size(sess->version);
+ if (((uint32_t)host.errstr.len) + overhead > sess->max_msg_size)
+ host.errstr.len = sess->max_msg_size - overhead;
- lib9p_Rmsg_marshal(&req->basectx,
- LIB9P_TYP_Rerror, &host,
- &net);
+ lib9p_Rmsg_marshal(&req->basectx,
+ LIB9P_TYP_Rerror, &host,
+ &net);
+#if CONFIG_9P_ENABLE_9P2000_L
+ }
+#endif
srv_msglog(req, LIB9P_TYP_Rerror, &host);
srv_write_Rmsg(req, &net);
error_cleanup(&err);
@@ -598,7 +610,7 @@ void lib9p_srv_worker_loop(struct lib9p_srv *srv) {
static void handle_T##typ(struct srv_req *, \
struct lib9p_msg_T##typ *)
_HANDLER_PROTO(version);
-#if _LIB9P_ENABLE_stat
+#if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_L
_HANDLER_PROTO(auth);
_HANDLER_PROTO(attach);
_HANDLER_PROTO(flush);
@@ -612,6 +624,8 @@ _HANDLER_PROTO(remove);
_HANDLER_PROTO(stat);
_HANDLER_PROTO(wstat);
#endif
+#if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_e
+#endif
#if CONFIG_9P_ENABLE_9P2000_p9p
_HANDLER_PROTO(openfd);
#endif
@@ -620,7 +634,27 @@ _HANDLER_PROTO(session);
_HANDLER_PROTO(sread);
_HANDLER_PROTO(swrite);
#endif
-
+#if CONFIG_9P_ENABLE_9P2000_L
+ CASE(Tstatfs);
+ CASE(Tlopen);
+ CASE(Tlcreate);
+ CASE(Tsymlink);
+ CASE(Tmknod);
+ CASE(Trename);
+ CASE(Treadlink);
+ CASE(Tgetattr);
+ CASE(Tsetattr);
+ CASE(Txattrwalk);
+ CASE(Txattrcreate);
+ CASE(Treaddir);
+ CASE(Tfsync);
+ CASE(Tlock);
+ CASE(Tgetlock);
+ CASE(Tlink);
+ CASE(Tmkdir);
+ CASE(Trenameat);
+ CASE(Tunlinkat);
+#endif
void lib9p_srv_worker(struct srv_req *ctx) {
uint8_t *host_req = NULL;
@@ -642,17 +676,19 @@ void lib9p_srv_worker(struct srv_req *ctx) {
#define CASE(typ) case LIB9P_TYP_##typ: handle_##typ(ctx, (void *)host_req); break
LM_PARTIAL_SWITCH (typ) {
CASE(Tversion);
-#if _LIB9P_ENABLE_stat
+#if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_L
CASE(Tauth);
CASE(Tattach);
CASE(Tflush);
CASE(Twalk);
- CASE(Topen);
- CASE(Tcreate);
CASE(Tread);
CASE(Twrite);
CASE(Tclunk);
CASE(Tremove);
+#endif
+#if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_e
+ CASE(Topen);
+ CASE(Tcreate);
CASE(Tstat);
CASE(Twstat);
#endif
@@ -664,6 +700,27 @@ void lib9p_srv_worker(struct srv_req *ctx) {
CASE(Tsread);
CASE(Tswrite);
#endif
+#if CONFIG_9P_ENABLE_9P2000_L
+ CASE(Tstatfs);
+ CASE(Tlopen);
+ CASE(Tlcreate);
+ CASE(Tsymlink);
+ CASE(Tmknod);
+ CASE(Trename);
+ CASE(Treadlink);
+ CASE(Tgetattr);
+ CASE(Tsetattr);
+ CASE(Txattrwalk);
+ CASE(Txattrcreate);
+ CASE(Treaddir);
+ CASE(Tfsync);
+ CASE(Tlock);
+ CASE(Tgetlock);
+ CASE(Tlink);
+ CASE(Tmkdir);
+ CASE(Trenameat);
+ CASE(Tunlinkat);
+#endif
#undef CASE
default:
assert_notreached("lib9p_Tmsg_validate() should have rejected unknown typ");