diff options
Diffstat (limited to 'nis')
-rw-r--r-- | nis/nis_callback.c | 41 |
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; } |