Pack the assets into a ZIP bundle
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,3 +4,5 @@ build
|
||||
gpp1
|
||||
watcher
|
||||
commit.h
|
||||
compile_flags.txt
|
||||
bundle.zip
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -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
|
||||
|
74
baked.c
74
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;
|
||||
}
|
||||
|
32
baked.h
32
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);
|
||||
|
113
build.c
113
build.c
@ -1,6 +1,8 @@
|
||||
#include <libgen.h>
|
||||
#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");
|
||||
|
2
gebs
2
gebs
Submodule gebs updated: 6db36114d5...596bb1ef76
13
main.c
13
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
1
zip
Submodule
1
zip
Submodule
Submodule zip added at 649a16c5ea
Reference in New Issue
Block a user