From 2badc915d6b396081df4f61b3a642d23c1a9a59c Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Fri, 27 Jun 2025 20:11:42 +0200 Subject: [PATCH] Pack the assets into a ZIP bundle --- .gitignore | 2 + .gitmodules | 3 ++ baked.c | 74 ++++++++++++---------------------- baked.h | 32 +++------------ build.c | 113 ++++++++++++++++++++++++++++++++++++---------------- gebs | 2 +- main.c | 13 +++--- zip | 1 + 8 files changed, 122 insertions(+), 118 deletions(-) create mode 160000 zip diff --git a/.gitignore b/.gitignore index 279c17e..5d97285 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ build gpp1 watcher commit.h +compile_flags.txt +bundle.zip diff --git a/.gitmodules b/.gitmodules index dd9cfe2..60ad9eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [submodule "md5-c"] path = md5-c url = https://github.com/Zunawe/md5-c.git +[submodule "zip"] + path = zip + url = https://github.com/kuba--/zip.git diff --git a/baked.c b/baked.c index 51c6421..e6eba49 100644 --- a/baked.c +++ b/baked.c @@ -6,31 +6,9 @@ #include "baked.h" #include "locked.h" +#include "zip.h" -INCBIN(gpp1, "./gpp1"); - -INCBIN(home_html, "./tmpls/home.html"); -INCBIN(page_missing_html, "./tmpls/page-missing.html"); -INCBIN(template_blog_html, "./tmpls/template-blog.html"); -INCBIN(blog_html, "./tmpls/blog.html"); - -INCBIN(simple_css, "./etc/simple.css"); -INCBIN(favicon_ico, "./etc/favicon.ico"); -#if MY_DEBUG -INCBIN(hotreload_js, "./etc/hotreload.js"); -#endif -INCBIN(theme_js, "./etc/theme.js"); -INCBIN(highlight_js, "./etc/highlight.js"); -INCBIN(hljs_rainbow_css, "./etc/hljs-rainbow.css"); -INCBIN(marked_js, "./etc/marked.js"); -INCBIN(me_jpg, "./etc/me.jpg"); -INCBIN(tmoa_engine_jpg, "./etc/tmoa-engine.jpg"); -INCBIN(tmoa_garbage_jpg, "./etc/tmoa-garbage.jpg"); - -INCBIN(blog_welcome_md, "./blog/welcome.md"); -INCBIN(blog_weird_page_md, "./blog/weird-page.md"); -INCBIN(blog_curious_case_of_gebs_md, "./blog/curious-case-of-gebs.md"); -INCBIN(blog_the_making_of_aboba_md, "./blog/the-making-of-aboba.md"); +INCBIN(bundle_zip, "./bundle.zip"); static locked(Baked_Resource *) baked_resources = locked_init(nil); @@ -52,33 +30,29 @@ void add_baked_resource(char *key, const uchar *data, size_t size) abort(); } write(fd, data, size); - shput(baked_resources.value, key, fd); + shput(baked_resources.value, key, ((Baked_Resource_Value){ .memfd = fd, .bufptr = (void *)data })); } void init_baked_resources(void) { lockx(&baked_resources); - add_baked_resource("home.html", home_html_data, home_html_size); - add_baked_resource("page-missing.html", page_missing_html_data, page_missing_html_size); - add_baked_resource("template-blog.html", template_blog_html_data, template_blog_html_size); - add_baked_resource("blog.html", blog_html_data, blog_html_size); - add_baked_resource("gpp1", gpp1_data, gpp1_size); - add_baked_resource("simple.css", simple_css_data, simple_css_size); - add_baked_resource("favicon.ico", favicon_ico_data, favicon_ico_size); -#if MY_DEBUG - add_baked_resource("hotreload.js", hotreload_js_data, hotreload_js_size); -#endif - add_baked_resource("theme.js", theme_js_data, theme_js_size); - add_baked_resource("highlight.js", highlight_js_data, highlight_js_size); - add_baked_resource("hljs-rainbow.css", hljs_rainbow_css_data, hljs_rainbow_css_size); - add_baked_resource("marked.js", marked_js_data, marked_js_size); - add_baked_resource("me.jpg", me_jpg_data, me_jpg_size); - add_baked_resource("tmoa-engine.jpg", tmoa_engine_jpg_data, tmoa_engine_jpg_size); - add_baked_resource("tmoa-garbage.jpg", tmoa_garbage_jpg_data, tmoa_garbage_jpg_size); - add_baked_resource("blog-welcome.md", blog_welcome_md_data, blog_welcome_md_size); - add_baked_resource("blog-weird-page.md", blog_weird_page_md_data, blog_weird_page_md_size); - add_baked_resource("blog-curious-case-of-gebs.md", blog_curious_case_of_gebs_md_data, blog_curious_case_of_gebs_md_size); - add_baked_resource("blog-the-making-of-aboba.md", blog_the_making_of_aboba_md_data, blog_the_making_of_aboba_md_size); + + struct zip_t *zip = zip_stream_open(bundle_zip_data, bundle_zip_size, ZIP_DEFAULT_COMPRESSION_LEVEL, 'r'); + size_t n = zip_entries_total(zip); + for (size_t i = 0; i < n; i++) { + zip_entry_openbyindex(zip, i); + + const char *name = strdup(zip_entry_name(zip)); + size_t size = zip_entry_size(zip); + char *buf = malloc(size); + zip_entry_noallocread(zip, buf, size); + + add_baked_resource((char *)name, buf, size); + + zip_entry_close(zip); + } + zip_stream_close(zip); + unlockx(&baked_resources); } @@ -86,7 +60,9 @@ void free_baked_resources(void) { lockx(&baked_resources); for (size_t i = 0; i < shlen(baked_resources.value); i++) { - close(baked_resources.value[i].value); + close(baked_resources.value[i].value.memfd); + free(baked_resources.value[i].key); + free(baked_resources.value[i].value.bufptr); } shfree(baked_resources.value); unlockx(&baked_resources); @@ -95,8 +71,8 @@ void free_baked_resources(void) bool get_baked_resource_path(char *key, char *buf, size_t size) { if (shgeti(baked_resources.value, key) != -1) { - int fd = shget(baked_resources.value, key); - snprintf(buf, size, "/proc/%d/fd/%d", getpid(), fd); + Baked_Resource_Value brv = shget(baked_resources.value, key); + snprintf(buf, size, "/proc/%d/fd/%d", getpid(), brv.memfd); unlockx(&baked_resources); return true; } diff --git a/baked.h b/baked.h index e4cd660..abfb44a 100644 --- a/baked.h +++ b/baked.h @@ -1,36 +1,14 @@ #ifndef BAKED_H_ #define BAKED_H_ -#include "incbin/incbin.h" - -INCBIN_EXTERN(gpp1); - -INCBIN_EXTERN(home_html); -INCBIN_EXTERN(page_missing_html); -INCBIN_EXTERN(template_blog_html); -INCBIN_EXTERN(blog_html); - -INCBIN_EXTERN(simple_css); -INCBIN_EXTERN(favicon_ico); -#if MY_DEBUG -INCBIN_EXTERN(hotreload_js); -#endif -INCBIN_EXTERN(theme_js); -INCBIN_EXTERN(highlight_js); -INCBIN_EXTERN(hljs_rainbow_css); -INCBIN_EXTERN(marked_js); -INCBIN_EXTERN(me_jpg); -INCBIN_EXTERN(tmoa_engine_jpg); -INCBIN_EXTERN(tmoa_garbage_jpg); - -INCBIN_EXTERN(blog_welcome_md); -INCBIN_EXTERN(blog_weird_page_md); -INCBIN_EXTERN(blog_curious_case_of_gebs_md); -INCBIN_EXTERN(blog_the_making_of_aboba_md); +typedef struct { + int memfd; + void *bufptr; +} Baked_Resource_Value; typedef struct { char *key; // path - int value; // memfd + Baked_Resource_Value value; } Baked_Resource; void init_baked_resources(void); diff --git a/build.c b/build.c index 35c0fc9..bbe3971 100644 --- a/build.c +++ b/build.c @@ -1,6 +1,8 @@ +#include #define GEBS_NO_PREFIX #define GEBS_IMPLEMENTATION #include "gebs/gebs.h" +#include "./zip/src/zip.c" char *prog = NULL; @@ -15,6 +17,27 @@ int main(int argc, char ** argv) prog = SHIFT(&argc, &argv); char *cmd = SHIFT(&argc, &argv); if (strcmp(cmd, "make") == 0) { + #define BUNDLED_FILES \ + "./gpp1", \ + "./tmpls/home.html", \ + "./tmpls/page-missing.html", \ + "./tmpls/template-blog.html", \ + "./tmpls/blog.html", \ + "./etc/hotreload.js", \ + "./etc/theme.js", \ + "./etc/simple.css", \ + "./etc/highlight.js", \ + "./etc/hljs-rainbow.css", \ + "./etc/marked.js", \ + "./etc/favicon.ico", \ + "./etc/me.jpg", \ + "./etc/tmoa-engine.jpg", \ + "./etc/tmoa-garbage.jpg", \ + "./blog/welcome.md", \ + "./blog/weird-page.md", \ + "./blog/curious-case-of-gebs.md", \ + "./blog/the-making-of-aboba.md" + RULE("./aboba", "./main.c", "./routes.c", @@ -29,28 +52,9 @@ int main(int argc, char ** argv) "./locked.h", "./mongoose.o", - "./gpp1", - "./tmpls/home.html", - "./tmpls/page-missing.html", - "./tmpls/template-blog.html", - "./tmpls/blog.html", - - "./etc/hotreload.js", - "./etc/theme.js", - "./etc/simple.css", - "./etc/highlight.js", - "./etc/hljs-rainbow.css", - "./etc/marked.js", - "./etc/favicon.ico", - "./etc/me.jpg", - "./etc/tmoa-engine.jpg", - "./etc/tmoa-garbage.jpg", - - "./blog/welcome.md", - "./blog/weird-page.md", - "./blog/curious-case-of-gebs.md", - "./blog/the-making-of-aboba.md" + "./bundle.zip", + BUNDLED_FILES ) { RULE("./mongoose.o", "./mongoose/mongoose.c") { @@ -63,10 +67,6 @@ int main(int argc, char ** argv) #endif } - RULE("./gpp1", "./gpp/gpp.c") { - CMD("cc", "-DHAVE_STRDUP", "-DHAVE_FNMATCH_H", "-o", "gpp1", "gpp/gpp.c"); - } - RULE("./commit.h") { String_Builder commit = {0}; defer { sb_free(&commit); } @@ -95,18 +95,63 @@ int main(int argc, char ** argv) } } + const char *bundle_zip_deps[] = { BUNDLED_FILES }; + + RULE_ARRAY("./bundle.zip", bundle_zip_deps) { + RULE("./gpp1", "./gpp/gpp.c") { + CMD("cc", "-DHAVE_STRDUP", "-DHAVE_FNMATCH_H", "-o", "gpp1", "gpp/gpp.c"); + } + + struct zip_t *zip = zip_open("./bundle.zip", ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + defer { zip_close(zip); } + + for (size_t i = 0; i < sizeof(bundle_zip_deps)/sizeof(bundle_zip_deps[0]); i++) { + char *copy = strdup(bundle_zip_deps[i]); + defer { free(copy); } + char *name = basename(copy); + + String_Builder sb = {0}; + defer { sb_free(&sb); } + sb_read_file(&sb, bundle_zip_deps[i]); + + zip_entry_open(zip, name); + zip_entry_write(zip, sb.items, sb.count); + zip_entry_close(zip); + } + LOGI("Generated bundle.zip\n"); + } + + #define CC "cc" + #define TARGET "-o", "aboba" #if MY_DEBUG - CMD("cc", "-fsanitize=address", "-fPIC", "-ggdb", "-I.", "-DMY_DEBUG=1", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", - "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE", "-Wl,-z,execstack", "-o", "./aboba", - "./main.c", "./routes.c", "./baked.c", "./timer.c", "./mongoose.o", "./cJSON/cJSON.c", - "./md5-c/md5.c", - "-lpthread"); + #define CFLAGS "-fsanitize=address", "-fPIC", "-ggdb" + #define DEFINES "-DMY_DEBUG=1", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE" + #define EXTRA_SOURCES "./cJSON/cJSON.c", "./zip/src/zip.c", "./md5-c/md5.c" #else - CMD("cc", "-fPIC", "-I.", "-DMY_DEBUG=0", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", - "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE", "-Wl,-z,execstack", "-o", "./aboba", - "./main.c", "./routes.c", "./baked.c", "./timer.c", "./mongoose.o", "./cJSON/cJSON.c", - "-lpthread"); + #define CFLAGS "-fPIC" + #define DEFINES "-DMY_DEBUG=0", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE" + #define EXTRA_SOURCES "./cJSON/cJSON.c", "./zip/src/zip.c" #endif + #define SOURCES "./main.c", "./routes.c", "./baked.c", "./timer.c" + #define OBJECTS "./mongoose.o" + #define LINK_FLAGS "-Wl,-z,execstack", "-lpthread" + #define INC_FLAGS "-I.", "-I./zip/src" + + CMD(CC, TARGET, CFLAGS, DEFINES, INC_FLAGS, SOURCES, OBJECTS, EXTRA_SOURCES, LINK_FLAGS); + + RULE("./compile_flags.txt") { + make_compile_flags(TARGET, CFLAGS, DEFINES, INC_FLAGS, SOURCES, OBJECTS, EXTRA_SOURCES, LINK_FLAGS); + } + + #undef CC + #undef TARGET + #undef CFLAGS + #undef DEFINES + #undef EXTRA_SOURCES + #undef SOURCES + #undef OBJECTS + #undef LINK_FLAGS + #undef INC_FLAGS } } else if (strcmp(cmd, "clean") == 0) { remove1("./build"); diff --git a/gebs b/gebs index 6db3611..596bb1e 160000 --- a/gebs +++ b/gebs @@ -1 +1 @@ -Subproject commit 6db36114d55224846c0a7516dc70a4306874c400 +Subproject commit 596bb1ef766e63b7acf06deb46868786463cbe5b diff --git a/main.c b/main.c index dc655de..4b7111d 100644 --- a/main.c +++ b/main.c @@ -103,13 +103,6 @@ void event_handler(struct mg_connection *conn, int ev, void *ev_data) } else if (ev == MG_EV_WAKEUP) { struct mg_str *data = (struct mg_str *)ev_data; Route_Result *result = (Route_Result *)data->buf; - defer { - for (size_t i = 0; i < result->headers.count; i++) { - free(result->headers.items[i]); - } - list_free(&result->headers); - sb_free(&result->body); - } Gebs_String_Builder sb = {0}; defer { sb_free(&sb); } @@ -125,6 +118,12 @@ void event_handler(struct mg_connection *conn, int ev, void *ev_data) char *path = result->body.items; mg_http_serve_file(conn, ev_data, path, &(struct mg_http_serve_opts){0}); } + + for (size_t i = 0; i < result->headers.count; i++) { + free(result->headers.items[i]); + } + list_free(&result->headers); + sb_free(&result->body); } } diff --git a/zip b/zip new file mode 160000 index 0000000..649a16c --- /dev/null +++ b/zip @@ -0,0 +1 @@ +Subproject commit 649a16c5ea701c91c0b013ff614f7259012170b2