diff options
Diffstat (limited to 'lib9p/internal.h')
-rw-r--r-- | lib9p/internal.h | 79 |
1 files changed, 52 insertions, 27 deletions
diff --git a/lib9p/internal.h b/lib9p/internal.h index 61977d4..ebdc3f3 100644 --- a/lib9p/internal.h +++ b/lib9p/internal.h @@ -1,21 +1,20 @@ -/* 9p/internal.h - TODO +/* lib9p/internal.h - TODO * * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com> * SPDX-Licence-Identifier: AGPL-3.0-or-later */ -#ifndef _9P_INTERNAL_H_ -#define _9P_INTERNAL_H_ +#ifndef _LIB9P_INTERNAL_H_ +#define _LIB9P_INTERNAL_H_ #include <assert.h> -#include <stdint.h> #include <stdbool.h> -#include "9p/defs.h" +#include <lib9p/9p.h> -#define USE_CONFIG_9P +#define USE_CONFIG_LIB9P #include "config.h" -static_assert(CONFIG_9P_MAX_ERR_SIZE <= UINT16_MAX); +static_assert(CONFIG_LIB9P_MAX_ERR_SIZE <= UINT16_MAX); /* C language *****************************************************************/ @@ -23,39 +22,65 @@ static_assert(CONFIG_9P_MAX_ERR_SIZE <= UINT16_MAX); /* types **********************************************************************/ -struct p9_ctx { - enum p9_version version; - uint32_t max_msg_size; - uint32_t Rerror_overhead; +/* NB: We declare this here instead of in the public <lib9p/9p.h> + * because we don't want to include "config.h" from public headers, + * and I want the MAX_ERR_SIZE to be configurable. */ +struct lib9p_ctx { + /* negotiated */ + enum lib9p_version version; + uint32_t max_msg_size; + /* negotiated (server) */ + uint32_t Rerror_overhead; + + /* state */ + uint32_t err_num; + char err_msg[CONFIG_LIB9P_MAX_ERR_SIZE]; +}; + +/* vtables ********************************************************************/ - uint32_t err_num; - char err_msg[CONFIG_9P_MAX_ERR_SIZE]; +struct _checksize_ctx { + struct lib9p_ctx *ctx; + uint32_t net_size; + uint8_t net_bytes; + + uint32_t net_offset; + /* Increment `host_extra` to pre-allocate space that is + * "extra" beyond sizeof(). */ + size_t host_extra; }; -static inline enum p9_version p9_ctx_version(p9_ctx *ctx) { - assert(ctx); - return ctx->version; -} +struct _unmarshal_ctx { + struct lib9p_ctx *ctx; -/* vtables ********************************************************************/ + uint32_t net_offset; + /* `extra` points to the beginning of unallocated space. */ + void *extra; +}; + +struct _marshal_ctx { + struct lib9p_ctx *ctx; + + uint8_t *net_bytes; + uint32_t net_offset; +}; -typedef bool (*_checksize_fn_t)(uint32_t net_len, uint8_t *net_bytes, uint32_t *mut_net_offset, size_t *mut_host_extra); -typedef bool (*_unmarshal_fn_t)(uint8_t *net_bytes, uint32_t *mut_net_offset, void **mut_host_extra, void *out); -typedef bool (*_marshal_fn_t)(struct p9_ctx *ctx, void *val, uint8_t *out_net_bytes, uint32_t *mut_net_offset); +typedef bool (*_checksize_fn_t)(struct _checksize_ctx *ctx); +typedef void (*_unmarshal_fn_t)(struct _unmarshal_ctx *ctx, void *out); +typedef bool (*_marshal_fn_t)(struct _marshal_ctx *ctx, void *host_val); -struct msg_vtable { +struct _vtable_msg { size_t unmarshal_basesize; _checksize_fn_t unmarshal_extrasize; _unmarshal_fn_t unmarshal; _marshal_fn_t marshal; }; -struct version { - struct msg_vtable msgs[0xFF]; +struct _vtable_version { + struct _vtable_msg msgs[0xFF]; }; -extern struct version version_9P2000; -/*extern struct version version_9P2000u; */ +extern struct _vtable_version _lib9p_vtables[LIB9P_VER_NUM]; /* unmarshal utilities ********************************************************/ @@ -136,4 +161,4 @@ static inline void encode_u64le(uint64_t in, uint8_t *out) { out[7] = (uint8_t)((in >> 56) & 0xFF); } -#endif /* _9P_INTERNAL_H_ */ +#endif /* _LIB9P_INTERNAL_H_ */ |