/* util9p/static.h - Serve static files over 9P * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #ifndef _UTIL9P_STATIC_H_ #define _UTIL9P_STATIC_H_ #include #define util9p_box(nam, obj) \ ((struct lib9p_srv_file){ \ .self = obj, \ .vtable = (void*)&_lo_##nam##_lib9p_srv_file_vtable, \ }) #define UTIL9P_ATIME 1728337905 #define UTIL9P_MTIME 1728337904 /* Common *********************************************************************/ typedef struct { char *u_name; uint32_t u_num; char *g_name; uint32_t g_num; char *m_name; uint32_t m_num; uint64_t pathnum; char *name; lib9p_dm_t perm; uint32_t atime, mtime; } _util9p_static_common; #define UTIL9P_STATIC_COMMON(PATH, STRNAME, MODE) \ { \ .u_name = "root", .u_num = 0, /* owner user */ \ .g_name = "root", .g_num = 0, /* owner group */ \ .m_name = "root", .m_num = 0, /* last-modified-by user */ \ \ .pathnum = PATH, \ .name = STRNAME, \ .perm = MODE, \ .atime = UTIL9P_ATIME, \ .mtime = UTIL9P_MTIME, \ } /* Dir ************************************************************************/ struct util9p_static_dir { _util9p_static_common; /* NULL-terminated */ lo_interface lib9p_srv_file members[]; }; LO_IMPLEMENTATION_H(lib9p_srv_file, struct util9p_static_dir, util9p_static_dir); #define lo_box_util9p_static_dir_as_lib9p_srv_file(obj) util9p_box(util9p_static_dir, obj) #define UTIL9P_STATIC_DIR(PATH, STRNAME, ...) \ lo_box_util9p_static_dir_as_lib9p_srv_file(&((struct util9p_static_dir){ \ ._util9p_static_common = UTIL9P_STATIC_COMMON(PATH, STRNAME, 0555), \ .members = { __VA_ARGS__ LO_NULL(lib9p_srv_file) }, \ })) /* File ***********************************************************************/ struct util9p_static_file { _util9p_static_common; char *data_start; /* must not be NULL */ char *data_end; /* may be NULL, in which case data_size is used */ size_t data_size; /* only used if .data_end==NULL */ }; LO_IMPLEMENTATION_H(lib9p_srv_file, struct util9p_static_file, util9p_static_file); #define lo_box_util9p_static_file_as_lib9p_srv_file(obj) util9p_box(util9p_static_file, obj) #define UTIL9P_STATIC_FILE(PATH, STRNAME, ...) \ lo_box_util9p_static_file_as_lib9p_srv_file(&((struct util9p_static_file){ \ ._util9p_static_common = UTIL9P_STATIC_COMMON(PATH, STRNAME, 0444), \ __VA_ARGS__ \ })) #endif /* _UTIL9P_STATIC_H_ */