diff options
Diffstat (limited to 'tests/nt.c')
-rw-r--r-- | tests/nt.c | 62 |
1 files changed, 36 insertions, 26 deletions
@@ -109,2 +109,18 @@ net_writer (peer -> stdin_reader) same as stdout_writer +static inline int +peer_is_state (netcat_server_t *srv, int state) +{ + return srv->peer && (srv->peer->state & state); +} + +static void +netcat_stream_disconnect (netcat_server_t *srv, int mask) +{ + srv->disconnect (srv); + srv->state &= ~mask; + srv->pollfd->events &= ~mask; + if (srv->pollfd->events == 0) + srv->pollfd->fd = -1; +} + ssize_t @@ -113,3 +129,3 @@ netcat_stream_read (netcat_server_t *srv) ssize_t n; - + if (iobuf_avail_size (&srv->buf[IN])) @@ -119,2 +135,4 @@ netcat_stream_read (netcat_server_t *srv) { + if (errno == EINTR) + return 0; grecs_error (NULL, errno, "%s: read", srv->id); @@ -123,11 +141,13 @@ netcat_stream_read (netcat_server_t *srv) } - if (n == 0) + if (n == 0 || !peer_is_state (srv, POLLOUT)) { - /* No more input is expected */ - srv->disconnect (srv); - srv->state &= ~POLLIN; - srv->pollfd->events &= ~POLLIN; - if (srv->pollfd->events == 0) - srv->pollfd->fd = -1; + /* No more input is expected || needed */ + netcat_stream_disconnect (srv, POLLIN); + + if (srv->peer) + netcat_stream_disconnect (srv->peer, POLLOUT); + return 0; } + else + srv->peer->pollfd->events |= POLLOUT; } @@ -141,8 +161,2 @@ netcat_stream_read (netcat_server_t *srv) -static inline int -peer_is_state (netcat_server_t *srv, int state) -{ - return srv->peer && (srv->peer->state & state); -} - ssize_t @@ -157,7 +171,3 @@ netcat_stream_write (netcat_server_t *srv) // shutdown write end - srv->disconnect (srv); - srv->state &= ~POLLOUT; - srv->pollfd->events &= ~POLLOUT; - if (srv->pollfd->events == 0) - srv->pollfd->fd = -1; + netcat_stream_disconnect (srv, POLLOUT); return -1; @@ -167,2 +177,3 @@ netcat_stream_write (netcat_server_t *srv) srv->peer->pollfd->events |= POLLIN; + srv->pollfd->events &= ~POLLOUT; return 0; @@ -173,2 +184,4 @@ netcat_stream_write (netcat_server_t *srv) { + if (errno == EINTR) + return 0; grecs_error (NULL, errno, "%s: write", srv->id); @@ -255,5 +268,6 @@ netcat (char const *urlstr) int events; - + events = (srv->pollfd->events|POLLHUP) - & (srv->pollfd->revents & (srv->state|POLLHUP)); + & (srv->pollfd->revents + & (srv->state | ((srv->state & POLLOUT) ? POLLHUP : 0))); if (events) @@ -263,7 +277,3 @@ netcat (char const *urlstr) //grecs_error (NULL, 0, "HUP on %s", srv->id); - srv->disconnect (srv); - srv->pollfd->events &= ~srv->state; - if (srv->pollfd->events == 0) - srv->pollfd->fd = -1; - srv->state = 0; + netcat_stream_disconnect (srv, srv->state); } |