From fed8f7f7aeb06dfae0dfbfb085c6857cc457c254 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 15 Jun 1998 18:12:05 +0000 Subject: Update. 1998-06-15 18:07 Ulrich Drepper * iconvdata/ksc5601.h: Clean up a bit. 1998-06-15 14:35 Ulrich Drepper * sunrpc/svc_tcp.c (readtcp): Also listen to all the other connections and process incoming data. * sunrpc/xdr_rec.c (set_input_fragment): Only recognize zero length fragments as invalid. Patches by Thorsten Kukuk . 1998-06-13 Andreas Jaeger Removal of duplicates like "the the". * manual/time.texi (TZ Variable): Likewise. * manual/users.texi (Manipulating the Database): Likewise. * manual/sysinfo.texi (Filesystem handling): Likewise. * manual/signal.texi (Signaling Yourself): Likewise. * manual/message.texi (Message Translation): Likewise. (Common Usage): Likewise. * manual/llio.texi: Likewise. * manual/arith.texi (Old-style number conversion): Likewise. * manual/argp.texi (Argp): Likewise. (Argp Parsers): Likewise. (Argp Help Filtering): Likewise. * hesiod/README.hesiod: Correct typo. * manual/llio.texi: Correct typos. * manual/sysinfo.texi: Likewise. 1998-06-13 Andreas Jaeger * rt/aio.h: Rename __op to __operation for g++. 1998-06-13 20:17 -0400 Zack Weinberg * iconvdata/gen-8bit-gap.sh: Use awk not perl. Clean up sed script. * iconvdata/gen-8bit-gap-1.sh: Likewise. * iconvdata/gen-8bit.sh: Clean up sed script. * iconvdata/Makefile: Remove all PERL conditionals; build all the modules all the time. Export AWK. (gen-8bit-gap): Delete setting of PERL. (gen-8bit-gap-1): Likewise. (perl-generated-headers): Renamed awk-generated-headers. * iconvdata/gap.pl: Removed. * iconvdata/gaptab.pl: Removed. * iconvdata/gap.awk: New file. * iconvdata/gaptab.awk: New file. 1998-06-15 Ulrich Drepper * sysdeps/generic/Dist: Add errno-loc.c. * sysdeps/unix/sysv/linux/alpha/glob.c: Add prototypes for the __new_* functions. 1998-06-14 14:21 -0400 Zack Weinberg * stdio-common/bug12.c: New test for fread()/fseek(). * stdio-common/Makefile (tests): Add bug12. --- sunrpc/svc_tcp.c | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) (limited to 'sunrpc/svc_tcp.c') diff --git a/sunrpc/svc_tcp.c b/sunrpc/svc_tcp.c index 41f95332e7..e162c02751 100644 --- a/sunrpc/svc_tcp.c +++ b/sunrpc/svc_tcp.c @@ -284,13 +284,19 @@ svctcp_destroy (SVCXPRT *xprt) * All read operations timeout after 35 seconds. * A timeout is fatal for the connection. */ -static struct timeval wait_per_try = -{35, 0}; +static struct timeval wait_per_try = {35, 0}; /* * reads data from the tcp connection. * any error is fatal and the connection is closed. * (And a read of zero bytes is a half closed stream => error.) + * + * Note: we have to be careful here not to allow ourselves to become + * blocked too long in this routine. While we're waiting for data from one + * client, another client may be trying to connect. To avoid this situation, + * some code from svc_run() is transplanted here: the select() loop checks + * all RPC descriptors including the one we want and calls svc_getreqset2() + * to handle new requests if any are detected. */ static int readtcp (char *xprtptr, char *buf, int len) @@ -298,39 +304,41 @@ readtcp (char *xprtptr, char *buf, int len) SVCXPRT *xprt = (SVCXPRT *)xprtptr; int sock = xprt->xp_sock; #ifdef FD_SETSIZE - fd_set mask; fd_set readfds; - - FD_ZERO (&mask); - FD_SET (sock, &mask); #else int mask = 1 << sock; int readfds; #endif /* def FD_SETSIZE */ - do + while (1) { struct timeval timeout = wait_per_try; - readfds = mask; + readfds = svc_fdset; +#ifdef FD_SETSIZE + FD_SET (sock, &readfds); +#else + readfds |= (1 << sock); +#endif /* def FD_SETSIZE */ if (select (_rpc_dtablesize (), &readfds, (fd_set *) NULL, (fd_set *) NULL, &timeout) <= 0) { if (errno == EINTR) - { - continue; - } + continue; goto fatal_err; } + #ifdef FD_SETSIZE - } - while (!FD_ISSET (sock, &readfds)); + if (FD_ISSET (sock, &readfds)) #else - } - while (readfds != mask); + if (readfds == mask) #endif /* def FD_SETSIZE */ - if ((len = read (sock, buf, len)) > 0) - { - return len; + break; + + svc_getreqset (&readfds); } + + if ((len = read (sock, buf, len)) > 0) + return len; + fatal_err: ((struct tcp_conn *) (xprt->xp_p1))->strm_stat = XPRT_DIED; return -1; -- cgit v1.2.3