diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-06-15 18:12:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-06-15 18:12:05 +0000 |
commit | fed8f7f7aeb06dfae0dfbfb085c6857cc457c254 (patch) | |
tree | 292caa308359deaa5fed820469d0b37805126e68 /sunrpc/svc_tcp.c | |
parent | e5bafd559a4c155fa9d1b1a669c67d99ea773565 (diff) | |
download | glibc-fed8f7f7aeb06dfae0dfbfb085c6857cc457c254.tar.gz |
Update.
1998-06-15 18:07 Ulrich Drepper <drepper@cygnus.com>
* iconvdata/ksc5601.h: Clean up a bit.
1998-06-15 14:35 Ulrich Drepper <drepper@cygnus.com>
* 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 <kukuk@weber.uni-paderborn.de>.
1998-06-13 Andreas Jaeger <aj@arthur.rhein-neckar.de>
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 <aj@arthur.rhein-neckar.de>
* rt/aio.h: Rename __op to __operation for g++.
1998-06-13 20:17 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
* 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 <drepper@cygnus.com>
* 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 <zack@rabi.phys.columbia.edu>
* stdio-common/bug12.c: New test for fread()/fseek().
* stdio-common/Makefile (tests): Add bug12.
Diffstat (limited to 'sunrpc/svc_tcp.c')
-rw-r--r-- | sunrpc/svc_tcp.c | 44 |
1 files changed, 26 insertions, 18 deletions
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; |