summary refs log tree commit diff
path: root/sunrpc/svc_tcp.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-06-15 18:12:05 +0000
committerUlrich Drepper <drepper@redhat.com>1998-06-15 18:12:05 +0000
commitfed8f7f7aeb06dfae0dfbfb085c6857cc457c254 (patch)
tree292caa308359deaa5fed820469d0b37805126e68 /sunrpc/svc_tcp.c
parente5bafd559a4c155fa9d1b1a669c67d99ea773565 (diff)
downloadglibc-fed8f7f7aeb06dfae0dfbfb085c6857cc457c254.tar.gz
glibc-fed8f7f7aeb06dfae0dfbfb085c6857cc457c254.tar.xz
glibc-fed8f7f7aeb06dfae0dfbfb085c6857cc457c254.zip
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.c44
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;