aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-05-11 17:20:34 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-05-11 17:20:34 +0300
commitb29d99da54c79147a518c2f6bd194d85f743464c (patch)
tree80b6650e404b0c7766d01a4d9eead6edc3e25c39
parent57fd88cfc9148d5c6a1cd9473f4bc8fc198ff650 (diff)
downloadrpipe-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.c27
-rw-r--r--t/Makefile.am3
-rw-r--r--t/delayin.at (renamed from t/delay.at)0
-rw-r--r--t/delayout.at18
-rw-r--r--t/testsuite.at3
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])

Return to:

Send suggestions and report system problems to the System administrator.