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