From 7ee3bbc86bd6ca20fafe5c2c1f70adf3116334c9 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch 
Date: Tue, 23 Sep 2014 19:52:05 +0200
Subject: Fix on_unit_ready()
Got it wrong and lighttpd doesn't have any mercy.
---
 ponymap.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/ponymap.c b/ponymap.c
index bfb75c5..e14ac16 100644
--- a/ponymap.c
+++ b/ponymap.c
@@ -565,12 +565,15 @@ unit_update_poller (struct unit *u, const struct pollfd *pfd)
 static void
 on_unit_ready (const struct pollfd *pfd, struct unit *u)
 {
-	struct transport *transport = u->transport;
 	struct service *service = u->service;
+	struct transport *transport = u->transport;
 	enum transport_io_result result;
+	bool got_eof = false;
+
+	if ((result = transport->on_readable (u)) == TRANSPORT_IO_ERROR)
+		goto error;
+	got_eof |= result == TRANSPORT_IO_EOF;
 
-	if ((result = transport->on_readable (u)))
-		goto exception;
 	if (u->read_buffer.len)
 	{
 		struct str *buf = &u->read_buffer;
@@ -581,23 +584,24 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u)
 			goto abort;
 	}
 
-	if ((result = transport->on_writeable (u)))
-		goto exception;
+	if ((result = transport->on_writeable (u)) == TRANSPORT_IO_ERROR)
+		goto error;
+	got_eof |= result == TRANSPORT_IO_EOF;
 
-	unit_update_poller (u, pfd);
-	return;
-
-exception:
-	if (result == TRANSPORT_IO_EOF)
+	if (got_eof)
 	{
 		if (service->on_eof)
 			service->on_eof (u->service_data, u);
+		if (u->abortion_requested || !u->write_buffer.len)
+			goto abort;
 	}
-	else if (result == TRANSPORT_IO_ERROR)
-	{
-		if (service->on_error)
-			service->on_error (u->service_data, u);
-	}
+
+	unit_update_poller (u, pfd);
+	return;
+
+error:
+	if (service->on_error)
+		service->on_error (u->service_data, u);
 
 abort:
 	unit_abort (u);
-- 
cgit v1.2.3-70-g09d2