diff options
author | June McEnroe <june@causal.agency> | 2019-01-06 19:18:20 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-01-06 19:18:20 -0500 |
commit | a3d7c647149dfbd694d43badef5cc704326dc45b (patch) | |
tree | e47d49b6e6466d1efda2a1f45172a33f5fd6fe19 | |
parent | Install html files (diff) | |
download | torus-a3d7c647149dfbd694d43badef5cc704326dc45b.tar.gz torus-a3d7c647149dfbd694d43badef5cc704326dc45b.zip |
Handle KCGI_HUP
I hope it's okay that I keep writing to the fwopen stream after streamWrite returns -1.
-rw-r--r-- | image.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/image.c b/image.c index 004b203..9ef6b22 100644 --- a/image.c +++ b/image.c @@ -165,9 +165,9 @@ static const struct kvalid Keys[KeysLen] = { [KeyY] = { .name = "y", .valid = kvalid_int }, }; -enum { PageIndex, PagesLen }; +enum { PageTile, PagesLen }; static const char *Pages[PagesLen] = { - [PageIndex] = "index", + [PageTile] = "tile", }; static noreturn void errkcgi(int eval, enum kcgi_err code, const char *str) { @@ -177,6 +177,7 @@ static noreturn void errkcgi(int eval, enum kcgi_err code, const char *str) { static int streamWrite(void *cookie, const char *buf, int len) { struct kreq *req = cookie; enum kcgi_err error = khttp_write(req, buf, (size_t)len); + if (error == KCGI_HUP) return -1; if (error) errkcgi(EX_IOERR, error, "khttp_write"); return len; } @@ -184,7 +185,7 @@ static int streamWrite(void *cookie, const char *buf, int len) { static void worker(void) { struct kfcgi *fcgi; enum kcgi_err error = khttp_fcgi_init( - &fcgi, Keys, KeysLen, Pages, PagesLen, PageIndex + &fcgi, Keys, KeysLen, Pages, PagesLen, PageTile ); if (error) errkcgi(EX_CONFIG, error, "khttp_fcgi_init"); @@ -205,22 +206,26 @@ static void worker(void) { error = khttp_head( &req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200] ); + if (error == KCGI_HUP) goto next; if (error) errkcgi(EX_IOERR, error, "khttp_head"); error = khttp_head( &req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_IMAGE_PNG] ); + if (error == KCGI_HUP) goto next; if (error) errkcgi(EX_IOERR, error, "khttp_head"); error = khttp_body(&req); + if (error == KCGI_HUP) goto next; if (error) errkcgi(EX_IOERR, error, "khttp_body"); FILE *stream = fwopen(&req, streamWrite); if (!stream) err(EX_OSERR, "fwopen"); render(stream, tileX, tileY); - fclose(stream); + +next: khttp_free(&req); } } |