From 7ec97df3ee8edfd102fe573eaa61cf4e5c6284cb Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Fri, 27 Sep 2024 22:27:01 -0600 Subject: wip fixes --- lib9p/9p.c | 72 ++-- lib9p/include/lib9p/9p.h | 14 +- lib9p/include/lib9p/_types.h | 2 +- lib9p/include/lib9p/srv.h | 5 +- lib9p/internal.h | 13 +- lib9p/srv.c | 69 ++-- lib9p/types.c | 811 ++++++++++++++++++++++--------------------- lib9p/types.gen | 71 ++-- 8 files changed, 544 insertions(+), 513 deletions(-) (limited to 'lib9p') diff --git a/lib9p/9p.c b/lib9p/9p.c index 64b09a6..8d53815 100644 --- a/lib9p/9p.c +++ b/lib9p/9p.c @@ -13,12 +13,12 @@ #include "internal.h" -enum lib9p_version lib9p_ctx_version(lib9p_ctx *ctx) { +enum lib9p_version lib9p_ctx_version(struct lib9p_ctx *ctx) { assert(ctx); return ctx->version; } -uint32_t lib9p_ctx_max_msg_size(lib9p_ctx *ctx) { +uint32_t lib9p_ctx_max_msg_size(struct lib9p_ctx *ctx) { assert(ctx); return ctx->max_msg_size; } @@ -45,50 +45,66 @@ int lib9p_errorf(struct lib9p_ctx *ctx, uint32_t linux_errno, char const *fmt, . return -1; } -size_t lib9p_unmarshal_size(struct lib9p_ctx *ctx, uint8_t *net_bytes) { +ssize_t lib9p_unmarshal_size(struct lib9p_ctx *ctx, uint8_t *net_bytes) { /* Header */ - uint32_t net_len = decode_u32le(net_bytes); - if (net_len < 7) + struct _checksize_ctx subctx = { + .ctx = ctx, + .net_size = decode_u32le(net_bytes), + .net_bytes = net_bytes, + + .net_offset = 7, + .host_extra = 0, + }; + if (subctx.net_size < subctx.net_offset) return lib9p_error(ctx, LINUX_EBADMSG, "message is too short"); uint8_t typ = net_bytes[4]; - uint32_t net_offset = 7; /* Body */ - if (!versions[ctx->version]->msgs[typ].unmarshal_extrasize) + struct _vtable_msg vtable = _lib9p_vtables[ctx->version].msgs[typ]; + if (!vtable.unmarshal_extrasize) return lib9p_errorf(ctx, LINUX_EOPNOTSUPP, "unknown message type %"PRIu8, typ); - size_t host_size = versions[ctx->version]->msgs[typ].unmarshal_basesize; - if (versions[ctx->version]->msgs[typ].unmarshal_extrasize(net_len, net_bytes, &net_offset, &host_size)) - return lib9p_error(ctx, LINUX_EBADMSG, "message is too short for content"); + if (vtable.unmarshal_extrasize(&subctx)) + return -1; - return host_size; + return (ssize_t)(vtable.unmarshal_basesize + subctx.host_extra); } -uint8_t lib9p_unmarshal(struct lib9p_ctx *ctx, uint8_t *net_bytes, uint16_t *out_tag, void *out_body) { +void lib9p_unmarshal(struct lib9p_ctx *ctx, uint8_t *net_bytes, + enum lib9p_msg_type *ret_typ, uint16_t *ret_tag, void *ret_body) { /* Header */ - uint8_t typ = net_bytes[4]; - *out_tag = decode_u16le(&net_bytes[5]); - uint32_t net_offset = 7; + struct _unmarshal_ctx subctx = { + .ctx = ctx, + .net_bytes = net_bytes, - /* Body */ - void *host_extra = out_body + versions[ctx->version]->msgs[typ].unmarshal_basesize; - if (versions[ctx->version]->msgs[typ].unmarshal(net_bytes, &net_offset, &host_extra, out_body)) - return lib9p_error(ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); + .net_offset = 7, + }; + *ret_typ = net_bytes[4]; + *ret_tag = decode_u16le(&net_bytes[5]); - return typ; + /* Body */ + struct _vtable_msg vtable = _lib9p_vtables[ctx->version].msgs[*ret_typ]; + subctx.extra = ret_body + vtable.unmarshal_basesize; + vtable.unmarshal(&subctx, ret_body); } -uint32_t lib9p_marshal(struct lib9p_ctx *ctx, uint8_t typ, uint16_t msgid, void *body, uint8_t *out_bytes) { +bool lib9p_marshal(struct lib9p_ctx *ctx, enum lib9p_msg_type typ, uint16_t tag, void *body, + uint8_t *ret_bytes) { /* Header */ - out_bytes[4] = typ; - encode_u16le(msgid, &out_bytes[5]); - uint32_t net_offset = 7; + struct _marshal_ctx subctx = { + .ctx = ctx, + .net_bytes = ret_bytes, + .net_offset = 7, + }; + ret_bytes[4] = typ; + encode_u16le(tag, &ret_bytes[5]); /* Body */ - if (versions[ctx->version]->msgs[typ].marshal(ctx, body, out_bytes, &net_offset)) - return 0; + struct _vtable_msg vtable = _lib9p_vtables[ctx->version].msgs[typ]; + if (vtable.marshal(&subctx, body)) + return true; /* Header, again */ - encode_u32le(net_offset, out_bytes); + encode_u32le(subctx.net_offset, ret_bytes); - return net_offset; + return false; } diff --git a/lib9p/include/lib9p/9p.h b/lib9p/include/lib9p/9p.h index a55f08f..954498e 100644 --- a/lib9p/include/lib9p/9p.h +++ b/lib9p/include/lib9p/9p.h @@ -7,6 +7,9 @@ #ifndef _LIB9P_9P_H_ #define _LIB9P_9P_H_ +#include +#include /* for ssize_t */ + #include #include @@ -14,8 +17,8 @@ #define LIB9P_NOFID ((uint32_t)~0U) struct lib9p_ctx; -enum lib9p_version lib9p_ctx_version(lib9p_ctx *); -uint32_t lib9p_ctx_max_msg_size(lib9p_ctx *); +enum lib9p_version lib9p_ctx_version(struct lib9p_ctx *); +uint32_t lib9p_ctx_max_msg_size(struct lib9p_ctx *); /** Write an static error into ctx, return -1. */ int lib9p_error(struct lib9p_ctx *ctx, uint32_t linux_errno, char const *msg); @@ -50,10 +53,9 @@ ssize_t lib9p_unmarshal_size(struct lib9p_ctx *ctx, uint8_t *net_bytes); * @return ret_typ : the mesage type * @return ret_tag : the message-ID tag * @return ret_body : the message body, must be at least lib9p_unmarshal_size() bytes - * @return the message type, or -1 on error */ -bool lib9p_unmarshal(struct lib9p_ctx *ctx, uint8_t *net_bytes, - enum lib9p_msg_typ *ret_typ, uint16_t *ret_tag, void *ret_body); +void lib9p_unmarshal(struct lib9p_ctx *ctx, uint8_t *net_bytes, + enum lib9p_msg_type *ret_typ, uint16_t *ret_tag, void *ret_body); /** * Marshal a `struct lib9p_msg_{typ}` structure into a byte-array. @@ -66,7 +68,7 @@ bool lib9p_unmarshal(struct lib9p_ctx *ctx, uint8_t *net_bytes, * @return ret_bytes : the buffer to encode to, must be at be at least lib9p_ctx_max_msg_size(ctx) bytes * @return whether there was an error (false=success, true=error) */ -bool lib9p_marshal(struct lib9p_ctx *ctx, uint8_t typ, uint16_t tag, void *body, +bool lib9p_marshal(struct lib9p_ctx *ctx, enum lib9p_msg_type typ, uint16_t tag, void *body, uint8_t *ret_bytes); #endif _LIB9P_9P_H_ diff --git a/lib9p/include/lib9p/_types.h b/lib9p/include/lib9p/_types.h index 7dcd8e2..7f320a5 100644 --- a/lib9p/include/lib9p/_types.h +++ b/lib9p/include/lib9p/_types.h @@ -3,7 +3,7 @@ #ifndef _LIB9P__TYPES_H_ #define _LIB9P__TYPES_H_ -#include +#include /* for uint{n}_t types */ /* versions *******************************************************************/ diff --git a/lib9p/include/lib9p/srv.h b/lib9p/include/lib9p/srv.h index 3b8b21e..a8bd9c7 100644 --- a/lib9p/include/lib9p/srv.h +++ b/lib9p/include/lib9p/srv.h @@ -2,12 +2,13 @@ #define _LIB9P_SRV_H_ #include +#include struct lib9p_srvreq; struct lib9p_srv { - int sockfd; - cr_chan_t(lib9p_srvreq *) reqch; + int sockfd; + cr_chan_t(struct lib9p_srvreq *) reqch; }; COROUTINE lib9p_srv_read_cr(void *_srv); diff --git a/lib9p/internal.h b/lib9p/internal.h index ebdc3f3..a5175af 100644 --- a/lib9p/internal.h +++ b/lib9p/internal.h @@ -8,13 +8,15 @@ #define _LIB9P_INTERNAL_H_ #include -#include +#include /* for size_t */ +#include /* for SSIZE_MAX */ #include -#define USE_CONFIG_LIB9P +#define USE_CONFIG_9P #include "config.h" -static_assert(CONFIG_LIB9P_MAX_ERR_SIZE <= UINT16_MAX); +static_assert(CONFIG_9P_MAX_ERR_SIZE <= UINT16_MAX); +static_assert(CONFIG_9P_MAX_MSG_SIZE <= SSIZE_MAX); /* C language *****************************************************************/ @@ -34,7 +36,7 @@ struct lib9p_ctx { /* state */ uint32_t err_num; - char err_msg[CONFIG_LIB9P_MAX_ERR_SIZE]; + char err_msg[CONFIG_9P_MAX_ERR_SIZE]; }; /* vtables ********************************************************************/ @@ -42,7 +44,7 @@ struct lib9p_ctx { struct _checksize_ctx { struct lib9p_ctx *ctx; uint32_t net_size; - uint8_t net_bytes; + uint8_t *net_bytes; uint32_t net_offset; /* Increment `host_extra` to pre-allocate space that is @@ -52,6 +54,7 @@ struct _checksize_ctx { struct _unmarshal_ctx { struct lib9p_ctx *ctx; + uint8_t *net_bytes; uint32_t net_offset; /* `extra` points to the beginning of unallocated space. */ diff --git a/lib9p/srv.c b/lib9p/srv.c index c6558d6..9a68a2b 100644 --- a/lib9p/srv.c +++ b/lib9p/srv.c @@ -1,47 +1,50 @@ #include +#include /* for fprintf(), stderr */ +#include /* for strerror() */ #include #include #include #include +#include #include "internal.h" -struct p9_srvconn { +struct lib9p_srvconn { /* immutable */ - p9_srv *srv; - cid_t reader; - int fd; + struct lib9p_srv *srv; + cid_t reader; + int fd; /* mutable */ - uint32_t max_msg_size; - enum p9_version version; - unsigned int refcount; + uint32_t max_msg_size; + enum lib9p_version version; + unsigned int refcount; }; -struct p9_srvreq { - p9_srvconn *conn; - uint8_t *msg; +struct lib9p_srvreq { + struct lib9p_srvconn *conn; + uint8_t *msg; }; -COROUTINE p9_srv_read_cr(void *_srv) { +COROUTINE lib9p_srv_read_cr(void *_srv) { uint8_t buf[CONFIG_9P_MAX_MSG_SIZE]; - p9_srv *srv = _srv; + struct lib9p_srv *srv = _srv; assert(srv); cr_begin(); for (;;) { - struct p9_srvconn conn = { + struct lib9p_srvconn conn = { .srv = srv, - .reader = cr_getcid(); + .reader = cr_getcid(), - .max_msg_size = CONFIG_9P_MAX_MSG_SIZE; - .version = P9_VER_UNINITIALIZED; + .max_msg_size = CONFIG_9P_MAX_MSG_SIZE, + .version = LIB9P_VER_UNINITIALIZED, .refcount = 1, }; conn.fd = netio_accept(srv->sockfd); if (conn.fd < 0) { - fprintf(stderr, "error: accept: %m", -conn.fd); + fprintf(stderr, "error: accept: %s", strerror(-conn.fd)); continue; } @@ -67,14 +70,14 @@ COROUTINE p9_srv_read_cr(void *_srv) { goto close; } if (goal > conn.max_msg_size) { - struct p9_ctx ctx = { + struct lib9p_ctx ctx = { .version = conn.version, .max_msg_size = conn.max_msg_size, }; if (initialized) - p9_errorf(&ctx, LINUX_EMSGSIZE, "T-message larger than negotiated limit (%zu > %zu)", goal, conn.max_msg_size); + lib9p_errorf(&ctx, LINUX_EMSGSIZE, "T-message larger than negotiated limit (%zu > %zu)", goal, conn.max_msg_size); else - p9_errorf(&ctx, LINUX_EMSGSIZE, "T-message larger than server limit (%zu > %zu)", goal, conn.max_msg_size); + lib9p_errorf(&ctx, LINUX_EMSGSIZE, "T-message larger than server limit (%zu > %zu)", goal, conn.max_msg_size); marshal_error(&ctx, buf); netio_write(conn.fd, buf, decode_u32le(buf)); continue; @@ -93,7 +96,7 @@ COROUTINE p9_srv_read_cr(void *_srv) { } /* Handle the message... */ - if (conn.version == P9_VER_UNINITIALIZED) { + if (conn.version == LIB9P_VER_UNINITIALIZED) { /* ...synchronously if we haven't negotiated the protocol yet, ... */ handle_message(&conn, buf); } else { @@ -114,15 +117,15 @@ COROUTINE p9_srv_read_cr(void *_srv) { cr_end(); } -COROUTINE p9_srv_write_cr(void *_srv) { +COROUTINE lib9p_srv_write_cr(void *_srv) { uint8_t net[CONFIG_9P_MAX_MSG_SIZE]; - p9_srv *srv = _srv; + lib9p_srv *srv = _srv; assert(srv); cr_begin(); for (;;) { - struct p9_srvreq req; + struct lib9p_srvreq req; cr_chan_recv(&srv->reqch, &req); memcpy(net, req.msg, decode_u32le(req.msg)); req.conn->refcount++; @@ -137,28 +140,28 @@ COROUTINE p9_srv_write_cr(void *_srv) { cr_end(); } -void handle_message(p9_srvconn *conn, uint8_t *net) { +void handle_message(lib9p_srvconn *conn, uint8_t *net) { uint8_t host[CONFIG_9P_MAX_MSG_SIZE]; - struct p9_ctx ctx = { + struct lib9p_ctx ctx = { .version = req.conn->version, .max_msg_size = req.conn->max_msg_size, }; - size_t host_size = p9_unmarshal_size(&ctx, net); + size_t host_size = lib9p_unmarshal_size(&ctx, net); if (host_size == (size_t)-1) goto write; if (host_size > sizeof(host)) { - p9_errorf(&ctx, LINUX_EMSGSIZE, "unmarshalled payload larger than server limit (%zu > %zu)", host_size, sizeof(host)); + lib9p_errorf(&ctx, LINUX_EMSGSIZE, "unmarshalled payload larger than server limit (%zu > %zu)", host_size, sizeof(host)); goto write; } uint16_t tag; - uint8_t typ = p9_unmarshal(&ctx, net, &tag, host); + uint8_t typ = lib9p_unmarshal(&ctx, net, &tag, host); if (typ == (uint8_t)-1) goto write; if (typ % 2 != 0) { - p9_errorf(&ctx, LINUX_EOPNOTSUPP, "expected a T-message but got an R-message"); + lib9p_errorf(&ctx, LINUX_EOPNOTSUPP, "expected a T-message but got an R-message"); goto write; } @@ -179,8 +182,8 @@ static inline uint16_t min_u16(uint16_t a, b) { /* We have special code for marshaling Rerror because we don't ever * want to produce an error because the err_msg is too long for the * `ctx->max_msg_size`! */ -void marshal_error(struct p9_ctx *ctx, uint16_t tag, uint8_t *net) { - struct p9_msg_Rerror host = { +void marshal_error(struct lib9p_ctx *ctx, uint16_t tag, uint8_t *net) { + struct lib9p_msg_Rerror host = { .ename = { .len = strnlen(ctx->err_msg, CONFIG_9P_MAX_ERR_SIZE), .utf8 = ctx->err_msg, @@ -188,7 +191,7 @@ void marshal_error(struct p9_ctx *ctx, uint16_t tag, uint8_t *net) { }; if (host.ename.len + ctx->Rerror_overhead > ctx->max_msg_size) host.ename.len = ctx->max_msg_size - overhead; - p9_marshal(ctx, tag, host, net); + lib9p_marshal(ctx, tag, host, net); } ERANGE for reply too large diff --git a/lib9p/types.c b/lib9p/types.c index deceb4e..5b6d0a0 100644 --- a/lib9p/types.c +++ b/lib9p/types.c @@ -1,6 +1,9 @@ /* Generated by `./lib9p/types.gen lib9p/9P2000.txt lib9p/9P2000.u.txt lib9p/9P2000.e.txt`. DO NOT EDIT! */ #include +#include /* for size_t */ +#include /* for PRI* macros */ +#include /* for memset() */ #include @@ -43,18 +46,18 @@ static inline bool _checksize_list(struct _checksize_ctx *ctx, static inline bool checksize_d(struct _checksize_ctx *ctx) { uint32_t base_offset = ctx->net_offset; - if (_checksize_4(ctx)) + if (checksize_4(ctx)) return true; uint32_t len = decode_u32le(&ctx->net_bytes[base_offset]); - return checksize_net(ctx, len) || checksize_host(ctx, len); + return _checksize_net(ctx, len) || _checksize_host(ctx, len); } static inline bool checksize_s(struct _checksize_ctx *ctx) { uint32_t base_offset = ctx->net_offset; - if (_checksize_2(ctx)) + if (checksize_2(ctx)) return true; uint16_t len = decode_u16le(&ctx->net_bytes[base_offset]); - if (checksize_net(ctx, len) || checksize_host(ctx, ((size_t)len)+1)) + if (_checksize_net(ctx, len) || _checksize_host(ctx, ((size_t)len)+1)) return true; if (!is_valid_utf8_without_nul(&ctx->net_bytes[base_offset+2], len)) return lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); @@ -249,22 +252,22 @@ static bool checksize_Rswrite(struct _checksize_ctx *ctx) { /* unmarshal_* ****************************************************************/ -static inline vold unmarshal_1(struct _unmarshal_ctx *ctx, uint8_t *out) { +static inline void unmarshal_1(struct _unmarshal_ctx *ctx, uint8_t *out) { *out = decode_u8le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 1; } -static inline vold unmarshal_2(struct _unmarshal_ctx *ctx, uint16_t *out) { +static inline void unmarshal_2(struct _unmarshal_ctx *ctx, uint16_t *out) { *out = decode_u16le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 2; } -static inline vold unmarshal_4(struct _unmarshal_ctx *ctx, uint32_t *out) { +static inline void unmarshal_4(struct _unmarshal_ctx *ctx, uint32_t *out) { *out = decode_u32le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 4; } -static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { +static inline void unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { *out = decode_u64le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 8; } @@ -272,8 +275,8 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { static inline void unmarshal_d(struct _unmarshal_ctx *ctx, struct lib9p_d *out) { memset(out, 0, sizeof(*out)); unmarshal_4(ctx, &out->len); - out->dat = ctx->host_extra; - ctx->host_extra += sizeof(out->dat[0]) * out->len; + out->dat = ctx->extra; + ctx->extra += sizeof(out->dat[0]) * out->len; for (typeof(out->len) i = 0; i < out->len; i++) unmarshal_1(ctx, &out->dat[i]); } @@ -281,8 +284,8 @@ static inline void unmarshal_d(struct _unmarshal_ctx *ctx, struct lib9p_d *out) static inline void unmarshal_s(struct _unmarshal_ctx *ctx, struct lib9p_s *out) { memset(out, 0, sizeof(*out)); unmarshal_2(ctx, &out->len); - out->utf8 = ctx->host_extra; - ctx->host_extra += sizeof(out->utf8[0]) * out->len; + out->utf8 = ctx->extra; + ctx->extra += sizeof(out->utf8[0]) * out->len; for (typeof(out->len) i = 0; i < out->len; i++) unmarshal_1(ctx, &out->utf8[i]); } @@ -363,7 +366,7 @@ static void unmarshal_Tflush(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tflush unmarshal_2(ctx, &out->oldtag); } -static void unmarshal_Rflush(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rflush *UNUSED(out)) { +static void unmarshal_Rflush(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rflush *out) { memset(out, 0, sizeof(*out)); } @@ -372,8 +375,8 @@ static void unmarshal_Twalk(struct _unmarshal_ctx *ctx, struct lib9p_msg_Twalk * unmarshal_4(ctx, &out->fid); unmarshal_4(ctx, &out->newfid); unmarshal_2(ctx, &out->nwname); - out->wname = ctx->host_extra; - ctx->host_extra += sizeof(out->wname[0]) * out->nwname; + out->wname = ctx->extra; + ctx->extra += sizeof(out->wname[0]) * out->nwname; for (typeof(out->nwname) i = 0; i < out->nwname; i++) unmarshal_s(ctx, &out->wname[i]); } @@ -381,8 +384,8 @@ static void unmarshal_Twalk(struct _unmarshal_ctx *ctx, struct lib9p_msg_Twalk * static void unmarshal_Rwalk(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rwalk *out) { memset(out, 0, sizeof(*out)); unmarshal_2(ctx, &out->nwqid); - out->wqid = ctx->host_extra; - ctx->host_extra += sizeof(out->wqid[0]) * out->nwqid; + out->wqid = ctx->extra; + ctx->extra += sizeof(out->wqid[0]) * out->nwqid; for (typeof(out->nwqid) i = 0; i < out->nwqid; i++) unmarshal_qid(ctx, &out->wqid[i]); } @@ -442,7 +445,7 @@ static void unmarshal_Tclunk(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tclunk unmarshal_4(ctx, &out->fid); } -static void unmarshal_Rclunk(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rclunk *UNUSED(out)) { +static void unmarshal_Rclunk(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rclunk *out) { memset(out, 0, sizeof(*out)); } @@ -451,7 +454,7 @@ static void unmarshal_Tremove(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tremo unmarshal_4(ctx, &out->fid); } -static void unmarshal_Rremove(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rremove *UNUSED(out)) { +static void unmarshal_Rremove(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rremove *out) { memset(out, 0, sizeof(*out)); } @@ -471,7 +474,7 @@ static void unmarshal_Twstat(struct _unmarshal_ctx *ctx, struct lib9p_msg_Twstat unmarshal_stat(ctx, &out->stat); } -static void unmarshal_Rwstat(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rwstat *UNUSED(out)) { +static void unmarshal_Rwstat(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rwstat *out) { memset(out, 0, sizeof(*out)); } @@ -480,7 +483,7 @@ static void unmarshal_Tsession(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tses unmarshal_8(ctx, &out->key); } -static void unmarshal_Rsession(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rsession *UNUSED(out)) { +static void unmarshal_Rsession(struct _unmarshal_ctx *UNUSED(ctx), struct lib9p_msg_Rsession *out) { memset(out, 0, sizeof(*out)); } @@ -488,8 +491,8 @@ static void unmarshal_Tsread(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tsread memset(out, 0, sizeof(*out)); unmarshal_4(ctx, &out->fid); unmarshal_2(ctx, &out->nwname); - out->wname = ctx->host_extra; - ctx->host_extra += sizeof(out->wname[0]) * out->nwname; + out->wname = ctx->extra; + ctx->extra += sizeof(out->wname[0]) * out->nwname; for (typeof(out->nwname) i = 0; i < out->nwname; i++) unmarshal_s(ctx, &out->wname[i]); } @@ -503,8 +506,8 @@ static void unmarshal_Tswrite(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tswri memset(out, 0, sizeof(*out)); unmarshal_4(ctx, &out->fid); unmarshal_2(ctx, &out->nwname); - out->wname = ctx->host_extra; - ctx->host_extra += sizeof(out->wname[0]) * out->nwname; + out->wname = ctx->extra; + ctx->extra += sizeof(out->wname[0]) * out->nwname; for (typeof(out->nwname) i = 0; i < out->nwname; i++) unmarshal_s(ctx, &out->wname[i]); unmarshal_d(ctx, &out->data); @@ -518,43 +521,43 @@ static void unmarshal_Rswrite(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rswri /* marshal_* ******************************************************************/ static inline bool _marshal_too_large(struct _marshal_ctx *ctx) { - lib9p_errorf(ctx->ctx, "%s too large to marshal into %s limit (limit=%"PRIu32")", + lib9p_errorf(ctx->ctx, LINUX_EMSGSIZE, "%s too large to marshal into %s limit (limit=%"PRIu32")", (ctx->net_bytes[4] % 2 == 0) ? "T-message" : "R-message", ctx->ctx->version ? "negotiated" : ((ctx->net_bytes[4] % 2 == 0) ? "client" : "server"), - ctx->ctx->max_msg_size)); - return true; + ctx->ctx->max_msg_size); + return true; } static inline bool marshal_1(struct _marshal_ctx *ctx, uint8_t *val) { - if (ctx->net_offset + 1 > ctx->max_msg_size) - return _marshal_too_large(ctx); - out_net_bytes[ctx->net_offset] = *val; + if (ctx->net_offset + 1 > ctx->ctx->max_msg_size) + return _marshal_too_large(ctx); + ctx->net_bytes[ctx->net_offset] = *val; ctx->net_offset += 1; - return false; + return false; } static inline bool marshal_2(struct _marshal_ctx *ctx, uint16_t *val) { - if (ctx->net_offset + 2 > ctx->max_msg_size) - return _marshal_too_large(ctx); - encode_u16le(*val, &out_net_bytes[ctx->net_offset]); + if (ctx->net_offset + 2 > ctx->ctx->max_msg_size) + return _marshal_too_large(ctx); + encode_u16le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 2; - return false; + return false; } static inline bool marshal_4(struct _marshal_ctx *ctx, uint32_t *val) { - if (ctx->net_offset + 4 > ctx->max_msg_size) + if (ctx->net_offset + 4 > ctx->ctx->max_msg_size) return true; - encode_u32le(*val, &out_net_bytes[ctx->net_offset]); + encode_u32le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 4; - return false; + return false; } static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { - if (ctx->net_offset + 8 > ctx->max_msg_size) + if (ctx->net_offset + 8 > ctx->ctx->max_msg_size) return true; - encode_u64le(*val, &out_net_bytes[ctx->net_offset]); + encode_u64le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 8; - return false; + return false; } static inline bool marshal_d(struct _marshal_ctx *ctx, struct lib9p_d *val) { @@ -562,7 +565,7 @@ static inline bool marshal_d(struct _marshal_ctx *ctx, struct lib9p_d *val) { || ({ bool err = false; for (typeof(val->len) i = 0; i < val->len && !err; i++) - err = marshal_1(ctx, &val->dat[i])); + err = marshal_1(ctx, &val->dat[i]); err; }); } @@ -572,7 +575,7 @@ static inline bool marshal_s(struct _marshal_ctx *ctx, struct lib9p_s *val) { || ({ bool err = false; for (typeof(val->len) i = 0; i < val->len && !err; i++) - err = marshal_1(ctx, &val->utf8[i])); + err = marshal_1(ctx, &val->utf8[i]); err; }); } @@ -654,7 +657,7 @@ static bool marshal_Twalk(struct _marshal_ctx *ctx, struct lib9p_msg_Twalk *val) || ({ bool err = false; for (typeof(val->nwname) i = 0; i < val->nwname && !err; i++) - err = marshal_s(ctx, &val->wname[i])); + err = marshal_s(ctx, &val->wname[i]); err; }); } @@ -664,7 +667,7 @@ static bool marshal_Rwalk(struct _marshal_ctx *ctx, struct lib9p_msg_Rwalk *val) || ({ bool err = false; for (typeof(val->nwqid) i = 0; i < val->nwqid && !err; i++) - err = marshal_qid(ctx, &val->wqid[i])); + err = marshal_qid(ctx, &val->wqid[i]); err; }); } @@ -758,7 +761,7 @@ static bool marshal_Tsread(struct _marshal_ctx *ctx, struct lib9p_msg_Tsread *va || ({ bool err = false; for (typeof(val->nwname) i = 0; i < val->nwname && !err; i++) - err = marshal_s(ctx, &val->wname[i])); + err = marshal_s(ctx, &val->wname[i]); err; }); } @@ -773,7 +776,7 @@ static bool marshal_Tswrite(struct _marshal_ctx *ctx, struct lib9p_msg_Tswrite * || ({ bool err = false; for (typeof(val->nwname) i = 0; i < val->nwname && !err; i++) - err = marshal_s(ctx, &val->wname[i])); + err = marshal_s(ctx, &val->wname[i]); err; }) || marshal_d(ctx, &val->data); @@ -788,544 +791,544 @@ static bool marshal_Rswrite(struct _marshal_ctx *ctx, struct lib9p_msg_Rswrite * struct _vtable_version _lib9p_vtables[LIB9P_VER_NUM] = { [LIB9P_VER_UNINITIALIZED] = { .msgs = { [LIB9P_TYP_Tversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), - r.unmarshal_extrasize = checksize_Tversion, - r.unmarshal = unmarshal_Tversion, - r.marshal = (_marshal_fn_t)marshal_Tversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), + .unmarshal_extrasize = checksize_Tversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tversion, + .marshal = (_marshal_fn_t)marshal_Tversion, }, [LIB9P_TYP_Rversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), - r.unmarshal_extrasize = checksize_Rversion, - r.unmarshal = unmarshal_Rversion, - r.marshal = (_marshal_fn_t)marshal_Rversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), + .unmarshal_extrasize = checksize_Rversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rversion, + .marshal = (_marshal_fn_t)marshal_Rversion, }, }}, [LIB9P_VER_9P2000] = { .msgs = { [LIB9P_TYP_Tversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), - r.unmarshal_extrasize = checksize_Tversion, - r.unmarshal = unmarshal_Tversion, - r.marshal = (_marshal_fn_t)marshal_Tversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), + .unmarshal_extrasize = checksize_Tversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tversion, + .marshal = (_marshal_fn_t)marshal_Tversion, }, [LIB9P_TYP_Rversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), - r.unmarshal_extrasize = checksize_Rversion, - r.unmarshal = unmarshal_Rversion, - r.marshal = (_marshal_fn_t)marshal_Rversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), + .unmarshal_extrasize = checksize_Rversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rversion, + .marshal = (_marshal_fn_t)marshal_Rversion, }, [LIB9P_TYP_Tauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), - r.unmarshal_extrasize = checksize_Tauth, - r.unmarshal = unmarshal_Tauth, - r.marshal = (_marshal_fn_t)marshal_Tauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), + .unmarshal_extrasize = checksize_Tauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tauth, + .marshal = (_marshal_fn_t)marshal_Tauth, }, [LIB9P_TYP_Rauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), - r.unmarshal_extrasize = checksize_Rauth, - r.unmarshal = unmarshal_Rauth, - r.marshal = (_marshal_fn_t)marshal_Rauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), + .unmarshal_extrasize = checksize_Rauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rauth, + .marshal = (_marshal_fn_t)marshal_Rauth, }, [LIB9P_TYP_Tattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), - r.unmarshal_extrasize = checksize_Tattach, - r.unmarshal = unmarshal_Tattach, - r.marshal = (_marshal_fn_t)marshal_Tattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), + .unmarshal_extrasize = checksize_Tattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tattach, + .marshal = (_marshal_fn_t)marshal_Tattach, }, [LIB9P_TYP_Rattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), - r.unmarshal_extrasize = checksize_Rattach, - r.unmarshal = unmarshal_Rattach, - r.marshal = (_marshal_fn_t)marshal_Rattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), + .unmarshal_extrasize = checksize_Rattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rattach, + .marshal = (_marshal_fn_t)marshal_Rattach, }, [LIB9P_TYP_Rerror] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), - r.unmarshal_extrasize = checksize_Rerror, - r.unmarshal = unmarshal_Rerror, - r.marshal = (_marshal_fn_t)marshal_Rerror, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), + .unmarshal_extrasize = checksize_Rerror, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rerror, + .marshal = (_marshal_fn_t)marshal_Rerror, }, [LIB9P_TYP_Tflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), - r.unmarshal_extrasize = checksize_Tflush, - r.unmarshal = unmarshal_Tflush, - r.marshal = (_marshal_fn_t)marshal_Tflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), + .unmarshal_extrasize = checksize_Tflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tflush, + .marshal = (_marshal_fn_t)marshal_Tflush, }, [LIB9P_TYP_Rflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), - r.unmarshal_extrasize = checksize_Rflush, - r.unmarshal = unmarshal_Rflush, - r.marshal = (_marshal_fn_t)marshal_Rflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), + .unmarshal_extrasize = checksize_Rflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rflush, + .marshal = (_marshal_fn_t)marshal_Rflush, }, [LIB9P_TYP_Twalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), - r.unmarshal_extrasize = checksize_Twalk, - r.unmarshal = unmarshal_Twalk, - r.marshal = (_marshal_fn_t)marshal_Twalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), + .unmarshal_extrasize = checksize_Twalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twalk, + .marshal = (_marshal_fn_t)marshal_Twalk, }, [LIB9P_TYP_Rwalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), - r.unmarshal_extrasize = checksize_Rwalk, - r.unmarshal = unmarshal_Rwalk, - r.marshal = (_marshal_fn_t)marshal_Rwalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), + .unmarshal_extrasize = checksize_Rwalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwalk, + .marshal = (_marshal_fn_t)marshal_Rwalk, }, [LIB9P_TYP_Topen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Topen), - r.unmarshal_extrasize = checksize_Topen, - r.unmarshal = unmarshal_Topen, - r.marshal = (_marshal_fn_t)marshal_Topen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Topen), + .unmarshal_extrasize = checksize_Topen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Topen, + .marshal = (_marshal_fn_t)marshal_Topen, }, [LIB9P_TYP_Ropen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), - r.unmarshal_extrasize = checksize_Ropen, - r.unmarshal = unmarshal_Ropen, - r.marshal = (_marshal_fn_t)marshal_Ropen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), + .unmarshal_extrasize = checksize_Ropen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Ropen, + .marshal = (_marshal_fn_t)marshal_Ropen, }, [LIB9P_TYP_Tcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), - r.unmarshal_extrasize = checksize_Tcreate, - r.unmarshal = unmarshal_Tcreate, - r.marshal = (_marshal_fn_t)marshal_Tcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), + .unmarshal_extrasize = checksize_Tcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tcreate, + .marshal = (_marshal_fn_t)marshal_Tcreate, }, [LIB9P_TYP_Rcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), - r.unmarshal_extrasize = checksize_Rcreate, - r.unmarshal = unmarshal_Rcreate, - r.marshal = (_marshal_fn_t)marshal_Rcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), + .unmarshal_extrasize = checksize_Rcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rcreate, + .marshal = (_marshal_fn_t)marshal_Rcreate, }, [LIB9P_TYP_Tread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tread), - r.unmarshal_extrasize = checksize_Tread, - r.unmarshal = unmarshal_Tread, - r.marshal = (_marshal_fn_t)marshal_Tread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tread), + .unmarshal_extrasize = checksize_Tread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tread, + .marshal = (_marshal_fn_t)marshal_Tread, }, [LIB9P_TYP_Rread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rread), - r.unmarshal_extrasize = checksize_Rread, - r.unmarshal = unmarshal_Rread, - r.marshal = (_marshal_fn_t)marshal_Rread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rread), + .unmarshal_extrasize = checksize_Rread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rread, + .marshal = (_marshal_fn_t)marshal_Rread, }, [LIB9P_TYP_Twrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), - r.unmarshal_extrasize = checksize_Twrite, - r.unmarshal = unmarshal_Twrite, - r.marshal = (_marshal_fn_t)marshal_Twrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), + .unmarshal_extrasize = checksize_Twrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twrite, + .marshal = (_marshal_fn_t)marshal_Twrite, }, [LIB9P_TYP_Rwrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), - r.unmarshal_extrasize = checksize_Rwrite, - r.unmarshal = unmarshal_Rwrite, - r.marshal = (_marshal_fn_t)marshal_Rwrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), + .unmarshal_extrasize = checksize_Rwrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwrite, + .marshal = (_marshal_fn_t)marshal_Rwrite, }, [LIB9P_TYP_Tclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), - r.unmarshal_extrasize = checksize_Tclunk, - r.unmarshal = unmarshal_Tclunk, - r.marshal = (_marshal_fn_t)marshal_Tclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), + .unmarshal_extrasize = checksize_Tclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tclunk, + .marshal = (_marshal_fn_t)marshal_Tclunk, }, [LIB9P_TYP_Rclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), - r.unmarshal_extrasize = checksize_Rclunk, - r.unmarshal = unmarshal_Rclunk, - r.marshal = (_marshal_fn_t)marshal_Rclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), + .unmarshal_extrasize = checksize_Rclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rclunk, + .marshal = (_marshal_fn_t)marshal_Rclunk, }, [LIB9P_TYP_Tremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), - r.unmarshal_extrasize = checksize_Tremove, - r.unmarshal = unmarshal_Tremove, - r.marshal = (_marshal_fn_t)marshal_Tremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), + .unmarshal_extrasize = checksize_Tremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tremove, + .marshal = (_marshal_fn_t)marshal_Tremove, }, [LIB9P_TYP_Rremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), - r.unmarshal_extrasize = checksize_Rremove, - r.unmarshal = unmarshal_Rremove, - r.marshal = (_marshal_fn_t)marshal_Rremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), + .unmarshal_extrasize = checksize_Rremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rremove, + .marshal = (_marshal_fn_t)marshal_Rremove, }, [LIB9P_TYP_Tstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), - r.unmarshal_extrasize = checksize_Tstat, - r.unmarshal = unmarshal_Tstat, - r.marshal = (_marshal_fn_t)marshal_Tstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), + .unmarshal_extrasize = checksize_Tstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tstat, + .marshal = (_marshal_fn_t)marshal_Tstat, }, [LIB9P_TYP_Rstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), - r.unmarshal_extrasize = checksize_Rstat, - r.unmarshal = unmarshal_Rstat, - r.marshal = (_marshal_fn_t)marshal_Rstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), + .unmarshal_extrasize = checksize_Rstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rstat, + .marshal = (_marshal_fn_t)marshal_Rstat, }, [LIB9P_TYP_Twstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), - r.unmarshal_extrasize = checksize_Twstat, - r.unmarshal = unmarshal_Twstat, - r.marshal = (_marshal_fn_t)marshal_Twstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), + .unmarshal_extrasize = checksize_Twstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twstat, + .marshal = (_marshal_fn_t)marshal_Twstat, }, [LIB9P_TYP_Rwstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), - r.unmarshal_extrasize = checksize_Rwstat, - r.unmarshal = unmarshal_Rwstat, - r.marshal = (_marshal_fn_t)marshal_Rwstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), + .unmarshal_extrasize = checksize_Rwstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwstat, + .marshal = (_marshal_fn_t)marshal_Rwstat, }, }}, [LIB9P_VER_9P2000_e] = { .msgs = { [LIB9P_TYP_Tversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), - r.unmarshal_extrasize = checksize_Tversion, - r.unmarshal = unmarshal_Tversion, - r.marshal = (_marshal_fn_t)marshal_Tversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), + .unmarshal_extrasize = checksize_Tversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tversion, + .marshal = (_marshal_fn_t)marshal_Tversion, }, [LIB9P_TYP_Rversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), - r.unmarshal_extrasize = checksize_Rversion, - r.unmarshal = unmarshal_Rversion, - r.marshal = (_marshal_fn_t)marshal_Rversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), + .unmarshal_extrasize = checksize_Rversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rversion, + .marshal = (_marshal_fn_t)marshal_Rversion, }, [LIB9P_TYP_Tauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), - r.unmarshal_extrasize = checksize_Tauth, - r.unmarshal = unmarshal_Tauth, - r.marshal = (_marshal_fn_t)marshal_Tauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), + .unmarshal_extrasize = checksize_Tauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tauth, + .marshal = (_marshal_fn_t)marshal_Tauth, }, [LIB9P_TYP_Rauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), - r.unmarshal_extrasize = checksize_Rauth, - r.unmarshal = unmarshal_Rauth, - r.marshal = (_marshal_fn_t)marshal_Rauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), + .unmarshal_extrasize = checksize_Rauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rauth, + .marshal = (_marshal_fn_t)marshal_Rauth, }, [LIB9P_TYP_Tattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), - r.unmarshal_extrasize = checksize_Tattach, - r.unmarshal = unmarshal_Tattach, - r.marshal = (_marshal_fn_t)marshal_Tattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), + .unmarshal_extrasize = checksize_Tattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tattach, + .marshal = (_marshal_fn_t)marshal_Tattach, }, [LIB9P_TYP_Rattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), - r.unmarshal_extrasize = checksize_Rattach, - r.unmarshal = unmarshal_Rattach, - r.marshal = (_marshal_fn_t)marshal_Rattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), + .unmarshal_extrasize = checksize_Rattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rattach, + .marshal = (_marshal_fn_t)marshal_Rattach, }, [LIB9P_TYP_Rerror] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), - r.unmarshal_extrasize = checksize_Rerror, - r.unmarshal = unmarshal_Rerror, - r.marshal = (_marshal_fn_t)marshal_Rerror, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), + .unmarshal_extrasize = checksize_Rerror, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rerror, + .marshal = (_marshal_fn_t)marshal_Rerror, }, [LIB9P_TYP_Tflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), - r.unmarshal_extrasize = checksize_Tflush, - r.unmarshal = unmarshal_Tflush, - r.marshal = (_marshal_fn_t)marshal_Tflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), + .unmarshal_extrasize = checksize_Tflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tflush, + .marshal = (_marshal_fn_t)marshal_Tflush, }, [LIB9P_TYP_Rflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), - r.unmarshal_extrasize = checksize_Rflush, - r.unmarshal = unmarshal_Rflush, - r.marshal = (_marshal_fn_t)marshal_Rflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), + .unmarshal_extrasize = checksize_Rflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rflush, + .marshal = (_marshal_fn_t)marshal_Rflush, }, [LIB9P_TYP_Twalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), - r.unmarshal_extrasize = checksize_Twalk, - r.unmarshal = unmarshal_Twalk, - r.marshal = (_marshal_fn_t)marshal_Twalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), + .unmarshal_extrasize = checksize_Twalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twalk, + .marshal = (_marshal_fn_t)marshal_Twalk, }, [LIB9P_TYP_Rwalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), - r.unmarshal_extrasize = checksize_Rwalk, - r.unmarshal = unmarshal_Rwalk, - r.marshal = (_marshal_fn_t)marshal_Rwalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), + .unmarshal_extrasize = checksize_Rwalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwalk, + .marshal = (_marshal_fn_t)marshal_Rwalk, }, [LIB9P_TYP_Topen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Topen), - r.unmarshal_extrasize = checksize_Topen, - r.unmarshal = unmarshal_Topen, - r.marshal = (_marshal_fn_t)marshal_Topen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Topen), + .unmarshal_extrasize = checksize_Topen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Topen, + .marshal = (_marshal_fn_t)marshal_Topen, }, [LIB9P_TYP_Ropen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), - r.unmarshal_extrasize = checksize_Ropen, - r.unmarshal = unmarshal_Ropen, - r.marshal = (_marshal_fn_t)marshal_Ropen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), + .unmarshal_extrasize = checksize_Ropen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Ropen, + .marshal = (_marshal_fn_t)marshal_Ropen, }, [LIB9P_TYP_Tcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), - r.unmarshal_extrasize = checksize_Tcreate, - r.unmarshal = unmarshal_Tcreate, - r.marshal = (_marshal_fn_t)marshal_Tcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), + .unmarshal_extrasize = checksize_Tcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tcreate, + .marshal = (_marshal_fn_t)marshal_Tcreate, }, [LIB9P_TYP_Rcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), - r.unmarshal_extrasize = checksize_Rcreate, - r.unmarshal = unmarshal_Rcreate, - r.marshal = (_marshal_fn_t)marshal_Rcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), + .unmarshal_extrasize = checksize_Rcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rcreate, + .marshal = (_marshal_fn_t)marshal_Rcreate, }, [LIB9P_TYP_Tread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tread), - r.unmarshal_extrasize = checksize_Tread, - r.unmarshal = unmarshal_Tread, - r.marshal = (_marshal_fn_t)marshal_Tread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tread), + .unmarshal_extrasize = checksize_Tread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tread, + .marshal = (_marshal_fn_t)marshal_Tread, }, [LIB9P_TYP_Rread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rread), - r.unmarshal_extrasize = checksize_Rread, - r.unmarshal = unmarshal_Rread, - r.marshal = (_marshal_fn_t)marshal_Rread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rread), + .unmarshal_extrasize = checksize_Rread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rread, + .marshal = (_marshal_fn_t)marshal_Rread, }, [LIB9P_TYP_Twrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), - r.unmarshal_extrasize = checksize_Twrite, - r.unmarshal = unmarshal_Twrite, - r.marshal = (_marshal_fn_t)marshal_Twrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), + .unmarshal_extrasize = checksize_Twrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twrite, + .marshal = (_marshal_fn_t)marshal_Twrite, }, [LIB9P_TYP_Rwrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), - r.unmarshal_extrasize = checksize_Rwrite, - r.unmarshal = unmarshal_Rwrite, - r.marshal = (_marshal_fn_t)marshal_Rwrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), + .unmarshal_extrasize = checksize_Rwrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwrite, + .marshal = (_marshal_fn_t)marshal_Rwrite, }, [LIB9P_TYP_Tclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), - r.unmarshal_extrasize = checksize_Tclunk, - r.unmarshal = unmarshal_Tclunk, - r.marshal = (_marshal_fn_t)marshal_Tclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), + .unmarshal_extrasize = checksize_Tclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tclunk, + .marshal = (_marshal_fn_t)marshal_Tclunk, }, [LIB9P_TYP_Rclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), - r.unmarshal_extrasize = checksize_Rclunk, - r.unmarshal = unmarshal_Rclunk, - r.marshal = (_marshal_fn_t)marshal_Rclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), + .unmarshal_extrasize = checksize_Rclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rclunk, + .marshal = (_marshal_fn_t)marshal_Rclunk, }, [LIB9P_TYP_Tremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), - r.unmarshal_extrasize = checksize_Tremove, - r.unmarshal = unmarshal_Tremove, - r.marshal = (_marshal_fn_t)marshal_Tremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), + .unmarshal_extrasize = checksize_Tremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tremove, + .marshal = (_marshal_fn_t)marshal_Tremove, }, [LIB9P_TYP_Rremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), - r.unmarshal_extrasize = checksize_Rremove, - r.unmarshal = unmarshal_Rremove, - r.marshal = (_marshal_fn_t)marshal_Rremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), + .unmarshal_extrasize = checksize_Rremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rremove, + .marshal = (_marshal_fn_t)marshal_Rremove, }, [LIB9P_TYP_Tstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), - r.unmarshal_extrasize = checksize_Tstat, - r.unmarshal = unmarshal_Tstat, - r.marshal = (_marshal_fn_t)marshal_Tstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), + .unmarshal_extrasize = checksize_Tstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tstat, + .marshal = (_marshal_fn_t)marshal_Tstat, }, [LIB9P_TYP_Rstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), - r.unmarshal_extrasize = checksize_Rstat, - r.unmarshal = unmarshal_Rstat, - r.marshal = (_marshal_fn_t)marshal_Rstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), + .unmarshal_extrasize = checksize_Rstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rstat, + .marshal = (_marshal_fn_t)marshal_Rstat, }, [LIB9P_TYP_Twstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), - r.unmarshal_extrasize = checksize_Twstat, - r.unmarshal = unmarshal_Twstat, - r.marshal = (_marshal_fn_t)marshal_Twstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), + .unmarshal_extrasize = checksize_Twstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twstat, + .marshal = (_marshal_fn_t)marshal_Twstat, }, [LIB9P_TYP_Rwstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), - r.unmarshal_extrasize = checksize_Rwstat, - r.unmarshal = unmarshal_Rwstat, - r.marshal = (_marshal_fn_t)marshal_Rwstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), + .unmarshal_extrasize = checksize_Rwstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwstat, + .marshal = (_marshal_fn_t)marshal_Rwstat, }, [LIB9P_TYP_Tsession] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tsession), - r.unmarshal_extrasize = checksize_Tsession, - r.unmarshal = unmarshal_Tsession, - r.marshal = (_marshal_fn_t)marshal_Tsession, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tsession), + .unmarshal_extrasize = checksize_Tsession, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tsession, + .marshal = (_marshal_fn_t)marshal_Tsession, }, [LIB9P_TYP_Rsession] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rsession), - r.unmarshal_extrasize = checksize_Rsession, - r.unmarshal = unmarshal_Rsession, - r.marshal = (_marshal_fn_t)marshal_Rsession, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rsession), + .unmarshal_extrasize = checksize_Rsession, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rsession, + .marshal = (_marshal_fn_t)marshal_Rsession, }, [LIB9P_TYP_Tsread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tsread), - r.unmarshal_extrasize = checksize_Tsread, - r.unmarshal = unmarshal_Tsread, - r.marshal = (_marshal_fn_t)marshal_Tsread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tsread), + .unmarshal_extrasize = checksize_Tsread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tsread, + .marshal = (_marshal_fn_t)marshal_Tsread, }, [LIB9P_TYP_Rsread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rsread), - r.unmarshal_extrasize = checksize_Rsread, - r.unmarshal = unmarshal_Rsread, - r.marshal = (_marshal_fn_t)marshal_Rsread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rsread), + .unmarshal_extrasize = checksize_Rsread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rsread, + .marshal = (_marshal_fn_t)marshal_Rsread, }, [LIB9P_TYP_Tswrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tswrite), - r.unmarshal_extrasize = checksize_Tswrite, - r.unmarshal = unmarshal_Tswrite, - r.marshal = (_marshal_fn_t)marshal_Tswrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tswrite), + .unmarshal_extrasize = checksize_Tswrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tswrite, + .marshal = (_marshal_fn_t)marshal_Tswrite, }, [LIB9P_TYP_Rswrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rswrite), - r.unmarshal_extrasize = checksize_Rswrite, - r.unmarshal = unmarshal_Rswrite, - r.marshal = (_marshal_fn_t)marshal_Rswrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rswrite), + .unmarshal_extrasize = checksize_Rswrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rswrite, + .marshal = (_marshal_fn_t)marshal_Rswrite, }, }}, [LIB9P_VER_9P2000_u] = { .msgs = { [LIB9P_TYP_Tversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), - r.unmarshal_extrasize = checksize_Tversion, - r.unmarshal = unmarshal_Tversion, - r.marshal = (_marshal_fn_t)marshal_Tversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tversion), + .unmarshal_extrasize = checksize_Tversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tversion, + .marshal = (_marshal_fn_t)marshal_Tversion, }, [LIB9P_TYP_Rversion] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), - r.unmarshal_extrasize = checksize_Rversion, - r.unmarshal = unmarshal_Rversion, - r.marshal = (_marshal_fn_t)marshal_Rversion, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rversion), + .unmarshal_extrasize = checksize_Rversion, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rversion, + .marshal = (_marshal_fn_t)marshal_Rversion, }, [LIB9P_TYP_Tauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), - r.unmarshal_extrasize = checksize_Tauth, - r.unmarshal = unmarshal_Tauth, - r.marshal = (_marshal_fn_t)marshal_Tauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tauth), + .unmarshal_extrasize = checksize_Tauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tauth, + .marshal = (_marshal_fn_t)marshal_Tauth, }, [LIB9P_TYP_Rauth] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), - r.unmarshal_extrasize = checksize_Rauth, - r.unmarshal = unmarshal_Rauth, - r.marshal = (_marshal_fn_t)marshal_Rauth, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rauth), + .unmarshal_extrasize = checksize_Rauth, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rauth, + .marshal = (_marshal_fn_t)marshal_Rauth, }, [LIB9P_TYP_Tattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), - r.unmarshal_extrasize = checksize_Tattach, - r.unmarshal = unmarshal_Tattach, - r.marshal = (_marshal_fn_t)marshal_Tattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tattach), + .unmarshal_extrasize = checksize_Tattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tattach, + .marshal = (_marshal_fn_t)marshal_Tattach, }, [LIB9P_TYP_Rattach] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), - r.unmarshal_extrasize = checksize_Rattach, - r.unmarshal = unmarshal_Rattach, - r.marshal = (_marshal_fn_t)marshal_Rattach, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rattach), + .unmarshal_extrasize = checksize_Rattach, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rattach, + .marshal = (_marshal_fn_t)marshal_Rattach, }, [LIB9P_TYP_Rerror] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), - r.unmarshal_extrasize = checksize_Rerror, - r.unmarshal = unmarshal_Rerror, - r.marshal = (_marshal_fn_t)marshal_Rerror, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rerror), + .unmarshal_extrasize = checksize_Rerror, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rerror, + .marshal = (_marshal_fn_t)marshal_Rerror, }, [LIB9P_TYP_Tflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), - r.unmarshal_extrasize = checksize_Tflush, - r.unmarshal = unmarshal_Tflush, - r.marshal = (_marshal_fn_t)marshal_Tflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tflush), + .unmarshal_extrasize = checksize_Tflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tflush, + .marshal = (_marshal_fn_t)marshal_Tflush, }, [LIB9P_TYP_Rflush] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), - r.unmarshal_extrasize = checksize_Rflush, - r.unmarshal = unmarshal_Rflush, - r.marshal = (_marshal_fn_t)marshal_Rflush, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rflush), + .unmarshal_extrasize = checksize_Rflush, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rflush, + .marshal = (_marshal_fn_t)marshal_Rflush, }, [LIB9P_TYP_Twalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), - r.unmarshal_extrasize = checksize_Twalk, - r.unmarshal = unmarshal_Twalk, - r.marshal = (_marshal_fn_t)marshal_Twalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twalk), + .unmarshal_extrasize = checksize_Twalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twalk, + .marshal = (_marshal_fn_t)marshal_Twalk, }, [LIB9P_TYP_Rwalk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), - r.unmarshal_extrasize = checksize_Rwalk, - r.unmarshal = unmarshal_Rwalk, - r.marshal = (_marshal_fn_t)marshal_Rwalk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwalk), + .unmarshal_extrasize = checksize_Rwalk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwalk, + .marshal = (_marshal_fn_t)marshal_Rwalk, }, [LIB9P_TYP_Topen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Topen), - r.unmarshal_extrasize = checksize_Topen, - r.unmarshal = unmarshal_Topen, - r.marshal = (_marshal_fn_t)marshal_Topen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Topen), + .unmarshal_extrasize = checksize_Topen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Topen, + .marshal = (_marshal_fn_t)marshal_Topen, }, [LIB9P_TYP_Ropen] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), - r.unmarshal_extrasize = checksize_Ropen, - r.unmarshal = unmarshal_Ropen, - r.marshal = (_marshal_fn_t)marshal_Ropen, + .unmarshal_basesize = sizeof(struct lib9p_msg_Ropen), + .unmarshal_extrasize = checksize_Ropen, + .unmarshal = (_unmarshal_fn_t)unmarshal_Ropen, + .marshal = (_marshal_fn_t)marshal_Ropen, }, [LIB9P_TYP_Tcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), - r.unmarshal_extrasize = checksize_Tcreate, - r.unmarshal = unmarshal_Tcreate, - r.marshal = (_marshal_fn_t)marshal_Tcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tcreate), + .unmarshal_extrasize = checksize_Tcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tcreate, + .marshal = (_marshal_fn_t)marshal_Tcreate, }, [LIB9P_TYP_Rcreate] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), - r.unmarshal_extrasize = checksize_Rcreate, - r.unmarshal = unmarshal_Rcreate, - r.marshal = (_marshal_fn_t)marshal_Rcreate, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rcreate), + .unmarshal_extrasize = checksize_Rcreate, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rcreate, + .marshal = (_marshal_fn_t)marshal_Rcreate, }, [LIB9P_TYP_Tread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tread), - r.unmarshal_extrasize = checksize_Tread, - r.unmarshal = unmarshal_Tread, - r.marshal = (_marshal_fn_t)marshal_Tread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tread), + .unmarshal_extrasize = checksize_Tread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tread, + .marshal = (_marshal_fn_t)marshal_Tread, }, [LIB9P_TYP_Rread] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rread), - r.unmarshal_extrasize = checksize_Rread, - r.unmarshal = unmarshal_Rread, - r.marshal = (_marshal_fn_t)marshal_Rread, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rread), + .unmarshal_extrasize = checksize_Rread, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rread, + .marshal = (_marshal_fn_t)marshal_Rread, }, [LIB9P_TYP_Twrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), - r.unmarshal_extrasize = checksize_Twrite, - r.unmarshal = unmarshal_Twrite, - r.marshal = (_marshal_fn_t)marshal_Twrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twrite), + .unmarshal_extrasize = checksize_Twrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twrite, + .marshal = (_marshal_fn_t)marshal_Twrite, }, [LIB9P_TYP_Rwrite] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), - r.unmarshal_extrasize = checksize_Rwrite, - r.unmarshal = unmarshal_Rwrite, - r.marshal = (_marshal_fn_t)marshal_Rwrite, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwrite), + .unmarshal_extrasize = checksize_Rwrite, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwrite, + .marshal = (_marshal_fn_t)marshal_Rwrite, }, [LIB9P_TYP_Tclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), - r.unmarshal_extrasize = checksize_Tclunk, - r.unmarshal = unmarshal_Tclunk, - r.marshal = (_marshal_fn_t)marshal_Tclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tclunk), + .unmarshal_extrasize = checksize_Tclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tclunk, + .marshal = (_marshal_fn_t)marshal_Tclunk, }, [LIB9P_TYP_Rclunk] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), - r.unmarshal_extrasize = checksize_Rclunk, - r.unmarshal = unmarshal_Rclunk, - r.marshal = (_marshal_fn_t)marshal_Rclunk, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rclunk), + .unmarshal_extrasize = checksize_Rclunk, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rclunk, + .marshal = (_marshal_fn_t)marshal_Rclunk, }, [LIB9P_TYP_Tremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), - r.unmarshal_extrasize = checksize_Tremove, - r.unmarshal = unmarshal_Tremove, - r.marshal = (_marshal_fn_t)marshal_Tremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tremove), + .unmarshal_extrasize = checksize_Tremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tremove, + .marshal = (_marshal_fn_t)marshal_Tremove, }, [LIB9P_TYP_Rremove] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), - r.unmarshal_extrasize = checksize_Rremove, - r.unmarshal = unmarshal_Rremove, - r.marshal = (_marshal_fn_t)marshal_Rremove, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rremove), + .unmarshal_extrasize = checksize_Rremove, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rremove, + .marshal = (_marshal_fn_t)marshal_Rremove, }, [LIB9P_TYP_Tstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), - r.unmarshal_extrasize = checksize_Tstat, - r.unmarshal = unmarshal_Tstat, - r.marshal = (_marshal_fn_t)marshal_Tstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Tstat), + .unmarshal_extrasize = checksize_Tstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Tstat, + .marshal = (_marshal_fn_t)marshal_Tstat, }, [LIB9P_TYP_Rstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), - r.unmarshal_extrasize = checksize_Rstat, - r.unmarshal = unmarshal_Rstat, - r.marshal = (_marshal_fn_t)marshal_Rstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rstat), + .unmarshal_extrasize = checksize_Rstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rstat, + .marshal = (_marshal_fn_t)marshal_Rstat, }, [LIB9P_TYP_Twstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), - r.unmarshal_extrasize = checksize_Twstat, - r.unmarshal = unmarshal_Twstat, - r.marshal = (_marshal_fn_t)marshal_Twstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Twstat), + .unmarshal_extrasize = checksize_Twstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Twstat, + .marshal = (_marshal_fn_t)marshal_Twstat, }, [LIB9P_TYP_Rwstat] = { - r.unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), - r.unmarshal_extrasize = checksize_Rwstat, - r.unmarshal = unmarshal_Rwstat, - r.marshal = (_marshal_fn_t)marshal_Rwstat, + .unmarshal_basesize = sizeof(struct lib9p_msg_Rwstat), + .unmarshal_extrasize = checksize_Rwstat, + .unmarshal = (_unmarshal_fn_t)unmarshal_Rwstat, + .marshal = (_marshal_fn_t)marshal_Rwstat, }, }}, }; diff --git a/lib9p/types.gen b/lib9p/types.gen index 0de5068..48f8107 100755 --- a/lib9p/types.gen +++ b/lib9p/types.gen @@ -222,7 +222,7 @@ def gen_h(idprefix: str, versions: set[str], structs: list[Struct]) -> str: #ifndef {guard} #define {guard} -#include +#include /* for uint{{n}}_t types */ """ ret += f""" @@ -322,6 +322,9 @@ def gen_c(idprefix: str, versions: set[str], structs: list[Struct]) -> str: ret = f"""/* Generated by `{' '.join(sys.argv)}`. DO NOT EDIT! */ #include +#include /* for size_t */ +#include /* for PRI* macros */ +#include /* for memset() */ #include @@ -390,20 +393,20 @@ static inline bool _checksize_list(struct _checksize_ctx *ctx, # this, but let's make it obvious. ret += "\n" ret += "\tuint32_t base_offset = ctx->net_offset;\n" - ret += "\tif (_checksize_4(ctx))\n" + ret += "\tif (checksize_4(ctx))\n" ret += "\t\treturn true;\n" ret += "\tuint32_t len = decode_u32le(&ctx->net_bytes[base_offset]);\n" - ret += "\treturn checksize_net(ctx, len) || checksize_host(ctx, len);\n" + ret += "\treturn _checksize_net(ctx, len) || _checksize_host(ctx, len);\n" ret += "}\n" case "s": # Add an extra nul-byte on the host, and validate # UTF-8 (also, similar optimization to "d"). ret += "\n" ret += "\tuint32_t base_offset = ctx->net_offset;\n" - ret += "\tif (_checksize_2(ctx))\n" + ret += "\tif (checksize_2(ctx))\n" ret += "\t\treturn true;\n" ret += "\tuint16_t len = decode_u16le(&ctx->net_bytes[base_offset]);\n" - ret += "\tif (checksize_net(ctx, len) || checksize_host(ctx, ((size_t)len)+1))\n" + ret += "\tif (_checksize_net(ctx, len) || _checksize_host(ctx, ((size_t)len)+1))\n" ret += "\t\treturn true;\n" ret += "\tif (!is_valid_utf8_without_nul(&ctx->net_bytes[base_offset+2], len))\n" ret += '\t\treturn lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8");\n' @@ -442,22 +445,22 @@ static inline bool _checksize_list(struct _checksize_ctx *ctx, ret += """ /* unmarshal_* ****************************************************************/ -static inline vold unmarshal_1(struct _unmarshal_ctx *ctx, uint8_t *out) { +static inline void unmarshal_1(struct _unmarshal_ctx *ctx, uint8_t *out) { *out = decode_u8le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 1; } -static inline vold unmarshal_2(struct _unmarshal_ctx *ctx, uint16_t *out) { +static inline void unmarshal_2(struct _unmarshal_ctx *ctx, uint16_t *out) { *out = decode_u16le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 2; } -static inline vold unmarshal_4(struct _unmarshal_ctx *ctx, uint32_t *out) { +static inline void unmarshal_4(struct _unmarshal_ctx *ctx, uint32_t *out) { *out = decode_u32le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 4; } -static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { +static inline void unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { *out = decode_u64le(&ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 8; } @@ -466,7 +469,7 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { inline = " inline" if struct.msgid is None else "" argfn = used if struct.members else unused ret += "\n" - ret += f"static{inline} void unmarshal_{struct.name}(struct _unmarshal_ctx *{argfn('ctx')}, {c_typename(idprefix, struct)} *{argfn('out')}) {{\n" + ret += f"static{inline} void unmarshal_{struct.name}(struct _unmarshal_ctx *{argfn('ctx')}, {c_typename(idprefix, struct)} *out) {{\n" ret += "\tmemset(out, 0, sizeof(*out));\n" if struct.members: @@ -489,8 +492,8 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { if member.cnt: if member.ver != struct_versions: ret += "{\n" - ret += f"{prefix}out->{member.name} = ctx->host_extra;\n" - ret += f"{prefix}ctx->host_extra += sizeof(out->{member.name}[0]) * out->{member.cnt};\n" + ret += f"{prefix}out->{member.name} = ctx->extra;\n" + ret += f"{prefix}ctx->extra += sizeof(out->{member.name}[0]) * out->{member.cnt};\n" ret += f"{prefix}for (typeof(out->{member.cnt}) i = 0; i < out->{member.cnt}; i++)\n" ret += f"{prefix}\tunmarshal_{member.typ.name}(ctx, &out->{member.name}[i]);\n" if member.ver != struct_versions: @@ -504,43 +507,43 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { /* marshal_* ******************************************************************/ static inline bool _marshal_too_large(struct _marshal_ctx *ctx) { - lib9p_errorf(ctx->ctx, "%s too large to marshal into %s limit (limit=%"PRIu32")", + lib9p_errorf(ctx->ctx, LINUX_EMSGSIZE, "%s too large to marshal into %s limit (limit=%"PRIu32")", (ctx->net_bytes[4] % 2 == 0) ? "T-message" : "R-message", ctx->ctx->version ? "negotiated" : ((ctx->net_bytes[4] % 2 == 0) ? "client" : "server"), - ctx->ctx->max_msg_size)); - return true; + ctx->ctx->max_msg_size); + return true; } static inline bool marshal_1(struct _marshal_ctx *ctx, uint8_t *val) { - if (ctx->net_offset + 1 > ctx->max_msg_size) - return _marshal_too_large(ctx); - out_net_bytes[ctx->net_offset] = *val; + if (ctx->net_offset + 1 > ctx->ctx->max_msg_size) + return _marshal_too_large(ctx); + ctx->net_bytes[ctx->net_offset] = *val; ctx->net_offset += 1; - return false; + return false; } static inline bool marshal_2(struct _marshal_ctx *ctx, uint16_t *val) { - if (ctx->net_offset + 2 > ctx->max_msg_size) - return _marshal_too_large(ctx); - encode_u16le(*val, &out_net_bytes[ctx->net_offset]); + if (ctx->net_offset + 2 > ctx->ctx->max_msg_size) + return _marshal_too_large(ctx); + encode_u16le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 2; - return false; + return false; } static inline bool marshal_4(struct _marshal_ctx *ctx, uint32_t *val) { - if (ctx->net_offset + 4 > ctx->max_msg_size) + if (ctx->net_offset + 4 > ctx->ctx->max_msg_size) return true; - encode_u32le(*val, &out_net_bytes[ctx->net_offset]); + encode_u32le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 4; - return false; + return false; } static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { - if (ctx->net_offset + 8 > ctx->max_msg_size) + if (ctx->net_offset + 8 > ctx->ctx->max_msg_size) return true; - encode_u64le(*val, &out_net_bytes[ctx->net_offset]); + encode_u64le(*val, &ctx->net_bytes[ctx->net_offset]); ctx->net_offset += 8; - return false; + return false; } """ for struct in structs: @@ -563,7 +566,7 @@ static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { ret += f"\n{prefix }({{" ret += f"\n{prefix2}\tbool err = false;" ret += f"\n{prefix2}\tfor (typeof(val->{member.cnt}) i = 0; i < val->{member.cnt} && !err; i++)" - ret += f"\n{prefix2}\t\terr = marshal_{member.typ.name}(ctx, &val->{member.name}[i]));" + ret += f"\n{prefix2}\t\terr = marshal_{member.typ.name}(ctx, &val->{member.name}[i]);" ret += f"\n{prefix2}\terr;" ret += f"\n{prefix2}}})" else: @@ -575,10 +578,10 @@ static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { def msg_entry(msg: Struct) -> str: ret = "" ret += f"\t\t[{idprefix.upper()}TYP_{msg.name}] = {{\n" - ret += f"\t\t\tr.unmarshal_basesize = sizeof({c_typename(idprefix, msg)}),\n" - ret += f"\t\t\tr.unmarshal_extrasize = checksize_{msg.name},\n" - ret += f"\t\t\tr.unmarshal = unmarshal_{msg.name},\n" - ret += f"\t\t\tr.marshal = (_marshal_fn_t)marshal_{msg.name},\n" + ret += f"\t\t\t.unmarshal_basesize = sizeof({c_typename(idprefix, msg)}),\n" + ret += f"\t\t\t.unmarshal_extrasize = checksize_{msg.name},\n" + ret += f"\t\t\t.unmarshal = (_unmarshal_fn_t)unmarshal_{msg.name},\n" + ret += f"\t\t\t.marshal = (_marshal_fn_t)marshal_{msg.name},\n" ret += "\t\t}" return ret -- cgit v1.2.3-2-g168b