diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2014-09-23 19:52:05 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2014-09-23 20:41:47 +0200 |
commit | 7ee3bbc86bd6ca20fafe5c2c1f70adf3116334c9 (patch) | |
tree | af9c4c9e1c772024fd923178e78c638bf127c33a /ponymap.c | |
parent | 903f7d128a4a3fe66001e73a7e247b1d07444908 (diff) | |
download | ponymap-7ee3bbc86bd6ca20fafe5c2c1f70adf3116334c9.tar.gz ponymap-7ee3bbc86bd6ca20fafe5c2c1f70adf3116334c9.tar.xz ponymap-7ee3bbc86bd6ca20fafe5c2c1f70adf3116334c9.zip |
Fix on_unit_ready()
Got it wrong and lighttpd doesn't have any mercy.
Diffstat (limited to 'ponymap.c')
-rw-r--r-- | ponymap.c | 34 |
1 files changed, 19 insertions, 15 deletions
@@ -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); |