summaryrefslogtreecommitdiff
path: root/lib9p_util/include/util9p/static.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib9p_util/include/util9p/static.h')
-rw-r--r--lib9p_util/include/util9p/static.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib9p_util/include/util9p/static.h b/lib9p_util/include/util9p/static.h
new file mode 100644
index 0000000..0b391b8
--- /dev/null
+++ b/lib9p_util/include/util9p/static.h
@@ -0,0 +1,85 @@
+/* util9p/static.h - Serve static files over 9P
+ *
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#ifndef _UTIL9P_STATIC_H_
+#define _UTIL9P_STATIC_H_
+
+#include <lib9p/srv.h>
+
+#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_ */