about summary refs log tree commit diff
path: root/nis
diff options
context:
space:
mode:
Diffstat (limited to 'nis')
-rw-r--r--nis/nis_callback.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/nis/nis_callback.c b/nis/nis_callback.c
index 57a15e5162..eb5464479d 100644
--- a/nis/nis_callback.c
+++ b/nis/nis_callback.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+   Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <memory.h>
 #include <syslog.h>
+#include <sys/poll.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -195,29 +196,29 @@ static nis_error
 internal_nis_do_callback (struct dir_binding *bptr, netobj *cookie,
 			  struct nis_cb *cb)
 {
-  /* Default timeout can be changed using clnt_control() */
-  static struct timeval TIMEOUT = {25, 0};
-#ifdef FD_SETSIZE
-  fd_set readfds;
-#else
-  int readfds;
-#endif /* def FD_SETSIZE */
-  struct timeval tv;
+  struct timeval TIMEOUT = {25, 0};
   bool_t cb_is_running = FALSE;
 
   data = cb;
 
   for (;;)
     {
-#ifdef FD_SETSIZE
-      readfds = svc_fdset;
-#else
-      readfds = svc_fds;
-#endif /* def FD_SETSIZE */
-      tv.tv_sec = 25;
-      tv.tv_usec = 0;
-      switch (select (_rpc_dtablesize (), &readfds, NULL, NULL, &tv))
-	{
+      struct pollfd *my_pollfd;
+      int i;
+
+      if (svc_max_pollfd == 0 && svc_pollfd == NULL)
+        return NIS_CBERROR;
+
+      my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd);
+      for (i = 0; i < svc_max_pollfd; ++i)
+        {
+          my_pollfd[i].fd = svc_pollfd[i].fd;
+          my_pollfd[i].events = svc_pollfd[i].events;
+          my_pollfd[i].revents = 0;
+        }
+
+      switch (i = __poll (my_pollfd, svc_max_pollfd, 25*1000))
+        {
 	case -1:
 	  if (errno == EINTR)
 	    continue;
@@ -237,7 +238,7 @@ internal_nis_do_callback (struct dir_binding *bptr, netobj *cookie,
 	    }
 	  break;
 	default:
-	  svc_getreqset (&readfds);
+	  svc_getreq_poll (my_pollfd, i);
 	  if (data->nomore)
 	    return data->result;
 	}