diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-06-08 07:30:03 -0600 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-06-08 07:30:03 -0600 |
commit | 286c107a7d6a0275f50147184dc6b4a0bf52df26 (patch) | |
tree | ede74f5307e0fa333f0d93b6b446320a90894e2f | |
parent | c9e10321f50dcc02840c917e16e13531d32cc0c7 (diff) |
wip: lib9p_srv: Implement 9P2000.Llukeshu/9p-L
-rw-r--r-- | lib9p/srv.c | 103 |
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"); |