kore

An easy to use, scalable and secure web application framework for writing web APIs in C.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 93fd33e00e2a593a43075645780dc882b84f4870
parent 4b0e4c63f880826f0d50c9f1e980fdf86d10c03c
Author: Joris Vink <joris@coders.se>
Date:   Sun,  3 Aug 2014 16:55:16 +0200

Big changes to how we handle "static" files.

* Rename static files to assets
* static_* has become asset_*
* Always generate asset.h with the right external symbols

Diffstat:
src/cli.c | 70+++++++++++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 41 insertions(+), 29 deletions(-)

diff --git a/src/cli.c b/src/cli.c @@ -87,10 +87,11 @@ static void cli_cleanup_files(const char *); static void cli_file_writef(int, const char *, ...); static void cli_file_open(const char *, int, int *); static void cli_file_remove(char *, struct dirent *); -static void cli_build_static(char *, struct dirent *); +static void cli_build_asset(char *, struct dirent *); static void cli_file_write(int, const void *, size_t); static int cli_vasprintf(char **, const char *, ...); static void cli_spawn_proc(void (*cb)(void *), void *); +static void cli_write_asset(const char *, const char *); static void cli_register_cfile(char *, struct dirent *); static void cli_file_create(const char *, const char *, size_t); static int cli_file_requires_build(struct stat *, const char *); @@ -129,7 +130,7 @@ static const char *gen_dirs[] = { "cert", #endif "conf", - "static", + "assets", NULL }; @@ -262,8 +263,8 @@ cli_build(int argc, char **argv) struct cfile *cf; struct timeval times[2]; int requires_relink; - char pwd[PATH_MAX], *src_path, *static_header; - char *static_path, *p, *obj_path, *cpath, *config; + char pwd[PATH_MAX], *src_path, *assets_header; + char *assets_path, *p, *obj_path, *cpath, *config; if (argc == 0) { if (getcwd(pwd, sizeof(pwd)) == NULL) @@ -283,9 +284,9 @@ cli_build(int argc, char **argv) TAILQ_INIT(&source_files); (void)cli_vasprintf(&src_path, "%s/src", rootdir); - (void)cli_vasprintf(&static_path, "%s/static", rootdir); + (void)cli_vasprintf(&assets_path, "%s/assets", rootdir); (void)cli_vasprintf(&config, "%s/conf/%s.conf", rootdir, appl); - (void)cli_vasprintf(&static_header, "%s/src/static.h", rootdir); + (void)cli_vasprintf(&assets_header, "%s/src/assets.h", rootdir); if (!cli_dir_exists(src_path) || !cli_file_exists(config)) cli_fatal("%s doesn't appear to be a kore app", appl); @@ -296,17 +297,21 @@ cli_build(int argc, char **argv) cli_mkdir(obj_path, 0755); free(obj_path); - (void)unlink(static_header); + (void)unlink(assets_header); - /* Generate the static files. */ - if (cli_dir_exists(static_path)) { - cli_file_open(static_header, + /* Generate the assets. */ + if (cli_dir_exists(assets_path)) { + cli_file_open(assets_header, O_CREAT | O_TRUNC | O_WRONLY, &s_fd); - cli_find_files(static_path, cli_build_static); + + cli_file_writef(s_fd, "#ifndef __H_%s_ASSETS_H\n", appl); + cli_file_writef(s_fd, "#define __H_%s_ASSETS_H\n", appl); + cli_find_files(assets_path, cli_build_asset); + cli_file_writef(s_fd, "\n#endif\n"); cli_file_close(s_fd); } - free(static_path); + free(assets_path); /* Build all source files. */ cli_find_files(src_path, cli_register_cfile); @@ -327,8 +332,8 @@ cli_build(int argc, char **argv) requires_relink++; } - (void)unlink(static_header); - free(static_header); + (void)unlink(assets_header); + free(assets_header); (void)cli_vasprintf(&cpath, "%s/cert", rootdir); if (!cli_dir_exists(cpath)) { @@ -533,7 +538,15 @@ cli_file_create(const char *name, const char *data, size_t len) } static void -cli_build_static(char *fpath, struct dirent *dp) +cli_write_asset(const char *n, const char *e) +{ + cli_file_writef(s_fd, "extern u_int8_t asset_%s_%s[];\n", n, e); + cli_file_writef(s_fd, "extern u_int32_t asset_len_%s_%s;\n", n, e); + cli_file_writef(s_fd, "extern time_t asset_mtime_%s_%s;\n", n, e); +} + +static void +cli_build_asset(char *fpath, struct dirent *dp) { struct stat st; u_int8_t *d; @@ -543,6 +556,10 @@ cli_build_static(char *fpath, struct dirent *dp) int in, out; char *cpath, *ext, *opath; + /* Grab the extension as we're using it in the symbol name. */ + if ((ext = strrchr(dp->d_name, '.')) == NULL) + cli_fatal("couldn't find ext in %s", dp->d_name); + /* Grab inode information. */ if (stat(fpath, &st) == -1) cli_fatal("stat: %s %s", fpath, errno_s); @@ -550,14 +567,14 @@ cli_build_static(char *fpath, struct dirent *dp) /* Check if the file needs to be built. */ (void)cli_vasprintf(&opath, "%s/.objs/%s.o", rootdir, dp->d_name); if (!cli_file_requires_build(&st, opath)) { + *(ext)++ = '\0'; + cli_write_asset(dp->d_name, ext); + *ext = '.'; + free(opath); return; } - /* Grab the extension as we're using it in the symbol name. */ - if ((ext = strrchr(dp->d_name, '.')) == NULL) - cli_fatal("couldn't find ext in %s", dp->d_name); - /* Open the file we're convering. */ cli_file_open(fpath, O_RDONLY, &in); @@ -571,13 +588,13 @@ cli_build_static(char *fpath, struct dirent *dp) cli_file_open(cpath, O_CREAT | O_TRUNC | O_WRONLY, &out); /* No longer need dp->d_name so cut off the extension. */ - printf("converting %s\n", dp->d_name); + printf("building asset %s\n", dp->d_name); *(ext)++ = '\0'; /* Start generating the file. */ cli_file_writef(out, "/* Auto generated */\n"); cli_file_writef(out, "#include <sys/param.h>\n\n"); - cli_file_writef(out, "u_int8_t static_%s_%s[] = {\n", dp->d_name, ext); + cli_file_writef(out, "u_int8_t asset_%s_%s[] = {\n", dp->d_name, ext); /* Copy all data into a buf and write it out afterwards. */ d = base; @@ -586,18 +603,13 @@ cli_build_static(char *fpath, struct dirent *dp) /* Add the meta data. */ cli_file_writef(out, "};\n\n"); - cli_file_writef(out, "u_int32_t static_len_%s_%s = %" PRIu32 ";\n", + cli_file_writef(out, "u_int32_t asset_len_%s_%s = %" PRIu32 ";\n", dp->d_name, ext, (u_int32_t)st.st_size); - cli_file_writef(out, "time_t static_mtime_%s_%s = %" PRI_TIME_T ";\n", + cli_file_writef(out, "time_t asset_mtime_%s_%s = %" PRI_TIME_T ";\n", dp->d_name, ext, st.st_mtime); /* Write the file symbols into static.h so they can be used. */ - cli_file_writef(s_fd, "extern u_int8_t static_%s_%s[];\n", - dp->d_name, ext); - cli_file_writef(s_fd, "extern u_int32_t static_len_%s_%s;\n", - dp->d_name, ext); - cli_file_writef(s_fd, "extern time_t static_mtime_%s_%s;\n", - dp->d_name, ext); + cli_write_asset(dp->d_name, ext); /* Cleanup static file source. */ if (munmap(base, st.st_size) == -1)