summaryrefslogtreecommitdiffabout
path: root/tests/nt.c
authorSergey Poznyakoff <gray@gnu.org>2019-06-11 09:54:02 (GMT)
committer Sergey Poznyakoff <gray@gnu.org>2019-06-11 10:18:29 (GMT)
commitbf6506cdc46446eada5090a428c2407ebd17468a (patch) (side-by-side diff)
tree2113b5c049283413fb4fe3981a837989d2969918 /tests/nt.c
parent186b9a1c99988844c5ea3fcce1fcc6cadb491206 (diff)
downloadpies-bf6506cdc46446eada5090a428c2407ebd17468a.tar.gz
pies-bf6506cdc46446eada5090a428c2407ebd17468a.tar.bz2
Improve the nt tool. Test inet running instance limit.
* tests/Makefile.am: Add new test. * tests/aux/in.test (PIESCTL): Provide the necessary options. Discontinue the use of STOPCMD environment variable. New commands: enable, sleep, touch. * tests/testsuite.at (PIES_CONTROL_INIT): Rename pidfile to PIES_PIDFILE and ctlsock to PIES_CTLSOCK. Export both. Include maxinst.at * tests/control.at: Use new variables. * tests/inet.at: Remove the env block. * tests/iobuf.h (iobuf_copy): Return number of bytes copied. * tests/maxinst.at: New file. * tests/nt.c (netcat_stream_disconnect): New function. (netcat_stream_read): Disconnect the peer stream if no more input is available and the peer is not available for output (i.e. its output buffer is empty). (netcat_stream_write): Stop polling if output buffer is empty. (netcat): Fix event mask
Diffstat (limited to 'tests/nt.c') (more/less context) (ignore whitespace changes)
-rw-r--r--tests/nt.c62
1 files changed, 36 insertions, 26 deletions
diff --git a/tests/nt.c b/tests/nt.c
index 7501586..d30e447 100644
--- a/tests/nt.c
+++ b/tests/nt.c
@@ -107,29 +107,49 @@ stdin_reader (same as net_reader)
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
netcat_stream_read (netcat_server_t *srv)
{
ssize_t n;
-
+
if (iobuf_avail_size (&srv->buf[IN]))
{
n = iobuf_fill (&srv->buf[IN], srv->pollfd->fd);
if (n == -1)
{
+ if (errno == EINTR)
+ return 0;
grecs_error (NULL, errno, "%s: read", srv->id);
srv->pollfd->events &= ~POLLIN;
return -1;
}
- 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;
}
else
{
@@ -139,12 +159,6 @@ netcat_stream_read (netcat_server_t *srv)
return n;
}
-static inline int
-peer_is_state (netcat_server_t *srv, int state)
-{
- return srv->peer && (srv->peer->state & state);
-}
-
ssize_t
netcat_stream_write (netcat_server_t *srv)
{
@@ -155,22 +169,21 @@ netcat_stream_write (netcat_server_t *srv)
if (!peer_is_state (srv, POLLIN))
{
// 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;
}
if (iobuf_copy (&srv->buf[OUT], &srv->peer->buf[IN]) == 0)
{
srv->peer->pollfd->events |= POLLIN;
+ srv->pollfd->events &= ~POLLOUT;
return 0;
}
}
n = iobuf_flush (&srv->buf[OUT], srv->pollfd->fd);
if (n == -1)
{
+ if (errno == EINTR)
+ return 0;
grecs_error (NULL, errno, "%s: write", srv->id);
return -1;
}
@@ -253,19 +266,16 @@ netcat (char const *urlstr)
{
netcat_server_t *next = srv->next;
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)
{
if (events & POLLHUP)
{
//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);
}
else if (events & POLLIN)
netcat_stream_read (srv);

Return to:

Send suggestions and report system problems to the System administrator.