about summary refs log tree commit diff
path: root/login
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-06-29 12:44:22 +0000
committerUlrich Drepper <drepper@redhat.com>1998-06-29 12:44:22 +0000
commitfdacb17d4819c7112a147195c5ce3c82147f4b46 (patch)
treed1c400488d3bc8dfe707645a0fc38916e223614c /login
parentba488034eabd1affd6b4b3e8838abde0f4d0504e (diff)
downloadglibc-fdacb17d4819c7112a147195c5ce3c82147f4b46.tar.gz
glibc-fdacb17d4819c7112a147195c5ce3c82147f4b46.tar.xz
glibc-fdacb17d4819c7112a147195c5ce3c82147f4b46.zip
Update.
1998-06-29 12:27  Ulrich Drepper  <drepper@cygnus.com>

	* argp/argp.h: Use __PMT instead of __P for function pointer.
	* iconv/gconv.h: Likewise.
	* io/fts.h: Likewise.
	* io/ftw.h: Likewise.
	* libio/libio.h: Likewise.
	* malloc/mcheck.h: Likewise.
	* misc/search.h: Likewise.
	* posix/glob.h: Likewise.
	* resolv/resolv.h: Likewise.
	* signal/signal.h: Likewise.
	* stdlib/stdlib.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/sigaction.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/siginfo.h: Likewise.

1998-06-26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makeconfig (CPPFLAGS): Use $($(subdir)-CPPFLAGS) only once.

1998-06-27  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/wordexp.c (parse_param): Fix memory leak.

1998-06-27  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libc.map: Export _IO_ftrylockfile.

1998-06-27  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/aio_sigqueue.c: Use get[pu]id instead of
	__get[pu]id.

1998-06-28  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/dl-misc.c (_dl_debug_message): Don't cache the pid.

	* elf/dl-runtime.c (_dl_object_relocation_scope): Avoid adding the
	same search list twice.

1998-06-29  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* login/programs/utmpd.c (handle_requests): Set and use maximal fd
	used to optimize loop/select.

1998-06-24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/generic/init-first.c: Don't define __libc_pid.
	* sysdeps/unix/sysv/linux/init-first.c: Likewise.
	* sysdeps/mach/hurd/i386/init-first.c: Likewise.
	* sysdeps/mach/hurd/mips/init-first.c: Likewise.
	* sysdeps/arm/init-first.c: Likewise.
	* posix/getopt_init.c: Don't use __libc_pid.
	* sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise.
	* sysdeps/unix/sysv/linux/sigqueue.c: Likewise.
	* libc.map: Remove __libc_uid and __libc_pid.
Diffstat (limited to 'login')
-rw-r--r--login/programs/utmpd.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/login/programs/utmpd.c b/login/programs/utmpd.c
index c2e9fe0a8b..b3384f51d5 100644
--- a/login/programs/utmpd.c
+++ b/login/programs/utmpd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
 
@@ -28,6 +28,7 @@
 #include <stdlib.h>
 #include <signal.h>
 #include <string.h>
+#include <sys/param.h>
 #include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
@@ -270,6 +271,7 @@ void handle_requests (void)
   fd_set read_fd_set;
   fd_set write_fd_set;
   int fd;
+  int maxfd;  /* Highest used fd to optimize select/loop.  */
 
   /* Initialize the set of active sockets.  */
   FD_ZERO (&active_read_fd_set);
@@ -277,16 +279,18 @@ void handle_requests (void)
   FD_SET (rw_sock, &active_read_fd_set);
   FD_SET (ro_sock, &active_read_fd_set);
 
+  maxfd = MAX (rw_sock, ro_sock);
+
   while (1)
     {
       /* Block until input arrives on one or more active sockets.  */
       read_fd_set = active_read_fd_set;
       write_fd_set = active_write_fd_set;
-      if (select (FD_SETSIZE, &read_fd_set, &write_fd_set, NULL, NULL) < 0)
+      if (select (maxfd + 1, &read_fd_set, &write_fd_set, NULL, NULL) < 0)
 	error (EXIT_FAILURE, errno, _("cannot get input on sockets"));
 
       /* Service all the sockets with input pending.  */
-      for (fd = 0; fd < FD_SETSIZE; fd++)
+      for (fd = 0; fd <= maxfd; ++fd)
 	{
 	  if (FD_ISSET (fd, &read_fd_set))
 	    {
@@ -299,6 +303,7 @@ void handle_requests (void)
 		    error (0, errno, _("cannot accept connection"));
 
 		  FD_SET (connection->sock, &active_read_fd_set);
+		  maxfd = MAX (maxfd, connection->sock);
 		}
 	      else
 		{
@@ -335,6 +340,14 @@ void handle_requests (void)
 		FD_CLR (fd, &active_write_fd_set);
 	    }
 	}
+
+      /* Check if maxfd can be lowered.  */
+      for (; maxfd >= 0; --maxfd)
+	{
+	  if (FD_ISSET (maxfd, &active_read_fd_set)
+	      || FD_ISSET (maxfd, &active_write_fd_set))
+	    break;
+	}
     }
 }