about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-01-06 19:40:04 -0500
committerJune McEnroe <june@causal.agency>2019-01-06 19:40:04 -0500
commit7654154a6a023407adb4af05b906f90226625ad2 (patch)
tree091e0275289283fbcd6cc190425335aaed47ef45
parentHandle KCGI_HUP (diff)
downloadtorus-7654154a6a023407adb4af05b906f90226625ad2.tar.gz
torus-7654154a6a023407adb4af05b906f90226625ad2.zip
Swallow writes after the connection is closed
It was not okay.
-rw-r--r--image.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/image.c b/image.c
index 7934396..2cfc340 100644
--- a/image.c
+++ b/image.c
@@ -174,11 +174,20 @@ static noreturn void errkcgi(int eval, enum kcgi_err code, const char *str) {
 	errx(eval, "%s: %s", str, kcgi_strerror(code));
 }
 
+struct Stream {
+	struct kreq *req;
+	bool hup;
+};
+
+// XXX: Swallow writes after the connection is closed.
 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");
+	struct Stream *stream = cookie;
+	if (stream->hup) return len;
+	enum kcgi_err error = khttp_write(stream->req, buf, (size_t)len);
+	if (error) {
+		if (error != KCGI_HUP) errkcgi(EX_IOERR, error, "khttp_write");
+		stream->hup = true;
+	}
 	return len;
 }
 
@@ -219,7 +228,8 @@ static void worker(void) {
 		if (error == KCGI_HUP) goto next;
 		if (error) errkcgi(EX_IOERR, error, "khttp_body");
 
-		FILE *stream = fwopen(&req, streamWrite);
+		struct Stream cookie = { .req = &req };
+		FILE *stream = fwopen(&cookie, streamWrite);
 		if (!stream) err(EX_OSERR, "fwopen");
 
 		render(stream, tileX, tileY);
ode for the umpteenth timeJune McEnroe It's actually in a good state now, I think. 2019-02-21Replace "view" with "window"June McEnroe I think originally I didn't want to use the same word as curses WINDOW but it's really much clearer for the user if they're just called windows. UI code probably needs yet another rewrite though. Still feels messy. 2019-02-21Remove ROT13June McEnroe It's just not convenient when it can only do the whole line... 2019-02-21Clean up man pageJune McEnroe 2019-01-26Draw UI before connectingJune McEnroe Otherwise the "Traveling" message isn't visible while connecting. 2019-01-25Avoid unused variable warnings with getyxJune McEnroe 2019-01-25Add GNU/Linux build instructionsJune McEnroe