about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-01-06 19:18:20 -0500
committerJune McEnroe <june@causal.agency>2019-01-06 19:18:20 -0500
commita3d7c647149dfbd694d43badef5cc704326dc45b (patch)
treee47d49b6e6466d1efda2a1f45172a33f5fd6fe19
parentInstall html files (diff)
downloadtorus-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.c13
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);
 	}
 }