diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-05-11 17:20:34 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-05-11 17:20:34 +0300 |
commit | b29d99da54c79147a518c2f6bd194d85f743464c (patch) | |
tree | 80b6650e404b0c7766d01a4d9eead6edc3e25c39 | |
parent | 57fd88cfc9148d5c6a1cd9473f4bc8fc198ff650 (diff) | |
download | rpipe-b29d99da54c79147a518c2f6bd194d85f743464c.tar.gz rpipe-b29d99da54c79147a518c2f6bd194d85f743464c.tar.bz2 |
Follow-up to bc3bc8bc19
* src/server.c (srvdef) <srv_hup>: Change type to server_handler_t.
(server_hup_handler_t): Remove typedef.
(rpipe_server_hangup): Change signature: remove last argument.
(srv_progout_hup): Likewise.
(rpipe_server_run): fdcopy is not needed.
* t/delay.at: Rename to t/delayin.at
* t/delayout.at: New testcase.
* t/testsuite.at: Add new testcase.
* t/Makefile.am: Likewise.
-rw-r--r-- | src/server.c | 27 | ||||
-rw-r--r-- | t/Makefile.am | 3 | ||||
-rw-r--r-- | t/delayin.at (renamed from t/delay.at) | 0 | ||||
-rw-r--r-- | t/delayout.at | 18 | ||||
-rw-r--r-- | t/testsuite.at | 3 |
5 files changed, 34 insertions, 17 deletions
diff --git a/src/server.c b/src/server.c index d4f5db2..c460baa 100644 --- a/src/server.c +++ b/src/server.c @@ -46,7 +46,6 @@ enum { /* Servers */ typedef int (*server_handler_t)(rpipe_t *rp, rpipe_server_t *srv); -typedef int (*server_hup_handler_t)(rpipe_t *rp, rpipe_server_t *srv, struct pollfd *pfd); typedef void (*server_disconnect_t)(rpipe_t *rp, rpipe_server_t *srv); typedef void (*server_free_t)(rpipe_server_t *srv); typedef char *(*server_str_t)(rpipe_server_t *srv); @@ -69,7 +68,7 @@ static void srv_progin_disconnect(rpipe_t *rp, rpipe_server_t *srv); static void srv_progin_free(rpipe_server_t *srv); static int srv_progout_in(rpipe_t *rp, rpipe_server_t *srv); -static int srv_progout_hup(rpipe_t *rp, rpipe_server_t *srv, struct pollfd *pfd); +static int srv_progout_hup(rpipe_t *rp, rpipe_server_t *srv); static void srv_progout_free(rpipe_server_t *srv); static void progout_store_status(struct rpipe_server_progout *p, int status); @@ -79,7 +78,7 @@ static void progout_transfer(struct rpipe_server_progout *p, static struct srvdef { server_handler_t srv_in; server_handler_t srv_out; - server_hup_handler_t srv_hup; + server_handler_t srv_hup; server_disconnect_t srv_dis; server_free_t srv_free; server_str_t srv_str; @@ -184,10 +183,10 @@ rpipe_server_output(rpipe_t *rp, rpipe_server_t *srv) } int -rpipe_server_hangup(rpipe_t *rp, rpipe_server_t *srv, struct pollfd *pfd) +rpipe_server_hangup(rpipe_t *rp, rpipe_server_t *srv) { return srvdef[srv->comm.type].srv_hup - ? srvdef[srv->comm.type].srv_hup(rp, srv, pfd) + ? srvdef[srv->comm.type].srv_hup(rp, srv) : 0; } @@ -500,6 +499,8 @@ srv_net_in(rpipe_t *rp, rpipe_server_t *srv) net->pollfd->events &= ~POLLIN; return -1; } else if (n == 0) { + if (verbose) + error(0, 0, "%s: EOF", rpipe_server_str(srv)); /* No more input is expected */ net->pollfd->events &= ~POLLIN; if (!iobuf_data_size(&net->ibuf)) @@ -721,10 +722,10 @@ srv_progout_in(rpipe_t *rp, rpipe_server_t *srv) } static int -srv_progout_hup(rpipe_t *rp, rpipe_server_t *srv, struct pollfd *pfd) +srv_progout_hup(rpipe_t *rp, rpipe_server_t *srv) { struct rpipe_server_progout *progout = &srv->progout; - if (pfd->revents == POLLHUP && (pfd->events & POLLIN)) { + if (progout->pollfd->revents == POLLHUP && (progout->pollfd->events & POLLIN)) { if (verbose) error(0, 0, "%s: HUP", rpipe_server_str(srv)); progout->pollfd->events &= ~POLLIN; @@ -927,7 +928,6 @@ void rpipe_server_run(rpipe_t *rp) { int i; - struct pollfd *fdcopy; static int sigv[] = { SIGCHLD, SIGTERM, @@ -942,8 +942,6 @@ rpipe_server_run(rpipe_t *rp) signal_setup(server_sig_handler, sigv, sigc); - fdcopy = xcalloc(rp->nfd, sizeof(fdcopy[0])); - while (1) { int n; @@ -960,12 +958,12 @@ rpipe_server_run(rpipe_t *rp) error(0, errno, "poll"); continue; } - memcpy(fdcopy, rp->fds, rp->nfd * sizeof fdcopy[0]); + for (i = 0; n > 0 && i < rp->nfd; i++) { - if (rp->fds[i].revents) - n--; if (rp->fds[i].fd < 0) continue; + if (rp->fds[i].revents) + n--; if ((rp->fds[i].events|POLLHUP) & rp->fds[i].revents) { int rc = 0; rpipe_server_t *srv = &rp->srv[i]; @@ -975,8 +973,7 @@ rpipe_server_run(rpipe_t *rp) if (rp->fds[i].revents & POLLOUT) rc |= rpipe_server_output(rp, srv); if (rp->fds[i].revents & POLLHUP) - rc |= rpipe_server_hangup(rp, srv, - &fdcopy[i]); + rc |= rpipe_server_hangup(rp, srv); if (rc) { //FIXME rpipe_server_disconnect(rp, srv); diff --git a/t/Makefile.am b/t/Makefile.am index 1d96ff1..7168598 100644 --- a/t/Makefile.am +++ b/t/Makefile.am @@ -29,7 +29,8 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac ## ------------ ## TESTSUITE_AT = \ - delay.at\ + delayout.at\ + delayin.at\ pipein.at\ pipeout.at\ status.at\ diff --git a/t/delay.at b/t/delayin.at index 07ceb10..07ceb10 100644 --- a/t/delay.at +++ b/t/delayin.at diff --git a/t/delayout.at b/t/delayout.at new file mode 100644 index 0000000..2119a1e --- /dev/null +++ b/t/delayout.at @@ -0,0 +1,18 @@ +# This file is part of rpipe testsuite -*- autotest -*- +# Copyright (C) 2019-2021 Sergey Poznyakoff +# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> +# This is free software: you are free to change and redistribute it. +# There is NO WARRANTY, to the extent permitted by law. +AT_SETUP([delayed output]) +AT_KEYWORDS([data send delay]) + +AT_CHECK([chargen -l 4099 | tee expout | \ + rpipe -T $TESTDIR/t_sink -t 0=1s:1024=2s:2048=500000:4098=3s -f store -- +status=$? +cat store +exit $status +], +[0], +[expout]) + +AT_CLEANUP diff --git a/t/testsuite.at b/t/testsuite.at index cf4124e..9877a18 100644 --- a/t/testsuite.at +++ b/t/testsuite.at @@ -10,5 +10,6 @@ AT_INIT AT_TESTED([rpipe]) m4_include([status.at]) m4_include([pipeout.at]) -m4_include([delay.at]) m4_include([pipein.at]) +m4_include([delayout.at]) +m4_include([delayin.at]) |