about summary refs log tree commit diff
path: root/sunrpc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-07-31 06:11:24 +0000
committerUlrich Drepper <drepper@redhat.com>1999-07-31 06:11:24 +0000
commitbdb04ee8e21c3ee229bf3d2ad2ca8288e3cb44e9 (patch)
treeefe99ba63e77cedcf730e424a1fcb0f5ef7a09ad /sunrpc
parent3d558f4ec7fecbac0dddb4d321a1ec10f14e8e03 (diff)
downloadglibc-bdb04ee8e21c3ee229bf3d2ad2ca8288e3cb44e9.tar.gz
glibc-bdb04ee8e21c3ee229bf3d2ad2ca8288e3cb44e9.tar.xz
glibc-bdb04ee8e21c3ee229bf3d2ad2ca8288e3cb44e9.zip
Update.
1999-07-30  Andreas Schwab  <schwab@suse.de>

	* sysdeps/unix/sysv/linux/getsysstats.c (GET_NPROCS_PARSER): New
	definition.
	(__get_nprocs): Use it.
	(__get_nprocs_conf): Define as separate function if
	GET_NPROCS_CONF_PARSER is defined.
	* sysdeps/unix/sysv/linux/alpha/getsysstats.c: New file.

	* include/sys/sysinfo.h: New file.
	* sysdeps/generic/sys/sysinfo.h: Remove declaration of internal
	interface.
	* sysdeps/unix/sysv/linux/sys/sysinfo.h: Likewise.

1999-07-30  H.J. Lu  <hjl@gnu.org>

	* libio/iofflush.c (fflush_unlocked): Weak aliase if
	_IO_MTSAFE_IO is not defined.
	* libio/clearerr.c (clearerr_unlocked): Likewise.
	* libio/feof.c (feof_unlocked): Likewise.
	* libio/ferror.c (ferror_unlocked): Likewise.
	* libio/fputc.c (fputc_unlocked): Likewise.
	* libio/getc.c (getc_unlocked, fgetc_unlocked): Likewise.
	* libio/getchar.c (getchar_unlocked): Likewise.
	* libio/putc.c (putc_unlocked): Likewise.
	* libio/putchar.c (putchar_unlocked): Likewise.

1999-07-30  Thorsten Kukuk  <kukuk@suse.de>

	* sunrpc/Versions: Add svc_getreq_common, svc_getreq_poll,
	  svc_max_pollfd and svc_pollfd to GLIBC_2.2
	* sunrpc/rpc/svc.h: Use rpc*_t types, add new prototypes
	  for svc_run/poll interface.
	* sunrpc/rpc/types.h: Add rpc*_t typedefs.
	* sunrpc/rpc_common.c: Add svc_pollfd and svc_max_pollfd as
	  global variable.
	* sunrpc/svc.c: Add svc_getreq_poll and svc_getreq_common,
	  rewrite other svc_getreq* functions to use svc_getreq_common.
	* sunrpc/svc_run.c: Use poll().

1999-07-30  Andreas Schwab  <schwab@suse.de>

	* Makerules: Put sysd-versions and Versions.all on
	postclean-generated instead of common-generated.

1999-07-29  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/time.texi (Basic CPU Time): Note that clock_t can wrap
	around and CLOCKS_PER_SEC is 1e6.
Diffstat (limited to 'sunrpc')
-rw-r--r--sunrpc/Versions2
-rw-r--r--sunrpc/rpc/svc.h50
-rw-r--r--sunrpc/rpc/types.h9
-rw-r--r--sunrpc/rpc_common.c19
-rw-r--r--sunrpc/svc.c456
-rw-r--r--sunrpc/svc_run.c51
6 files changed, 272 insertions, 315 deletions
diff --git a/sunrpc/Versions b/sunrpc/Versions
index 1d90bbeaaf..e222b16096 100644
--- a/sunrpc/Versions
+++ b/sunrpc/Versions
@@ -107,4 +107,6 @@ libc {
     xdr_hyper; xdr_u_hyper; xdr_longlong_t; xdr_u_longlong_t;
     xdr_int64_t; xdr_uint64_t;
   }
+  GLIBC_2.2 {
+    svc_getreq_common; svc_getreq_poll; svc_max_pollfd; svc_pollfd;
 }
diff --git a/sunrpc/rpc/svc.h b/sunrpc/rpc/svc.h
index 4ac2a5cdf0..f607d6b659 100644
--- a/sunrpc/rpc/svc.h
+++ b/sunrpc/rpc/svc.h
@@ -1,4 +1,3 @@
-/* @(#)svc.h	2.2 88/07/29 4.0 RPCSRC; from 1.20 88/02/08 SMI */
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -147,12 +146,12 @@ struct SVCXPRT {
  * Service request
  */
 struct svc_req {
-	u_long		rq_prog;	/* service program number */
-	u_long		rq_vers;	/* service protocol version */
-	u_long		rq_proc;	/* the desired procedure */
-	struct opaque_auth rq_cred;	/* raw creds from the wire */
-	caddr_t		rq_clntcred;	/* read only cooked cred */
-	SVCXPRT	*rq_xprt;		/* associated transport */
+  rpcprog_t rq_prog;            /* service program number */
+  rpcvers_t rq_vers;            /* service protocol version */
+  rpcproc_t rq_proc;            /* the desired procedure */
+  struct opaque_auth rq_cred;   /* raw creds from the wire */
+  caddr_t rq_clntcred;          /* read only cooked cred */
+  SVCXPRT *rq_xprt;             /* associated transport */
 };
 
 #ifndef __DISPATCH_FN_T
@@ -165,23 +164,23 @@ typedef void (*__dispatch_fn_t) __PMT ((struct svc_req*, SVCXPRT*));
  *
  * svc_register(xprt, prog, vers, dispatch, protocol)
  *	SVCXPRT *xprt;
- *	u_long prog;
- *	u_long vers;
+ *	rpcprog_t prog;
+ *	rpcvers_t vers;
  *	void (*dispatch)();
- *	u_long protocol;  like TCP or UDP, zero means do not register
+ *	rpcprot_t protocol;  like TCP or UDP, zero means do not register
  */
-extern bool_t	svc_register __P ((SVCXPRT *__xprt, u_long __prog,
-				   u_long __vers, __dispatch_fn_t __dispatch,
-				   u_long __protocol));
+extern bool_t svc_register __P ((SVCXPRT *__xprt, rpcprog_t __prog,
+				 rpcvers_t __vers, __dispatch_fn_t __dispatch,
+				 rpcprot_t __protocol));
 
 /*
  * Service un-registration
  *
  * svc_unregister(prog, vers)
- *	u_long prog;
- *	u_long vers;
+ *	rpcprog_t prog;
+ *	rpcvers_t vers;
  */
-extern void	svc_unregister __P ((u_long __prog, u_long __vers));
+extern void svc_unregister __P ((rpcprog_t __prog, rpcvers_t __vers));
 
 /*
  * Transport registration.
@@ -189,7 +188,7 @@ extern void	svc_unregister __P ((u_long __prog, u_long __vers));
  * xprt_register(xprt)
  *	SVCXPRT *xprt;
  */
-extern void	xprt_register __P ((SVCXPRT *__xprt));
+extern void xprt_register __P ((SVCXPRT *__xprt));
 
 /*
  * Transport un-register
@@ -197,9 +196,7 @@ extern void	xprt_register __P ((SVCXPRT *__xprt));
  * xprt_unregister(xprt)
  *	SVCXPRT *xprt;
  */
-extern void	xprt_unregister __P ((SVCXPRT *__xprt));
-
-
+extern void xprt_unregister __P ((SVCXPRT *__xprt));
 
 
 /*
@@ -237,8 +234,8 @@ extern void	svcerr_weakauth __P ((SVCXPRT *__xprt));
 
 extern void	svcerr_noproc __P ((SVCXPRT *__xprt));
 
-extern void	svcerr_progvers __P ((SVCXPRT *__xprt, u_long __low_vers,
-				      u_long __high_vers));
+extern void	svcerr_progvers __P ((SVCXPRT *__xprt, rpcvers_t __low_vers,
+				      rpcvers_t __high_vers));
 
 extern void	svcerr_auth __P ((SVCXPRT *__xprt, enum auth_stat __why));
 
@@ -261,19 +258,20 @@ extern void	svcerr_systemerr __P ((SVCXPRT *__xprt));
  * Global keeper of rpc service descriptors in use
  * dynamic; must be inspected before each call to select
  */
-#ifdef FD_SETSIZE
+
+extern struct pollfd *svc_pollfd;
+extern int svc_max_pollfd;
 extern fd_set svc_fdset;
 #define svc_fds svc_fdset.fds_bits[0]	/* compatibility */
-#else
-extern int svc_fds;
-#endif /* def FD_SETSIZE */
 
 /*
  * a small program implemented by the svc_rpc implementation itself;
  * also see clnt.h for protocol numbers.
  */
 extern void svc_getreq __P ((int __rdfds));
+extern void svc_getreq_common __P ((const int __fd));
 extern void svc_getreqset __P ((fd_set *__readfds));
+extern void svc_getreq_poll __P ((struct pollfd *, const int));
 extern void svc_exit __P ((void));
 extern void svc_run __P ((void));
 
diff --git a/sunrpc/rpc/types.h b/sunrpc/rpc/types.h
index 61ea3c19f8..e2e8402be9 100644
--- a/sunrpc/rpc/types.h
+++ b/sunrpc/rpc/types.h
@@ -1,4 +1,3 @@
-/* @(#)types.h	2.3 88/08/15 4.0 RPCSRC */
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -27,8 +26,6 @@
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
-/*      @(#)types.h 1.18 87/07/24 SMI      */
-
 /* fixincludes should not add extern "C" to this file */
 /*
  * Rpc additions to <sys/types.h>
@@ -38,6 +35,12 @@
 
 typedef int bool_t;
 typedef int enum_t;
+/* This needs to be changed to uint32_t in the future */
+typedef unsigned long rpcprog_t;
+typedef unsigned long rpcvers_t;
+typedef unsigned long rpcproc_t;
+typedef unsigned long rpcprot_t;
+typedef unsigned long rpcport_t;
 
 #define        __dontcare__    -1
 
diff --git a/sunrpc/rpc_common.c b/sunrpc/rpc_common.c
index 75cead0875..57e14351ea 100644
--- a/sunrpc/rpc_common.c
+++ b/sunrpc/rpc_common.c
@@ -1,4 +1,3 @@
-/* @(#)rpc_commondata.c	2.1 88/07/29 4.0 RPCSRC */
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -6,23 +5,23 @@
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
  * program developed by the user.
- * 
+ *
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- * 
+ *
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
- * 
+ *
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
- * 
+ *
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
- * 
+ *
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
@@ -30,12 +29,10 @@
 #include <rpc/rpc.h>
 /*
  * This file should only contain common data (global data) that is exported
- * by public interfaces 
+ * by public interfaces
  */
 struct opaque_auth _null_auth;
-#ifdef FD_SETSIZE
 fd_set svc_fdset;
-#else
-int svc_fds;
-#endif /* def FD_SETSIZE */
 struct rpc_createerr rpc_createerr;
+struct pollfd *svc_pollfd;
+int svc_max_pollfd;
diff --git a/sunrpc/svc.c b/sunrpc/svc.c
index da97098add..59b902dd63 100644
--- a/sunrpc/svc.c
+++ b/sunrpc/svc.c
@@ -1,4 +1,3 @@
-/* @(#)svc.c	2.4 88/08/11 4.0 RPCSRC; from 1.44 88/02/08 SMI */
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -27,10 +26,6 @@
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro";
-#endif
-
 /*
  * svc.c, Server-side remote procedure call interface.
  *
@@ -42,108 +37,121 @@ static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro";
  */
 
 #include <errno.h>
+#include <unistd.h>
 #include <rpc/rpc.h>
 #include <rpc/svc.h>
 #include <rpc/pmap_clnt.h>
+#include <sys/poll.h>
 
-#ifndef errno
-extern int errno;
-#endif
-
-#ifdef FD_SETSIZE
 static SVCXPRT **xports;
-#else
-#define NOFILE 32
-
-static SVCXPRT *xports[NOFILE];
-#endif /* def FD_SETSIZE */
 
 #define NULL_SVC ((struct svc_callout *)0)
 #define	RQCRED_SIZE	400	/* this size is excessive */
 
-/*
- * The services list
- * Each entry represents a set of procedures (an rpc program).
- * The dispatch routine takes request structs and runs the
- * appropriate procedure.
- */
-static struct svc_callout
-  {
-    struct svc_callout *sc_next;
-    u_long sc_prog;
-    u_long sc_vers;
-    void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
-  }
- *svc_head;
-
-static struct svc_callout *svc_find (u_long, u_long, struct svc_callout **);
+/* The services list
+   Each entry represents a set of procedures (an rpc program).
+   The dispatch routine takes request structs and runs the
+   appropriate procedure. */
+static struct svc_callout {
+  struct svc_callout *sc_next;
+  rpcprog_t sc_prog;
+  rpcvers_t sc_vers;
+  void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
+} *svc_head;
 
 /* ***************  SVCXPRT related stuff **************** */
 
-/*
- * Activate a transport handle.
- */
+/* Activate a transport handle. */
 void
 xprt_register (SVCXPRT *xprt)
 {
   register int sock = xprt->xp_sock;
+  register int i;
 
-#ifdef FD_SETSIZE
   if (xports == NULL)
     {
-      xports = (SVCXPRT **)
-	mem_alloc (FD_SETSIZE * sizeof (SVCXPRT *));
+      xports = (SVCXPRT **) malloc (_rpc_dtablesize () * sizeof (SVCXPRT *));
+      if (xports == NULL) /* Donīt add handle */
+	return;
     }
+
   if (sock < _rpc_dtablesize ())
     {
       xports[sock] = xprt;
-      FD_SET (sock, &svc_fdset);
+      if (sock < FD_SETSIZE)
+	FD_SET (sock, &svc_fdset);
+
+      /* Check if we have an empty slot */
+      for (i = 0; i < svc_max_pollfd; ++i)
+	if (svc_pollfd[i].fd == -1)
+	  {
+	    svc_pollfd[i].fd = sock;
+	    svc_pollfd[i].events = (POLLIN | POLLPRI |
+				    POLLRDNORM | POLLRDBAND);
+	    return;
+	  }
+
+      ++svc_max_pollfd;
+      svc_pollfd = realloc (svc_pollfd,
+			    sizeof (struct pollfd) * svc_max_pollfd);
+      if (svc_pollfd == NULL) /* Out of memory */
+	return;
+
+      svc_pollfd[svc_max_pollfd - 1].fd = sock;
+      svc_pollfd[svc_max_pollfd - 1].events = (POLLIN | POLLPRI |
+					       POLLRDNORM | POLLRDBAND);
     }
-#else
-  if (sock < NOFILE)
-    {
-      xports[sock] = xprt;
-      svc_fds |= (1 << sock);
-    }
-#endif /* def FD_SETSIZE */
-
 }
 
-/*
- * De-activate a transport handle.
- */
+/* De-activate a transport handle. */
 void
-xprt_unregister (xprt)
-     SVCXPRT *xprt;
+xprt_unregister (SVCXPRT *xprt)
 {
   register int sock = xprt->xp_sock;
+  register int i;
 
-#ifdef FD_SETSIZE
   if ((sock < _rpc_dtablesize ()) && (xports[sock] == xprt))
     {
       xports[sock] = (SVCXPRT *) 0;
-      FD_CLR (sock, &svc_fdset);
-    }
-#else
-  if ((sock < NOFILE) && (xports[sock] == xprt))
-    {
-      xports[sock] = (SVCXPRT *) 0;
-      svc_fds &= ~(1 << sock);
+
+      if (sock < FD_SETSIZE)
+	FD_CLR (sock, &svc_fdset);
+
+      for (i = 0; i < svc_max_pollfd; ++i)
+	if (svc_pollfd[i].fd == sock)
+	  svc_pollfd[i].fd = -1;
     }
-#endif /* def FD_SETSIZE */
 }
 
 
 /* ********************** CALLOUT list related stuff ************* */
 
-/*
- * Add a service program to the callout list.
- * The dispatch routine will be called when a rpc request for this
- * program number comes in.
- */
+/* Search the callout list for a program number, return the callout
+   struct. */
+static struct svc_callout *
+svc_find (rpcprog_t prog, rpcvers_t vers, struct svc_callout **prev)
+{
+  register struct svc_callout *s, *p;
+
+  p = NULL_SVC;
+  for (s = svc_head; s != NULL_SVC; s = s->sc_next)
+    {
+      if ((s->sc_prog == prog) && (s->sc_vers == vers))
+	goto done;
+      p = s;
+    }
+done:
+  *prev = p;
+  return s;
+}
+
+/* Add a service program to the callout list.
+   The dispatch routine will be called when a rpc request for this
+   program number comes in. */
 bool_t
-svc_register (SVCXPRT *xprt, u_long prog, u_long vers,
-	      void (*dispatch) (struct svc_req *, SVCXPRT *), u_long protocol)
+svc_register (SVCXPRT * xprt, rpcprog_t prog, rpcvers_t vers,
+	      void (*dispatch) (struct svc_req *, SVCXPRT *),
+	      rpcproc_t protocol)
 {
   struct svc_callout *prev;
   register struct svc_callout *s;
@@ -156,81 +164,49 @@ svc_register (SVCXPRT *xprt, u_long prog, u_long vers,
     }
   s = (struct svc_callout *) mem_alloc (sizeof (struct svc_callout));
   if (s == (struct svc_callout *) 0)
-    {
-      return FALSE;
-    }
+    return FALSE;
+
   s->sc_prog = prog;
   s->sc_vers = vers;
   s->sc_dispatch = dispatch;
   s->sc_next = svc_head;
   svc_head = s;
+
 pmap_it:
   /* now register the information with the local binder service */
   if (protocol)
-    {
-      return pmap_set (prog, vers, protocol, xprt->xp_port);
-    }
+    return pmap_set (prog, vers, protocol, xprt->xp_port);
+
   return TRUE;
 }
 
-/*
- * Remove a service program from the callout list.
- */
+/* Remove a service program from the callout list. */
 void
-svc_unregister (prog, vers)
-     u_long prog;
-     u_long vers;
+svc_unregister (rpcprog_t prog, rpcvers_t vers)
 {
   struct svc_callout *prev;
   register struct svc_callout *s;
 
   if ((s = svc_find (prog, vers, &prev)) == NULL_SVC)
     return;
+
   if (prev == NULL_SVC)
-    {
-      svc_head = s->sc_next;
-    }
+    svc_head = s->sc_next;
   else
-    {
-      prev->sc_next = s->sc_next;
-    }
+    prev->sc_next = s->sc_next;
+
   s->sc_next = NULL_SVC;
   mem_free ((char *) s, (u_int) sizeof (struct svc_callout));
   /* now unregister the information with the local binder service */
-  (void) pmap_unset (prog, vers);
-}
-
-/*
- * Search the callout list for a program number, return the callout
- * struct.
- */
-static struct svc_callout *
-svc_find (u_long prog, u_long vers, struct svc_callout **prev)
-{
-  register struct svc_callout *s, *p;
-
-  p = NULL_SVC;
-  for (s = svc_head; s != NULL_SVC; s = s->sc_next)
-    {
-      if ((s->sc_prog == prog) && (s->sc_vers == vers))
-	goto done;
-      p = s;
-    }
-done:
-  *prev = p;
-  return s;
+  pmap_unset (prog, vers);
 }
 
 /* ******************* REPLY GENERATION ROUTINES  ************ */
 
-/*
- * Send a reply to an rpc request
- */
+/* Send a reply to an rpc request */
 bool_t
-svc_sendreply (xprt, xdr_results, xdr_location)
-     register SVCXPRT *xprt;
-     xdrproc_t xdr_results;
-     caddr_t xdr_location;
+svc_sendreply (register SVCXPRT *xprt, xdrproc_t xdr_results,
+	       caddr_t xdr_location)
 {
   struct rpc_msg rply;
 
@@ -243,12 +219,9 @@ svc_sendreply (xprt, xdr_results, xdr_location)
   return SVC_REPLY (xprt, &rply);
 }
 
-/*
- * No procedure error reply
- */
+/* No procedure error reply */
 void
-svcerr_noproc (xprt)
-     register SVCXPRT *xprt;
+svcerr_noproc (register SVCXPRT *xprt)
 {
   struct rpc_msg rply;
 
@@ -259,12 +232,9 @@ svcerr_noproc (xprt)
   SVC_REPLY (xprt, &rply);
 }
 
-/*
- * Can't decode args error reply
- */
+/* Can't decode args error reply */
 void
-svcerr_decode (xprt)
-     register SVCXPRT *xprt;
+svcerr_decode (register SVCXPRT *xprt)
 {
   struct rpc_msg rply;
 
@@ -275,12 +245,9 @@ svcerr_decode (xprt)
   SVC_REPLY (xprt, &rply);
 }
 
-/*
- * Some system error
- */
+/* Some system error */
 void
-svcerr_systemerr (xprt)
-     register SVCXPRT *xprt;
+svcerr_systemerr (register SVCXPRT *xprt)
 {
   struct rpc_msg rply;
 
@@ -291,13 +258,9 @@ svcerr_systemerr (xprt)
   SVC_REPLY (xprt, &rply);
 }
 
-/*
- * Authentication error reply
- */
+/* Authentication error reply */
 void
-svcerr_auth (xprt, why)
-     SVCXPRT *xprt;
-     enum auth_stat why;
+svcerr_auth (SVCXPRT *xprt, enum auth_stat why)
 {
   struct rpc_msg rply;
 
@@ -308,23 +271,16 @@ svcerr_auth (xprt, why)
   SVC_REPLY (xprt, &rply);
 }
 
-/*
- * Auth too weak error reply
- */
+/* Auth too weak error reply */
 void
-svcerr_weakauth (xprt)
-     SVCXPRT *xprt;
+svcerr_weakauth (SVCXPRT *xprt)
 {
-
   svcerr_auth (xprt, AUTH_TOOWEAK);
 }
 
-/*
- * Program unavailable error reply
- */
+/* Program unavailable error reply */
 void
-svcerr_noprog (xprt)
-     register SVCXPRT *xprt;
+svcerr_noprog (register SVCXPRT *xprt)
 {
   struct rpc_msg rply;
 
@@ -335,14 +291,10 @@ svcerr_noprog (xprt)
   SVC_REPLY (xprt, &rply);
 }
 
-/*
- * Program version mismatch error reply
- */
+/* Program version mismatch error reply */
 void
-svcerr_progvers (xprt, low_vers, high_vers)
-     register SVCXPRT *xprt;
-     u_long low_vers;
-     u_long high_vers;
+svcerr_progvers (register SVCXPRT *xprt, rpcvers_t low_vers,
+		 rpcvers_t high_vers)
 {
   struct rpc_msg rply;
 
@@ -376,127 +328,139 @@ svcerr_progvers (xprt, low_vers, high_vers)
 void
 svc_getreq (int rdfds)
 {
-#ifdef FD_SETSIZE
   fd_set readfds;
 
   FD_ZERO (&readfds);
   readfds.fds_bits[0] = rdfds;
   svc_getreqset (&readfds);
-#else
-  int readfds = rdfds & svc_fds;
+}
 
-  svc_getreqset (&readfds);
-#endif /* def FD_SETSIZE */
+void
+svc_getreqset (fd_set *readfds)
+{
+  register u_int32_t mask;
+  register u_int32_t *maskp;
+  register int setsize;
+  register int sock;
+  register int bit;
+
+  setsize = _rpc_dtablesize ();
+  maskp = (u_int32_t *) readfds->fds_bits;
+  for (sock = 0; sock < setsize; sock += 32)
+    for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
+      svc_getreq_common (sock + bit - 1);
 }
 
 void
-svc_getreqset (readfds)
-#ifdef FD_SETSIZE
-     fd_set *readfds;
+svc_getreq_poll (struct pollfd *pfdp, int pollretval)
 {
-#else
-     int *readfds;
+  register int i;
+  register int fds_found;
+
+  for (i = fds_found = 0; i < svc_max_pollfd && fds_found < pollretval; ++i)
+    {
+      register struct pollfd *p = &pfdp[i];
+
+      if (p->fd != -1 && p->revents)
+	{
+	  /* fd has input waiting */
+	  ++fds_found;
+
+	  if (p->revents & POLLNVAL)
+	    xprt_unregister (p->fd);
+	  else
+	    svc_getreq_common (p->fd);
+	}
+    }
+}
+
+
+void
+svc_getreq_common (const int fd)
 {
-  int readfds_local = *readfds;
-#endif /* def FD_SETSIZE */
   enum xprt_stat stat;
   struct rpc_msg msg;
-  int prog_found;
-  u_long low_vers;
-  u_long high_vers;
-  struct svc_req r;
   register SVCXPRT *xprt;
-  register u_long mask;
-  register int bit;
-  register u_int32_t *maskp;
-  register int setsize;
-  register int sock;
   char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE];
   msg.rm_call.cb_cred.oa_base = cred_area;
   msg.rm_call.cb_verf.oa_base = &(cred_area[MAX_AUTH_BYTES]);
-  r.rq_clntcred = &(cred_area[2 * MAX_AUTH_BYTES]);
 
+  xprt = xports[fd];
+  /* Do we control fd? */
+  if (xprt == NULL)
+     return;
 
-#ifdef FD_SETSIZE
-  setsize = _rpc_dtablesize ();
-  maskp = (u_int32_t *) readfds->fds_bits;
-  for (sock = 0; sock < setsize; sock += 32)
-    {
-      for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
-	{
-	  /* sock has input waiting */
-	  xprt = xports[sock + bit - 1];
-#else
-  for (sock = 0; readfds_local != 0; sock++, readfds_local >>= 1)
+  /* now receive msgs from xprtprt (support batch calls) */
+  do
     {
-      if ((readfds_local & 1) != 0)
+      if (SVC_RECV (xprt, &msg))
 	{
-	  /* sock has input waiting */
-	  xprt = xports[sock];
-#endif /* def FD_SETSIZE */
-	  if (xprt == NULL)
-	    /* But do we control sock? */
-	    continue;
-
-	  /* now receive msgs from xprtprt (support batch calls) */
-	  do
+	  /* now find the exported program and call it */
+	  struct svc_callout *s;
+	  struct svc_req r;
+	  enum auth_stat why;
+	  rpcvers_t low_vers;
+	  rpcvers_t high_vers;
+	  int prog_found;
+
+	  r.rq_clntcred = &(cred_area[2 * MAX_AUTH_BYTES]);
+	  r.rq_xprt = xprt;
+	  r.rq_prog = msg.rm_call.cb_prog;
+	  r.rq_vers = msg.rm_call.cb_vers;
+	  r.rq_proc = msg.rm_call.cb_proc;
+	  r.rq_cred = msg.rm_call.cb_cred;
+
+	  /* first authenticate the message */
+	  /* Check for null flavor and bypass these calls if possible */
+
+	  if (msg.rm_call.cb_cred.oa_flavor == AUTH_NULL)
 	    {
-	      if (SVC_RECV (xprt, &msg))
-		{
+	      r.rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor;
+	      r.rq_xprt->xp_verf.oa_length = 0;
+	    }
+	  else if ((why = _authenticate (&r, &msg)) != AUTH_OK)
+	    {
+	      svcerr_auth (xprt, why);
+	      goto call_done;
+	    }
+
+	  /* now match message with a registered service */
+	  prog_found = FALSE;
+	  low_vers = 0 - 1;
+	  high_vers = 0;
 
-		  /* now find the exported program and call it */
-		  register struct svc_callout *s;
-		  enum auth_stat why;
-
-		  r.rq_xprt = xprt;
-		  r.rq_prog = msg.rm_call.cb_prog;
-		  r.rq_vers = msg.rm_call.cb_vers;
-		  r.rq_proc = msg.rm_call.cb_proc;
-		  r.rq_cred = msg.rm_call.cb_cred;
-		  /* first authenticate the message */
-		  if ((why = _authenticate (&r, &msg)) != AUTH_OK)
+	  for (s = svc_head; s != NULL_SVC; s = s->sc_next)
+	    {
+	      if (s->sc_prog == r.rq_prog)
+		{
+		  if (s->sc_vers == r.rq_vers)
 		    {
-		      svcerr_auth (xprt, why);
+		      (*s->sc_dispatch) (&r, xprt);
 		      goto call_done;
 		    }
-		  /* now match message with a registered service */
-		  prog_found = FALSE;
-		  low_vers = 0 - 1;
-		  high_vers = 0;
-		  for (s = svc_head; s != NULL_SVC; s = s->sc_next)
-		    {
-		      if (s->sc_prog == r.rq_prog)
-			{
-			  if (s->sc_vers == r.rq_vers)
-			    {
-			      (*s->sc_dispatch) (&r, xprt);
-			      goto call_done;
-			    }	/* found correct version */
-			  prog_found = TRUE;
-			  if (s->sc_vers < low_vers)
-			    low_vers = s->sc_vers;
-			  if (s->sc_vers > high_vers)
-			    high_vers = s->sc_vers;
-			}	/* found correct program */
-		    }
-		  /*
-		   * if we got here, the program or version
-		   * is not served ...
-		   */
-		  if (prog_found)
-		    svcerr_progvers (xprt, low_vers, high_vers);
-		  else
-		    svcerr_noprog (xprt);
-		  /* Fall through to ... */
-		}
-	    call_done:
-	      if ((stat = SVC_STAT (xprt)) == XPRT_DIED)
-		{
-		  SVC_DESTROY (xprt);
-		  break;
+		  /* found correct version */
+		  prog_found = TRUE;
+		  if (s->sc_vers < low_vers)
+		    low_vers = s->sc_vers;
+		  if (s->sc_vers > high_vers)
+		    high_vers = s->sc_vers;
 		}
+	      /* found correct program */
 	    }
-	  while (stat == XPRT_MOREREQS);
+	  /* if we got here, the program or version
+	     is not served ... */
+	  if (prog_found)
+	    svcerr_progvers (xprt, low_vers, high_vers);
+	  else
+	    svcerr_noprog (xprt);
+	  /* Fall through to ... */
+	}
+    call_done:
+      if ((stat = SVC_STAT (xprt)) == XPRT_DIED)
+	{
+	  SVC_DESTROY (xprt);
+	  break;
 	}
     }
+  while (stat == XPRT_MOREREQS);
 }
diff --git a/sunrpc/svc_run.c b/sunrpc/svc_run.c
index 799c0125d6..e6ffb0f027 100644
--- a/sunrpc/svc_run.c
+++ b/sunrpc/svc_run.c
@@ -1,8 +1,3 @@
-/* @(#)svc_run.c	2.1 88/07/29 4.0 RPCSRC */
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro";
-#endif
-
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -31,60 +26,58 @@ static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro";
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
-
 /*
  * This is the rpc server side idle loop
  * Wait for input, call server program.
  */
+
 #include <errno.h>
+#include <unistd.h>
 #include <libintl.h>
+#include <sys/poll.h>
 #include <rpc/rpc.h>
 
-static int svc_stop;
-
 /* This function can be used as a signal handler to terminate the
    server loop.  */
 void
 svc_exit (void)
 {
-  svc_stop = 1;
+  free (svc_pollfd);
+  svc_pollfd = NULL;
+  svc_max_pollfd = 0;
 }
 
 void
 svc_run (void)
 {
-#ifdef FD_SETSIZE
-  fd_set readfds;
-#else
-  int readfds;
-#endif /* def FD_SETSIZE */
-
-  svc_stop = 0;
+  int i;
 
   for (;;)
     {
-      if (svc_stop)
+      struct pollfd *my_pollfd;
+
+      if (svc_max_pollfd == 0 && svc_pollfd == NULL)
 	return;
 
-#ifdef FD_SETSIZE
-      readfds = svc_fdset;
-#else
-      readfds = svc_fds;
-#endif /* def FD_SETSIZE */
-      switch (__select (_rpc_dtablesize (), &readfds, (fd_set *)NULL,
-			(fd_set *)NULL, (struct timeval *) 0))
+      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, -1))
 	{
 	case -1:
 	  if (errno == EINTR)
-	    {
-	      continue;
-	    }
-	  perror (_("svc_run: - select failed"));
+	    continue;
+	  perror (_("svc_run: - poll failed"));
 	  return;
 	case 0:
 	  continue;
 	default:
-	  svc_getreqset (&readfds);
+	  svc_getreq_poll (my_pollfd, i);
 	}
     }
 }