From aa0754d302973e1724af130cd6633af36425b98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Thu, 26 Jan 2023 01:20:57 +0100 Subject: [PATCH] add buildable demo, heatshrink kinda broken --- Makefile | 27 +-- demo/.gitignore | 7 + demo/Makefile | 35 ++++ main.c => demo/server_demo.c | 27 ++- demo/staticfiles/index.html | 10 + demo/staticfiles/kocour.jpg | Bin 0 -> 119057 bytes espfsbuilder/Makefile | 11 +- espfsbuilder/README.md | 7 + espfsbuilder/main.c | 184 +++++++++--------- espfsbuilder/parsing.c | 67 +++++++ espfsbuilder/parsing.h | 7 + spritehttpd/.gitignore | 5 + spritehttpd/Makefile | 51 +++++ {lib => spritehttpd}/include/auth.h | 0 {lib => spritehttpd}/include/cgiwebsocket.h | 0 {lib => spritehttpd}/include/httpd-platform.h | 0 {lib => spritehttpd}/include/httpd-utils.h | 0 {lib => spritehttpd}/include/httpd.h | 0 {lib => spritehttpd}/include/httpdespfs.h | 0 {lib => spritehttpd}/include/logging.h | 0 {lib => spritehttpd/lib}/espfs/espfs.c | 9 + {lib => spritehttpd/lib}/espfs/espfs.h | 1 + {lib => spritehttpd/lib}/espfs/espfsformat.h | 2 +- .../lib}/heatshrink/heatshrink_common.h | 0 .../lib}/heatshrink/heatshrink_config.h | 0 .../lib}/heatshrink/heatshrink_decoder.c | 0 .../lib}/heatshrink/heatshrink_decoder.h | 0 .../lib}/heatshrink/heatshrink_encoder.c | 22 +-- .../lib}/heatshrink/heatshrink_encoder.h | 2 +- {lib => spritehttpd}/src/cgiwebsocket.c | 0 {lib => spritehttpd}/src/httpd-loop.c | 16 ++ {lib => spritehttpd}/src/httpd.c | 0 {lib => spritehttpd}/src/httpdespfs.c | 5 +- .../src/port/httpd-freertos.c | 0 {lib => spritehttpd}/src/port/httpd-posix.c | 0 {lib => spritehttpd}/src/utils/base64.c | 0 {lib => spritehttpd}/src/utils/base64.h | 0 {lib => spritehttpd}/src/utils/sha1.c | 0 {lib => spritehttpd}/src/utils/sha1.h | 0 .../todo/esphttpclient/LICENSE | 0 .../todo/esphttpclient/README.md | 0 .../todo/esphttpclient/httpclient.c | 0 {lib => spritehttpd}/todo/httpclient.h | 0 {lib => spritehttpd}/todo/uptime.c | 0 {lib => spritehttpd}/todo/uptime.h | 0 {lib => spritehttpd}/todo/webpages-espfs.h | 0 {lib => spritehttpd}/todo/webpages.espfs.ld | 0 47 files changed, 366 insertions(+), 129 deletions(-) create mode 100644 demo/.gitignore create mode 100644 demo/Makefile rename main.c => demo/server_demo.c (65%) create mode 100644 demo/staticfiles/index.html create mode 100644 demo/staticfiles/kocour.jpg create mode 100644 espfsbuilder/README.md create mode 100644 espfsbuilder/parsing.c create mode 100644 espfsbuilder/parsing.h create mode 100644 spritehttpd/.gitignore create mode 100644 spritehttpd/Makefile rename {lib => spritehttpd}/include/auth.h (100%) rename {lib => spritehttpd}/include/cgiwebsocket.h (100%) rename {lib => spritehttpd}/include/httpd-platform.h (100%) rename {lib => spritehttpd}/include/httpd-utils.h (100%) rename {lib => spritehttpd}/include/httpd.h (100%) rename {lib => spritehttpd}/include/httpdespfs.h (100%) rename {lib => spritehttpd}/include/logging.h (100%) rename {lib => spritehttpd/lib}/espfs/espfs.c (96%) rename {lib => spritehttpd/lib}/espfs/espfs.h (98%) rename {lib => spritehttpd/lib}/espfs/espfsformat.h (83%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_common.h (100%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_config.h (100%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_decoder.c (100%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_decoder.h (100%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_encoder.c (99%) rename {lib => spritehttpd/lib}/heatshrink/heatshrink_encoder.h (98%) rename {lib => spritehttpd}/src/cgiwebsocket.c (100%) rename {lib => spritehttpd}/src/httpd-loop.c (95%) rename {lib => spritehttpd}/src/httpd.c (100%) rename {lib => spritehttpd}/src/httpdespfs.c (99%) rename {lib => spritehttpd}/src/port/httpd-freertos.c (100%) rename {lib => spritehttpd}/src/port/httpd-posix.c (100%) rename {lib => spritehttpd}/src/utils/base64.c (100%) rename {lib => spritehttpd}/src/utils/base64.h (100%) rename {lib => spritehttpd}/src/utils/sha1.c (100%) rename {lib => spritehttpd}/src/utils/sha1.h (100%) rename {lib => spritehttpd}/todo/esphttpclient/LICENSE (100%) rename {lib => spritehttpd}/todo/esphttpclient/README.md (100%) rename {lib => spritehttpd}/todo/esphttpclient/httpclient.c (100%) rename {lib => spritehttpd}/todo/httpclient.h (100%) rename {lib => spritehttpd}/todo/uptime.c (100%) rename {lib => spritehttpd}/todo/uptime.h (100%) rename {lib => spritehttpd}/todo/webpages-espfs.h (100%) rename {lib => spritehttpd}/todo/webpages.espfs.ld (100%) diff --git a/Makefile b/Makefile index a6377b0..21defe6 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,14 @@ -PORT_SOURCES = lib/src/port/httpd-posix.c +.PHONY: all clean espfsbuilder demo lib -LIB_SOURCES = ${PORT_SOURCES} \ - lib/src/utils/base64.c \ - lib/src/utils/sha1.c \ - lib/espfs/espfs.c \ - lib/src/httpdespfs.c \ - lib/src/httpd.c \ - lib/src/httpd-loop.c \ - lib/src/cgiwebsocket.c \ - lib/heatshrink/heatshrink_decoder.c +all: demo espfsbuilder -LIB_INCLUDES = -Ilib/include -Ilib/heatshrink -Ilib/espfs +clean: + make -C ./spritehttpd clean + make -C ./demo clean + make -C ./espfsbuilder clean -DEMO_SOURCES = main.c +espfsbuilder: + make -C ./espfsbuilder - -all: demo - -demo: ${LIB_SOURCES} ${DEMO_SOURCES} - cc -g $^ -o $@ ${LIB_INCLUDES} +demo: + make -C ./demo diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..9f12867 --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1,7 @@ +demo +*.o +.idea/ +*.bin +*.a +staticfiles-embed.c +staticfiles.bin diff --git a/demo/Makefile b/demo/Makefile new file mode 100644 index 0000000..c822cd7 --- /dev/null +++ b/demo/Makefile @@ -0,0 +1,35 @@ +DEMO_SOURCES = server_demo.c staticfiles-embed.c + +FSBUILDER = ../espfsbuilder/mkespfsimage + +LIBFILE = ../spritehttpd/libspritehttpd.a + +STATIC_FILES = \ + staticfiles/index.html \ + staticfiles/kocour.jpg + +all: demo + +$(FSBUILDER): + make -C ../espfsbuilder + +staticfiles.bin: $(FSBUILDER) ${STATIC_FILES} + $(FSBUILDER) -c1 -g jpg --strip-path staticfiles -o $@ ${STATIC_FILES} + $(FSBUILDER) -p $@ + +staticfiles-embed.c: staticfiles.bin + xxd -i -n espfs_image $< $@ + +clean: + rm -f demo staticfiles.bin staticfiles-embed.c + make -C ../spritehttpd + +$(LIBFILE): + make -C ../spritehttpd PLATFORM=posix CFLAGS="-Og -g" + +demo: ${DEMO_SOURCES} $(LIBFILE) + cc -Og -g -Wall ${DEMO_SOURCES} \ + -o $@ \ + -I../spritehttpd/include \ + -lspritehttpd \ + -L../spritehttpd/ diff --git a/main.c b/demo/server_demo.c similarity index 65% rename from main.c rename to demo/server_demo.c index 8fa35b7..0d0ec14 100644 --- a/main.c +++ b/demo/server_demo.c @@ -3,14 +3,17 @@ #include "httpd-utils.h" #include "httpdespfs.h" - #include #include #include #include +#include #include "logging.h" +extern unsigned char espfs_image[]; +extern unsigned int espfs_image_len; + /** "About" page */ httpd_cgi_state tplIndex(HttpdConnData *connData, char *token, void **arg) { @@ -35,18 +38,26 @@ const HttpdBuiltInUrl routes[] = { // TODO password lock ... // --- Web pages --- - ROUTE_TPL_FILE("/", tplIndex, "/index.tpl"), +// ROUTE_TPL_FILE("/", tplIndex, "/index.tpl"), + ROUTE_FILE("/", "index.html"), ROUTE_FILESYSTEM(), ROUTE_END(), }; +void sigpipe_handler(int unused) +{ +} + int main() { printf("Hello, World!\n"); + // prevent abort on sigpipe + sigaction(SIGPIPE, &(struct sigaction) {sigpipe_handler}, NULL); + struct httpd_options opts = { - .port = 80, + .port = 8080, }; httpd_thread_handle_t *handle = httpdInit(routes, &opts); @@ -56,3 +67,13 @@ int main() return 0; } + +int httpdPlatEspfsRead(void *dest, uint32_t offset, size_t len) +{ + if (offset + len > espfs_image_len) { + return -1; + } + + memcpy(dest, &espfs_image[offset], len); + return 0; +} diff --git a/demo/staticfiles/index.html b/demo/staticfiles/index.html new file mode 100644 index 0000000..a297230 --- /dev/null +++ b/demo/staticfiles/index.html @@ -0,0 +1,10 @@ + + + + + SpriteHTTPD demo + + + + + diff --git a/demo/staticfiles/kocour.jpg b/demo/staticfiles/kocour.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c5c20a5ee356ab8e9bb26bba3d33ca85f792dee GIT binary patch literal 119057 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

}wX9q_?7Cz3wAkl(>f#UP8mcPcGSRxHBYjS(5n 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 F|JlBhFw+14 literal 0 HcmV?d00001 diff --git a/espfsbuilder/Makefile b/espfsbuilder/Makefile index eafa4c6..e1790df 100644 --- a/espfsbuilder/Makefile +++ b/espfsbuilder/Makefile @@ -1,7 +1,14 @@ TARGET=mkespfsimage -SOURCES = main.c ../lib/heatshrink/heatshrink_encoder.c ../lib/heatshrink/heatshrink_decoder.c ../lib/espfs/espfs.c -CFLAGS = -I. -I../lib/heatshrink/ -I../lib/espfs/ +SOURCES = main.c parsing.c \ + ../spritehttpd/lib/heatshrink/heatshrink_encoder.c \ + ../spritehttpd/lib/heatshrink/heatshrink_decoder.c \ + ../spritehttpd/lib/espfs/espfs.c + +CFLAGS = -I. \ + -I../spritehttpd/lib/heatshrink/ \ + -I../spritehttpd/lib/espfs/ \ + -DZLIB_CONST all: $(TARGET) diff --git a/espfsbuilder/README.md b/espfsbuilder/README.md new file mode 100644 index 0000000..3d91ca5 --- /dev/null +++ b/espfsbuilder/README.md @@ -0,0 +1,7 @@ +This is a command-line utility that builds the binary espfs image. +The tool can also parse the espfs image file for verification. + +It uses heatshrink files & the config header from the main project. + +The binary can be embedded in the fileserver project e.g. using `xxd -i` to convert it to a C source file +that can be `#include`'d. diff --git a/espfsbuilder/main.c b/espfsbuilder/main.c index 07269db..d42592c 100644 --- a/espfsbuilder/main.c +++ b/espfsbuilder/main.c @@ -11,12 +11,10 @@ #include "espfsformat.h" #include "heatshrink_encoder.h" -#include "espfs.h" +#include "parsing.h" #define DEFAULT_GZIP_EXTS "html,css,js,svg,png,jpg,gif" -// static variables -static int s_outFd = 1; struct InputFileLinkedListEntry; struct InputFileLinkedListEntry { @@ -24,10 +22,16 @@ struct InputFileLinkedListEntry { struct InputFileLinkedListEntry *next; }; +/// two ends of a linked list with input files static struct InputFileLinkedListEntry *s_inputFiles = NULL; static struct InputFileLinkedListEntry *s_lastInputFile = NULL; +/// Output file FD +static int s_outFd = 1; + +/// Array of gzipped extensions, ends with a NULL pointer static char **s_gzipExtensions = NULL; +/// Gzip all files static bool s_gzipAll = false; // impls to satisfy defs in the config header @@ -41,9 +45,19 @@ void httpdPlatFree(void *ptr) free(ptr); } -size_t compressHeatshrink(uint8_t *in, size_t insize, uint8_t *out, size_t outcap, int level) +/** + * Compress a file using Heatshrink + * + * @param[in] in - pointer to the uncompressed input + * @param insize - len of the uncompressed input + * @param[out] out - destination buffer for the compressed data + * @param outcap - capacity of the output buffer + * @param level - compression level, 1-9; -1 for default. + * @return actual length of the compressed data + */ +size_t compressHeatshrink(const uint8_t *in, size_t insize, uint8_t *out, size_t outcap, int level) { - uint8_t *inp = in; + const uint8_t *inp = in; uint8_t *outp = out; size_t len; int ws[] = {5, 6, 8, 11, 13}; @@ -82,7 +96,7 @@ size_t compressHeatshrink(uint8_t *in, size_t insize, uint8_t *out, size_t outca } while (insize != 0); if (insize != 0) { - fprintf(stderr, "Heatshrink: Bug? insize is still %d. sres=%d pres=%d\n", (int)insize, sres, pres); + fprintf(stderr, "Heatshrink: Bug? insize is still %d. sres=%d pres=%d\n", (int) insize, sres, pres); exit(1); } @@ -90,7 +104,17 @@ size_t compressHeatshrink(uint8_t *in, size_t insize, uint8_t *out, size_t outca return r; } -size_t compressGzip(uint8_t *in, size_t insize, uint8_t *out, size_t outsize, int level) +/** + * Compress a file using Gzip + * + * @param[in] in - pointer to the uncompressed input + * @param insize - len of the uncompressed input + * @param[out] out - destination buffer for the compressed data + * @param outcap - capacity of the output buffer + * @param level - compression level, 1-9; -1 for default. + * @return actual length of the compressed data + */ +size_t compressGzip(const uint8_t *in, size_t insize, uint8_t *out, size_t outcap, int level) { z_stream stream; int zresult; @@ -101,7 +125,7 @@ size_t compressGzip(uint8_t *in, size_t insize, uint8_t *out, size_t outsize, in stream.next_in = in; stream.avail_in = insize; stream.next_out = out; - stream.avail_out = outsize; + stream.avail_out = outcap; // 31 -> 15 window bits + 16 for gzip zresult = deflateInit2(&stream, level, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY); if (zresult != Z_OK) { @@ -124,6 +148,12 @@ size_t compressGzip(uint8_t *in, size_t insize, uint8_t *out, size_t outsize, in return stream.total_out; } +/** + * Check if a file name should be compressed by gzip + * + * @param name - file name + * @return true if should compress + */ bool shouldCompressGzip(const char *name) { if (!s_gzipExtensions) { return false; } @@ -150,7 +180,13 @@ bool shouldCompressGzip(const char *name) return false; } -int parseGzipExtensions(char *input) +/** + * Parse a list of gzipped extensions + * + * @param input - list of comma-separated extensions, e.g. "jpg,png" + * @return + */ +void parseGzipExtensions(char *input) { char *token; char *extList = input; @@ -173,19 +209,17 @@ int parseGzipExtensions(char *input) } // terminate list s_gzipExtensions[count] = NULL; - - return 1; } /** * Process a file. * * @param fd - filedes - * @param name - filename to embed in the archive + * @param[in] name - filename to embed in the archive * @param compression_mode - compression mode * @param level - compression level for heatshrink, 1-9 * @param[out] compName - the used compression is output here (for debug print) - * @return + * @return - size of the output, in percent (100% = no compression) */ int handleFile(int fd, const char *name, int compression_mode, int level, const char **compName) { @@ -282,11 +316,13 @@ int handleFile(int fd, const char *name, int compression_mode, int level, const return size ? (int) ((csize * 100) / size) : 100; } -//Write final dummy header with FLAG_LASTFILE set. +/** + * Write final dummy header with FLAG_LASTFILE set. + */ void finishArchive() { EspFsHeader h; - h.magic = htole32(ESPFS_MAGIC); // ('E' << 0) + ('S' << 8) + ('f' << 16) + ('s' << 24); + h.magic = htole32(ESPFS_MAGIC); h.flags = FLAG_LASTFILE; h.compression = COMPRESS_NONE; h.nameLen = 0; @@ -295,62 +331,13 @@ void finishArchive() write(s_outFd, &h, sizeof(EspFsHeader)); } -static size_t espfs_parse_filesize = -1; -static int espfs_parse_fd = -1; - -void parseEspfsFileAndShowItsContents(const char *filename) -{ - int rv; - fprintf(stderr, "Parsing: %s\n", filename); - - FILE *f = fopen(filename, "r"); - if (!f) { - perror(filename); - exit(1); - } - int fd = fileno(f); - - espfs_parse_filesize = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - - espfs_parse_fd = fd; - - rv = espFsInit(); - if (rv != 0) { - fprintf(stderr, "Fail to init FS\n"); - exit(1); - } - - EspFsWalk walk; - espFsWalkInit(&walk); - - EspFsHeader header; - uint32_t offset; - char namebuf[1024]; - - while (espFsWalkNext(&walk, &header, namebuf, 1024, &offset)) { - fprintf(stderr, "at %04x: \"%s\", flags: %02x, comp: %s, compLen: %d, plainLen: %d\n", offset, namebuf, header.flags, - header.compression == 1 ? "HS" : "None", header.fileLenComp, header.fileLenDecomp); - } - - fclose(f); -} - - -int httpdPlatEspfsRead(void *dest, uint32_t offset, size_t len) -{ - fprintf(stderr, "FS read @ %d, len %d\n", offset, len); - if (offset + len > espfs_parse_filesize) { - fprintf(stderr, "Read out fo range!\n"); - return -1; - } - lseek(espfs_parse_fd, offset, SEEK_SET); - read(espfs_parse_fd, dest, len); - return 0; -} - - -void queueInputFile(char *name) +/** + * Queue a file for adding to the archive. + * Appends it to the `s_inputFiles` linked list. + * + * @param name - file name to add + */ +void queueInputFile(const char *name) { fprintf(stderr, "INFILE: %s\n", name); @@ -385,20 +372,22 @@ int main(int argc, char **argv) int c; char *outfile = NULL; char *parseFile = NULL; + char *stripPath = NULL; while (1) { int option_index = 0; static struct option long_options[] = { - {"parse", required_argument, 0, 'p'}, - {"compress", required_argument, 0, 'c'}, - {"gzip", no_argument, 0, 'z'}, - {"gzip-all", no_argument, 0, 'G'}, - {"level", required_argument, 0, 'l'}, - {"gzip-exts", required_argument, 0, 'g'}, - {"input", required_argument, 0, 'i'}, - {"output", required_argument, 0, 'o'}, - {"help", no_argument, 0, 'h'}, - {0, 0, 0, 0} + {"parse", required_argument, 0, 'p'}, + {"compress", required_argument, 0, 'c'}, + {"gzip", no_argument, 0, 'z'}, + {"gzip-all", no_argument, 0, 'G'}, + {"level", required_argument, 0, 'l'}, + {"gzip-exts", required_argument, 0, 'g'}, + {"input", required_argument, 0, 'i'}, + {"output", required_argument, 0, 'o'}, + {"strip-path", required_argument, 0, 'S'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} }; c = getopt_long(argc, argv, "c:l:g:zGhp:i:o:0123456789", @@ -423,6 +412,10 @@ int main(int argc, char **argv) parseFile = strdup(optarg); break; + case 'S': + stripPath = strdup(optarg); + break; + case 'c': compType = atoi(optarg); break; @@ -434,11 +427,7 @@ int main(int argc, char **argv) case 'g': use_gzip = true; - if (!parseGzipExtensions(optarg)) { - fprintf(stderr, "Bad gzip extension list: %s\n", optarg); - err = 1; - goto show_help; - } + parseGzipExtensions(optarg); break; case 'l': @@ -473,7 +462,6 @@ int main(int argc, char **argv) exit(0); } - if (s_gzipExtensions == NULL && use_gzip) { parseGzipExtensions(strdup(DEFAULT_GZIP_EXTS)); } @@ -514,14 +502,24 @@ int main(int argc, char **argv) serr = stat(name, &statBuf); if ((serr == 0) && S_ISREG(statBuf.st_mode)) { //Strip off './' or '/' madness. - realName = name; - if (name[0] == '.' && name[1] == '/') { realName += 2; } - if (realName[0] == '/') { realName++; } + char *embeddedName = name; f = open(name, O_RDONLY); + + // relative path starting with ./, remove that + if (embeddedName[0] == '.' && embeddedName[1] == '/') { + embeddedName += 2; + } + // remove prefix + if (stripPath && 0 == strncmp(embeddedName, stripPath, strlen(stripPath))) { + embeddedName += strlen(stripPath); + } + // remove leading slash, if any + if (embeddedName[0] == '/') { embeddedName++; } + if (f > 0) { const char *compName = "unknown"; - rate = handleFile(f, realName, compType, compLvl, &compName); - fprintf(stderr, "%s (%d%%, %s)\n", realName, rate, compName); + rate = handleFile(f, embeddedName, compType, compLvl, &compName); + fprintf(stderr, "%s (%d%%, %s)\n", embeddedName, rate, compName); close(f); } else { perror(name); @@ -550,7 +548,7 @@ int main(int argc, char **argv) fprintf(stderr, "[-c|--compress COMPRESSOR]\n 0 - None, 1 - Heatshrink (default)\n"); fprintf(stderr, "[-l|--level LEVEL] or [-0 through -9]\n compression level 1-9, higher is better but uses more RAM\n"); fprintf(stderr, "[-z|--gzip]\n use gzip for files with extensions matching "DEFAULT_GZIP_EXTS"\n"); - fprintf(stderr, "[-Z|--gzip-all]\n use gzip for all files\n"); + fprintf(stderr, "[-G|--gzip-all]\n use gzip for all files\n"); fprintf(stderr, "[-g|--gzip-exts GZIPPED_EXTENSIONS]\n use gzip for files with custom extensions, comma-separated\n"); fprintf(stderr, "[-i|--input FILE]\n Input file, can be multiple. Files can also be passed at the end without -i, or as lines on stdin if not specified by args\n"); fprintf(stderr, "[-o|--output FILE]\n Output file name; if not specified, outputs to stdout\n"); diff --git a/espfsbuilder/parsing.c b/espfsbuilder/parsing.c new file mode 100644 index 0000000..c7f236e --- /dev/null +++ b/espfsbuilder/parsing.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +#include "parsing.h" +#include "espfs.h" + +static size_t espfs_parse_filesize = -1; +static int espfs_parse_fd = -1; + +/** + * Parse an image file and show the files contained. + * This is a simple sanity test. + * + * @param[in] filename - image file to parse + */ +void parseEspfsFileAndShowItsContents(const char *filename) +{ + int rv; + fprintf(stderr, "Parsing: %s\n", filename); + + FILE *f = fopen(filename, "r"); + if (!f) { + perror(filename); + exit(1); + } + int fd = fileno(f); + + espfs_parse_filesize = lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_SET); + + espfs_parse_fd = fd; + + rv = espFsInit(); + if (rv != 0) { + fprintf(stderr, "Fail to init FS\n"); + exit(1); + } + + EspFsWalk walk; + espFsWalkInit(&walk); + + EspFsHeader header; + uint32_t offset; + char namebuf[1024]; + + while (espFsWalkNext(&walk, &header, namebuf, 1024, &offset)) { + fprintf(stderr, "at %04x: \"%s\", flags: %02x, comp: %s, compLen: %d, plainLen: %d\n", offset, namebuf, header.flags, + header.compression == 1 ? "HS" : "None", header.fileLenComp, header.fileLenDecomp); + } + + fclose(f); +} + + +int httpdPlatEspfsRead(void *dest, uint32_t offset, size_t len) +{ + // fprintf(stderr, "FS read @ %d, len %d\n", offset, (int) len); + if (offset + len > espfs_parse_filesize) { + // fprintf(stderr, "Read out fo range!\n"); + return -1; + } + lseek(espfs_parse_fd, offset, SEEK_SET); + read(espfs_parse_fd, dest, len); + return 0; +} diff --git a/espfsbuilder/parsing.h b/espfsbuilder/parsing.h new file mode 100644 index 0000000..5b56a61 --- /dev/null +++ b/espfsbuilder/parsing.h @@ -0,0 +1,7 @@ +/** + * The espfs archive parsing part of mkespfsimage + */ + +#pragma once + +void parseEspfsFileAndShowItsContents(const char *filename); diff --git a/spritehttpd/.gitignore b/spritehttpd/.gitignore new file mode 100644 index 0000000..97c272b --- /dev/null +++ b/spritehttpd/.gitignore @@ -0,0 +1,5 @@ +mkespfsimage +*.o +.idea/ +*.bin +*.a diff --git a/spritehttpd/Makefile b/spritehttpd/Makefile new file mode 100644 index 0000000..cc1dac0 --- /dev/null +++ b/spritehttpd/Makefile @@ -0,0 +1,51 @@ +# If building for posix: +ifeq ($(PLATFORM),arm-freertos) + CC ?= arm-none-eabi-gcc + AR ?= arm-none-eabi-ar + PORT_SOURCES = src/port/httpd-freertos.c +else + # Probably posix + CC ?= cc + AR ?= ar + PORT_SOURCES = src/port/httpd-posix.c +endif + +# additional C flags can be specified via the CFLAGS variable + + +LIB_FILE = libspritehttpd.a + +LIB_SOURCES = ${PORT_SOURCES} \ + lib/espfs/espfs.c \ + lib/heatshrink/heatshrink_decoder.c \ + src/utils/base64.c \ + src/utils/sha1.c \ + src/httpdespfs.c \ + src/httpd.c \ + src/httpd-loop.c \ + src/cgiwebsocket.c + +LIB_OBJS = ${LIB_SOURCES:.c=.o} + +LIB_INCLUDES = -Iinclude -Ilib/heatshrink -Ilib/espfs + +# TODO check what these mean +LIB_CFLAGS = -fPIC -Wall -Wextra -c + +OBJ_DIR=./obj + +OUT_DIR=. + +all: $(LIB_FILE) + +%.o: %.c + $(CC) -c $(LIB_INCLUDES) $(CFLAGS) $(LIB_CFLAGS) -o $@ $< + +$(LIB_FILE): ${LIB_OBJS} + $(AR) rcs $@ $^ + +clean: + find . -type f -name '*.o' -delete + find . -type f -name '*.d' -delete + find . -type f -name '*.a' -delete + find . -type f -name '*.elf' -delete diff --git a/lib/include/auth.h b/spritehttpd/include/auth.h similarity index 100% rename from lib/include/auth.h rename to spritehttpd/include/auth.h diff --git a/lib/include/cgiwebsocket.h b/spritehttpd/include/cgiwebsocket.h similarity index 100% rename from lib/include/cgiwebsocket.h rename to spritehttpd/include/cgiwebsocket.h diff --git a/lib/include/httpd-platform.h b/spritehttpd/include/httpd-platform.h similarity index 100% rename from lib/include/httpd-platform.h rename to spritehttpd/include/httpd-platform.h diff --git a/lib/include/httpd-utils.h b/spritehttpd/include/httpd-utils.h similarity index 100% rename from lib/include/httpd-utils.h rename to spritehttpd/include/httpd-utils.h diff --git a/lib/include/httpd.h b/spritehttpd/include/httpd.h similarity index 100% rename from lib/include/httpd.h rename to spritehttpd/include/httpd.h diff --git a/lib/include/httpdespfs.h b/spritehttpd/include/httpdespfs.h similarity index 100% rename from lib/include/httpdespfs.h rename to spritehttpd/include/httpdespfs.h diff --git a/lib/include/logging.h b/spritehttpd/include/logging.h similarity index 100% rename from lib/include/logging.h rename to spritehttpd/include/logging.h diff --git a/lib/espfs/espfs.c b/spritehttpd/lib/espfs/espfs.c similarity index 96% rename from lib/espfs/espfs.c rename to spritehttpd/lib/espfs/espfs.c index 60f9157..c890166 100644 --- a/lib/espfs/espfs.c +++ b/spritehttpd/lib/espfs/espfs.c @@ -17,6 +17,7 @@ It's written for use with httpd, but doesn't need to be used as such. #include #include #include +#include #include "espfsformat.h" #include "espfs.h" @@ -202,6 +203,12 @@ EspFsFile *espFsOpen(const char *fileName) return NULL; } + // Indians + h.magic = le32toh(h.magic); + h.nameLen = le16toh(h.nameLen); + h.fileLenComp = le32toh(h.fileLenComp); + h.fileLenDecomp = le32toh(h.fileLenDecomp); + if (h.magic != ESPFS_MAGIC) { espfs_error("[EspFS] Magic mismatch. EspFS image broken."); return NULL; @@ -220,6 +227,8 @@ EspFsFile *espFsOpen(const char *fileName) namebuf[h.nameLen] = 0; // ensure it's terminated if (strcmp(namebuf, fileName) == 0) { + espfs_dbg("[EspFS] Found matching file: name %s, len %d", namebuf, h.fileLenDecomp); + //Yay, this is the file we need! return espFsOpenFromHeader(&h, hpos); } diff --git a/lib/espfs/espfs.h b/spritehttpd/lib/espfs/espfs.h similarity index 98% rename from lib/espfs/espfs.h rename to spritehttpd/lib/espfs/espfs.h index 27ada64..e2b5e1e 100644 --- a/lib/espfs/espfs.h +++ b/spritehttpd/lib/espfs/espfs.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "espfsformat.h" typedef enum { diff --git a/lib/espfs/espfsformat.h b/spritehttpd/lib/espfs/espfsformat.h similarity index 83% rename from lib/espfs/espfsformat.h rename to spritehttpd/lib/espfs/espfsformat.h index a3cc0a2..739867c 100644 --- a/lib/espfs/espfsformat.h +++ b/spritehttpd/lib/espfs/espfsformat.h @@ -12,7 +12,7 @@ with the FLAG_LASTFILE flag set. #define FLAG_GZIP (1<<1) #define COMPRESS_NONE 0 #define COMPRESS_HEATSHRINK 1 -#define ESPFS_MAGIC 0x73665345 /* ASCII ESfs - when read as little endian */ +#define ESPFS_MAGIC 0x73665345 /* ASCII sequence of bytes 'E' 'S' 'f' 's' interpreted as as little endian uint32_t */ /* 16 bytes long for alignment */ typedef struct { diff --git a/lib/heatshrink/heatshrink_common.h b/spritehttpd/lib/heatshrink/heatshrink_common.h similarity index 100% rename from lib/heatshrink/heatshrink_common.h rename to spritehttpd/lib/heatshrink/heatshrink_common.h diff --git a/lib/heatshrink/heatshrink_config.h b/spritehttpd/lib/heatshrink/heatshrink_config.h similarity index 100% rename from lib/heatshrink/heatshrink_config.h rename to spritehttpd/lib/heatshrink/heatshrink_config.h diff --git a/lib/heatshrink/heatshrink_decoder.c b/spritehttpd/lib/heatshrink/heatshrink_decoder.c similarity index 100% rename from lib/heatshrink/heatshrink_decoder.c rename to spritehttpd/lib/heatshrink/heatshrink_decoder.c diff --git a/lib/heatshrink/heatshrink_decoder.h b/spritehttpd/lib/heatshrink/heatshrink_decoder.h similarity index 100% rename from lib/heatshrink/heatshrink_decoder.h rename to spritehttpd/lib/heatshrink/heatshrink_decoder.h diff --git a/lib/heatshrink/heatshrink_encoder.c b/spritehttpd/lib/heatshrink/heatshrink_encoder.c similarity index 99% rename from lib/heatshrink/heatshrink_encoder.c rename to spritehttpd/lib/heatshrink/heatshrink_encoder.c index 21b52e7..1079b23 100644 --- a/lib/heatshrink/heatshrink_encoder.c +++ b/spritehttpd/lib/heatshrink/heatshrink_encoder.c @@ -75,7 +75,7 @@ heatshrink_encoder *heatshrink_encoder_alloc(uint8_t window_sz2, (lookahead_sz2 >= window_sz2)) { return NULL; } - + /* Note: 2 * the window size is used because the buffer needs to fit * (1 << window_sz2) bytes for the current input, and an additional * (1 << window_sz2) bytes for the previous buffer of input, which @@ -135,7 +135,7 @@ void heatshrink_encoder_reset(heatshrink_encoder *hse) { } HSE_sink_res heatshrink_encoder_sink(heatshrink_encoder *hse, - uint8_t *in_buf, size_t size, size_t *input_size) { + const uint8_t *in_buf, size_t size, size_t *input_size) { if ((hse == NULL) || (in_buf == NULL) || (input_size == NULL)) { return HSER_SINK_ERROR_NULL; } @@ -284,11 +284,11 @@ static HSE_state st_step_search(heatshrink_encoder *hse) { if (hse->input_size - msi < lookahead_sz) { max_possible = hse->input_size - msi; } - + uint16_t match_length = 0; uint16_t match_pos = find_longest_match(hse, start, end, max_possible, &match_length); - + if (match_pos == MATCH_NOT_FOUND) { LOG("ss Match not found\n"); hse->match_scan_index++; @@ -407,7 +407,7 @@ static void do_indexing(heatshrink_encoder *hse) { #if HEATSHRINK_USE_INDEX /* Build an index array I that contains flattened linked lists * for the previous instances of every byte in the buffer. - * + * * For example, if buf[200] == 'x', then index[200] will either * be an offset i such that buf[i] == 'x', or a negative offset * to indicate end-of-list. This significantly speeds up matching, @@ -416,7 +416,7 @@ static void do_indexing(heatshrink_encoder *hse) { * Future optimization options: * 1. Since any negative value represents end-of-list, the other * 15 bits could be used to improve the index dynamically. - * + * * 2. Likewise, the last lookahead_sz bytes of the index will * not be usable, so temporary data could be stored there to * dynamically improve the index. @@ -489,7 +489,7 @@ static uint16_t find_longest_match(heatshrink_encoder *hse, uint16_t start, } pos = hsi->index[pos]; } -#else +#else for (int16_t pos=end - 1; pos - (int16_t)start >= 0; pos--) { uint8_t * const pospoint = &buf[pos]; if ((pospoint[match_maxlen] == needlepoint[match_maxlen]) @@ -509,7 +509,7 @@ static uint16_t find_longest_match(heatshrink_encoder *hse, uint16_t start, } } #endif - + const size_t break_even_point = (1 + HEATSHRINK_ENCODER_WINDOW_BITS(hse) + HEATSHRINK_ENCODER_LOOKAHEAD_BITS(hse)); @@ -588,9 +588,9 @@ static void push_literal_byte(heatshrink_encoder *hse, output_info *oi) { static void save_backlog(heatshrink_encoder *hse) { size_t input_buf_sz = get_input_buffer_size(hse); - + uint16_t msi = hse->match_scan_index; - + /* Copy processed data to beginning of buffer, so it can be * used for future matches. Don't bother checking whether the * input is less than the maximum size, because if it isn't, @@ -601,7 +601,7 @@ static void save_backlog(heatshrink_encoder *hse) { memmove(&hse->buffer[0], &hse->buffer[input_buf_sz - rem], shift_sz); - + hse->match_scan_index = 0; hse->input_size -= (uint16_t)input_buf_sz - rem; } diff --git a/lib/heatshrink/heatshrink_encoder.h b/spritehttpd/lib/heatshrink/heatshrink_encoder.h similarity index 98% rename from lib/heatshrink/heatshrink_encoder.h rename to spritehttpd/lib/heatshrink/heatshrink_encoder.h index 1d9bb4f..f8e96e9 100644 --- a/lib/heatshrink/heatshrink_encoder.h +++ b/spritehttpd/lib/heatshrink/heatshrink_encoder.h @@ -93,7 +93,7 @@ void heatshrink_encoder_reset(heatshrink_encoder *hse); * INPUT_SIZE is set to the number of bytes actually sunk (in case a * buffer was filled.). */ HSE_sink_res heatshrink_encoder_sink(heatshrink_encoder *hse, - uint8_t *in_buf, size_t size, size_t *input_size); + const uint8_t *in_buf, size_t size, size_t *input_size); /* Poll for output from the encoder, copying at most OUT_BUF_SIZE bytes into * OUT_BUF (setting *OUTPUT_SIZE to the actual amount copied). */ diff --git a/lib/src/cgiwebsocket.c b/spritehttpd/src/cgiwebsocket.c similarity index 100% rename from lib/src/cgiwebsocket.c rename to spritehttpd/src/cgiwebsocket.c diff --git a/lib/src/httpd-loop.c b/spritehttpd/src/httpd-loop.c similarity index 95% rename from lib/src/httpd-loop.c rename to spritehttpd/src/httpd-loop.c index 857846d..e6739ad 100644 --- a/lib/src/httpd-loop.c +++ b/spritehttpd/src/httpd-loop.c @@ -12,6 +12,8 @@ Thanks to my collague at Espressif for writing the foundations of this code. #include #include #include +#include +#include #include "logging.h" static int httpPort; @@ -27,9 +29,17 @@ struct HttpdConnType { static HttpdConnType s_rconn[HTTPD_MAX_CONNECTIONS]; +static int fd_is_valid(int fd) +{ + return fcntl(fd, F_GETFD) != -1 || errno != EBADF; +} + int httpdConnSendData(ConnTypePtr conn, char *buff, int len) { conn->needWriteDoneNotif = 1; + if (!fd_is_valid(conn->fd)) { + return -1; + } return (write(conn->fd, buff, len) >= 0); } @@ -83,6 +93,12 @@ void platHttpServerTask(void *pvParameters) } } while (listenfd == -1); + /* https://stackoverflow.com/questions/5592747/bind-error-while-recreating-socket */ + int yes=1; + if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) { + perror("setsockopt"); + } + /* Bind to the local port */ do { ret = bind(listenfd, (struct sockaddr *) &server_addr, sizeof(server_addr)); diff --git a/lib/src/httpd.c b/spritehttpd/src/httpd.c similarity index 100% rename from lib/src/httpd.c rename to spritehttpd/src/httpd.c diff --git a/lib/src/httpdespfs.c b/spritehttpd/src/httpdespfs.c similarity index 99% rename from lib/src/httpdespfs.c rename to spritehttpd/src/httpdespfs.c index 5582b8b..65de77f 100644 --- a/lib/src/httpdespfs.c +++ b/spritehttpd/src/httpdespfs.c @@ -146,7 +146,10 @@ serveStaticFile(HttpdConnData *connData, const char *filepath) } len = espFsRead(file, buff, FILE_CHUNK_LEN); - if (len > 0) { httpdSend(connData, buff, len); } + if (len > 0) { + espfs_dbg("[EspFS] Read file chunk: %d bytes", len); + httpdSend(connData, buff, len); + } if (len != FILE_CHUNK_LEN) { //We're done. espFsClose(file); diff --git a/lib/src/port/httpd-freertos.c b/spritehttpd/src/port/httpd-freertos.c similarity index 100% rename from lib/src/port/httpd-freertos.c rename to spritehttpd/src/port/httpd-freertos.c diff --git a/lib/src/port/httpd-posix.c b/spritehttpd/src/port/httpd-posix.c similarity index 100% rename from lib/src/port/httpd-posix.c rename to spritehttpd/src/port/httpd-posix.c diff --git a/lib/src/utils/base64.c b/spritehttpd/src/utils/base64.c similarity index 100% rename from lib/src/utils/base64.c rename to spritehttpd/src/utils/base64.c diff --git a/lib/src/utils/base64.h b/spritehttpd/src/utils/base64.h similarity index 100% rename from lib/src/utils/base64.h rename to spritehttpd/src/utils/base64.h diff --git a/lib/src/utils/sha1.c b/spritehttpd/src/utils/sha1.c similarity index 100% rename from lib/src/utils/sha1.c rename to spritehttpd/src/utils/sha1.c diff --git a/lib/src/utils/sha1.h b/spritehttpd/src/utils/sha1.h similarity index 100% rename from lib/src/utils/sha1.h rename to spritehttpd/src/utils/sha1.h diff --git a/lib/todo/esphttpclient/LICENSE b/spritehttpd/todo/esphttpclient/LICENSE similarity index 100% rename from lib/todo/esphttpclient/LICENSE rename to spritehttpd/todo/esphttpclient/LICENSE diff --git a/lib/todo/esphttpclient/README.md b/spritehttpd/todo/esphttpclient/README.md similarity index 100% rename from lib/todo/esphttpclient/README.md rename to spritehttpd/todo/esphttpclient/README.md diff --git a/lib/todo/esphttpclient/httpclient.c b/spritehttpd/todo/esphttpclient/httpclient.c similarity index 100% rename from lib/todo/esphttpclient/httpclient.c rename to spritehttpd/todo/esphttpclient/httpclient.c diff --git a/lib/todo/httpclient.h b/spritehttpd/todo/httpclient.h similarity index 100% rename from lib/todo/httpclient.h rename to spritehttpd/todo/httpclient.h diff --git a/lib/todo/uptime.c b/spritehttpd/todo/uptime.c similarity index 100% rename from lib/todo/uptime.c rename to spritehttpd/todo/uptime.c diff --git a/lib/todo/uptime.h b/spritehttpd/todo/uptime.h similarity index 100% rename from lib/todo/uptime.h rename to spritehttpd/todo/uptime.h diff --git a/lib/todo/webpages-espfs.h b/spritehttpd/todo/webpages-espfs.h similarity index 100% rename from lib/todo/webpages-espfs.h rename to spritehttpd/todo/webpages-espfs.h diff --git a/lib/todo/webpages.espfs.ld b/spritehttpd/todo/webpages.espfs.ld similarity index 100% rename from lib/todo/webpages.espfs.ld rename to spritehttpd/todo/webpages.espfs.ld