summary refs log tree commit diff
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
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.
-rw-r--r--ChangeLog50
-rw-r--r--Makerules3
-rw-r--r--include/sys/sysinfo.h18
-rw-r--r--libio/clearerr.c4
-rw-r--r--libio/feof.c5
-rw-r--r--libio/ferror.c5
-rw-r--r--libio/fputc.c5
-rw-r--r--libio/getc.c6
-rw-r--r--libio/getchar.c5
-rw-r--r--libio/iofflush.c4
-rw-r--r--libio/putc.c5
-rw-r--r--libio/putchar.c5
-rw-r--r--manual/time.texi7
-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
-rw-r--r--sysdeps/generic/sys/sysinfo.h6
-rw-r--r--sysdeps/unix/sysv/linux/alpha/getsysstats.c54
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c69
-rw-r--r--sysdeps/unix/sysv/linux/sys/sysinfo.h6
23 files changed, 505 insertions, 339 deletions
diff --git a/ChangeLog b/ChangeLog
index 58256b584c..37eb4ad5c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,53 @@
+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.
+
 1999-07-30  Ulrich Drepper  <drepper@cygnus.com>
 
 	* configure.in: Add test for local label subtraction.
diff --git a/Makerules b/Makerules
index 90b05870aa..4d6a48742c 100644
--- a/Makerules
+++ b/Makerules
@@ -269,7 +269,8 @@ ifdef sysd-dirs-done
 ifeq ($(versioning),yes)
 -include $(common-objpfx)sysd-versions
 $(addprefix $(common-objpfx),$(version-maps)): $(common-objpfx)sysd-versions
-common-generated += $(version-maps) sysd-versions Versions.all
+common-generated += $(version-maps)
+postclean-generated += sysd-versions Versions.all
 
 ifndef avoid-generated
 ifneq ($(sysd-versions-subdirs),$(all-subdirs) $(config-sysdirs))
diff --git a/include/sys/sysinfo.h b/include/sys/sysinfo.h
new file mode 100644
index 0000000000..9d1549d225
--- /dev/null
+++ b/include/sys/sysinfo.h
@@ -0,0 +1,18 @@
+#ifndef _SYS_SYSINFO_H
+#include_next <sys/sysinfo.h>
+
+/* Now we define the internal interface.  */
+
+/* Return number of configured processors.  */
+extern int __get_nprocs_conf __P ((void));
+
+/* Return number of available processors.  */
+extern int __get_nprocs __P ((void));
+
+/* Return number of physical pages of memory in the system.  */
+extern int __get_phys_pages __P ((void));
+
+/* Return number of available physical pages of memory in the system.  */
+extern int __get_avphys_pages __P ((void));
+
+#endif /* sys/sysinfo.h */
diff --git a/libio/clearerr.c b/libio/clearerr.c
index 4776250ff8..3831c1cdae 100644
--- a/libio/clearerr.c
+++ b/libio/clearerr.c
@@ -28,3 +28,7 @@ clearerr (fp)
   _IO_clearerr (fp);
   _IO_funlockfile (fp);
 }
+
+#if defined weak_alias && !defined _IO_MTSAFE_IO
+weak_alias (clearerr, clearerr_unlocked)
+#endif
diff --git a/libio/feof.c b/libio/feof.c
index d06de044fb..74074263ad 100644
--- a/libio/feof.c
+++ b/libio/feof.c
@@ -40,4 +40,9 @@ _IO_feof (fp)
 
 #ifdef weak_alias
 weak_alias (_IO_feof, feof)
+
+#ifndef _IO_MTSAFE_IO
+#undef feof_unlocked
+weak_alias (_IO_feof, feof_unlocked)
+#endif
 #endif
diff --git a/libio/ferror.c b/libio/ferror.c
index 855627ade6..b9a3ee8ee1 100644
--- a/libio/ferror.c
+++ b/libio/ferror.c
@@ -40,4 +40,9 @@ _IO_ferror (fp)
 
 #ifdef weak_alias
 weak_alias (_IO_ferror, ferror)
+
+#ifndef _IO_MTSAFE_IO
+#undef ferror_unlocked
+weak_alias (_IO_ferror, ferror_unlocked)
+#endif
 #endif
diff --git a/libio/fputc.c b/libio/fputc.c
index 3ec8b693e9..4684af03e4 100644
--- a/libio/fputc.c
+++ b/libio/fputc.c
@@ -40,3 +40,8 @@ fputc (c, fp)
   _IO_cleanup_region_end (0);
   return result;
 }
+
+#if defined weak_alias && !defined _IO_MTSAFE_IO
+#undef fputc_unlocked
+weak_alias (fputc, fputc_unlocked)
+#endif
diff --git a/libio/getc.c b/libio/getc.c
index 6ccef9960d..b58ea99d1d 100644
--- a/libio/getc.c
+++ b/libio/getc.c
@@ -47,4 +47,10 @@ _IO_getc (fp)
 #ifdef weak_alias
 weak_alias (_IO_getc, getc)
 weak_alias (_IO_getc, fgetc)
+
+#ifndef _IO_MTSAFE_IO
+#undef getc_unlocked
+weak_alias (_IO_getc, getc_unlocked)
+weak_alias (_IO_getc, fgetc_unlocked)
+#endif
 #endif
diff --git a/libio/getchar.c b/libio/getchar.c
index 80c297f0ae..a7a1072027 100644
--- a/libio/getchar.c
+++ b/libio/getchar.c
@@ -40,3 +40,8 @@ getchar ()
   _IO_cleanup_region_end (0);
   return result;
 }
+
+#if defined weak_alias && !defined _IO_MTSAFE_IO
+#undef getchar_unlocked
+weak_alias (getchar, getchar_unlocked)
+#endif
diff --git a/libio/iofflush.c b/libio/iofflush.c
index 724ff26ac8..126947aace 100644
--- a/libio/iofflush.c
+++ b/libio/iofflush.c
@@ -47,4 +47,8 @@ _IO_fflush (fp)
 
 #ifdef weak_alias
 weak_alias (_IO_fflush, fflush)
+
+#ifndef _IO_MTSAFE_IO
+weak_alias (_IO_fflush, fflush_unlocked)
+#endif
 #endif
diff --git a/libio/putc.c b/libio/putc.c
index 72cd2a1a05..0236224cde 100644
--- a/libio/putc.c
+++ b/libio/putc.c
@@ -40,4 +40,9 @@ _IO_putc (c, fp)
 
 #ifdef weak_alias
 weak_alias (_IO_putc, putc)
+
+#ifndef _IO_MTSAFE_IO
+#undef putc_unlocked
+weak_alias (_IO_putc, putc_unlocked)
+#endif
 #endif
diff --git a/libio/putchar.c b/libio/putchar.c
index 143796d20c..e11e3d8f75 100644
--- a/libio/putchar.c
+++ b/libio/putchar.c
@@ -34,3 +34,8 @@ putchar (c)
   _IO_cleanup_region_end (0);
   return result;
 }
+
+#if defined weak_alias && !defined _IO_MTSAFE_IO
+#undef putchar_unlocked
+weak_alias (putchar, putchar_unlocked)
+#endif
diff --git a/manual/time.texi b/manual/time.texi
index 7d5cfdaa65..543042acc6 100644
--- a/manual/time.texi
+++ b/manual/time.texi
@@ -95,11 +95,16 @@ to @code{double}, as in the example above, makes sure that operations
 such as arithmetic and printing work properly and consistently no matter
 what the underlying representation is.
 
+Note that the clock can wrap around.  On a 32bit system with
+@code{CLOCKS_PER_SEC} set to one million a wrap around happens after
+around 36 minutes.
+
 @comment time.h
 @comment ISO
 @deftypevr Macro int CLOCKS_PER_SEC
 The value of this macro is the number of clock ticks per second measured
-by the @code{clock} function.
+by the @code{clock} function.  POSIX requires that this value is one
+million independend of the actual resolution.
 @end deftypevr
 
 @comment time.h
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);
 	}
     }
 }
diff --git a/sysdeps/generic/sys/sysinfo.h b/sysdeps/generic/sys/sysinfo.h
index 8100b0d056..d79087b80a 100644
--- a/sysdeps/generic/sys/sysinfo.h
+++ b/sysdeps/generic/sys/sysinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -22,20 +22,16 @@
 #include <features.h>
 
 /* Return number of configured processors.  */
-extern int __get_nprocs_conf __P ((void));
 extern int get_nprocs_conf __P ((void));
 
 /* Return number of available processors.  */
-extern int __get_nprocs __P ((void));
 extern int get_nprocs __P ((void));
 
 
 /* Return number of physical pages of memory in the system.  */
-extern int __get_phys_pages __P ((void));
 extern int get_phys_pages __P ((void));
 
 /* Return number of available physical pages of memory in the system.  */
-extern int __get_avphys_pages __P ((void));
 extern int get_avphys_pages __P ((void));
 
 #endif	/* sys/sysinfo.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/getsysstats.c b/sysdeps/unix/sysv/linux/alpha/getsysstats.c
new file mode 100644
index 0000000000..8588903c89
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/getsysstats.c
@@ -0,0 +1,54 @@
+/* Determine various system internal values, Linux/Alpha version.
+   Copyright (C) 1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Schwab <schwab@suse.de>
+
+   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
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We need to define a special parser for /proc/cpuinfo.  */
+#define GET_NPROCS_PARSER(FP, BUFFER, RESULT)				  \
+  do									  \
+    {									  \
+      (RESULT) = 0;							  \
+      /* Find the line that contains the information about the number of  \
+	 active cpus.  We don't have to fear extremely long lines since	  \
+	 the kernel will not generate them.  8192 bytes are really	  \
+	 enough.  */							  \
+      while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL)	  \
+	if (sscanf (BUFFER, "CPUs probed %*d active %d", &(RESULT)) == 1) \
+	  break;							  \
+    }									  \
+  while (0)
+
+
+/* On the Alpha we can distinguish between the number of configured and
+   active cpus.  */
+#define GET_NPROCS_CONF_PARSER(FP, BUFFER, RESULT)			 \
+  do									 \
+    {									 \
+      (RESULT) = 0;							 \
+      /* Find the line that contains the information about the number of \
+	 probed cpus.  We don't have to fear extremely long lines since	 \
+	 the kernel will not generate them.  8192 bytes are really	 \
+	 enough.  */							 \
+      while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL)	 \
+	if (sscanf (buffer, "CPUs probed %d", &(RESULT)) == 1)		 \
+	  break;							 \
+    }									 \
+  while (0)
+
+#include <sysdeps/unix/sysv/linux/getsysstats.c>
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index 58f55ac99c..be23753d2f 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -1,5 +1,5 @@
 /* Determine various system internal values, Linux version.
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -67,6 +67,25 @@ get_proc_path (char *buffer, size_t bufsize)
 
    But not all systems have support for the /proc filesystem.  If it
    is not available we simply return 1 since there is no way.  */
+
+/* Other architectures use different formats for /proc/cpuinfo.  This
+   provides a hook for alternative parsers.  */
+#ifndef GET_NPROCS_PARSER
+# define GET_NPROCS_PARSER(FP, BUFFER, RESULT)				\
+  do									\
+    {									\
+      (RESULT) = 0;							\
+      /* Read all lines and count the lines starting with the string	\
+	 "processor".  We don't have to fear extremely long lines since	\
+	 the kernel will not generate them.  8192 bytes are really	\
+	 enough.  */							\
+      while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL)	\
+	if (strncmp (BUFFER, "processor", 9) == 0)			\
+	  ++(RESULT);							\
+    }									\
+  while (0)
+#endif
+
 int
 __get_nprocs ()
 {
@@ -89,15 +108,7 @@ __get_nprocs ()
       fp = fopen (proc_cpuinfo, "r");
       if (fp != NULL)
 	{
-	  result = 0;
-	  /* Read all lines and count the lines starting with the
-	     string "processor".  We don't have to fear extremely long
-	     lines since the kernel will not generate them.  8192
-	     bytes are really enough.  */
-	  while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
-	    if (strncmp (buffer, "processor", 9) == 0)
-	      ++result;
-
+	  GET_NPROCS_PARSER (fp, buffer, result);
 	  fclose (fp);
 	}
     }
@@ -106,12 +117,46 @@ __get_nprocs ()
 }
 weak_alias (__get_nprocs, get_nprocs)
 
+
+#ifdef GET_NPROCS_CONF_PARSER
+/* On some architectures it is possible to distinguish between configured
+   and active cpus.  */
+int
+__get_nprocs_conf ()
+{
+  FILE *fp;
+  char buffer[8192];
+  char *proc_path;
+  int result = 1;
+
+  /* XXX Here will come a test for the new system call.  */
+
+  /* Get mount point of proc filesystem.  */
+  proc_path = get_proc_path (buffer, sizeof buffer);
+
+  /* If we haven't found an appropriate entry return 1.  */
+  if (proc_path != NULL)
+    {
+      char *proc_cpuinfo = alloca (strlen (proc_path) + sizeof ("/cpuinfo"));
+      __stpcpy (__stpcpy (proc_cpuinfo, proc_path), "/cpuinfo");
+
+      fp = fopen (proc_cpuinfo, "r");
+      if (fp != NULL)
+	{
+	  GET_NPROCS_CONF_PARSER (fp, buffer, result);
+	  fclose (fp);
+	}
+    }
+
+  return result;
+}
+#else
 /* As far as I know Linux has no separate numbers for configured and
    available processors.  So make the `get_nprocs_conf' function an
    alias.  */
 strong_alias (__get_nprocs, __get_nprocs_conf)
-weak_alias (__get_nprocs, get_nprocs_conf)
-
+#endif
+weak_alias (__get_nprocs_conf, get_nprocs_conf)
 
 /* General function to get information about memory status from proc
    filesystem.  */
diff --git a/sysdeps/unix/sysv/linux/sys/sysinfo.h b/sysdeps/unix/sysv/linux/sys/sysinfo.h
index dc435d6651..2c17cf2a69 100644
--- a/sysdeps/unix/sysv/linux/sys/sysinfo.h
+++ b/sysdeps/unix/sysv/linux/sys/sysinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -31,20 +31,16 @@ extern int sysinfo __P ((struct sysinfo *__info));
 
 
 /* Return number of configured processors.  */
-extern int __get_nprocs_conf __P ((void));
 extern int get_nprocs_conf __P ((void));
 
 /* Return number of available processors.  */
-extern int __get_nprocs __P ((void));
 extern int get_nprocs __P ((void));
 
 
 /* Return number of physical pages of memory in the system.  */
-extern int __get_phys_pages __P ((void));
 extern int get_phys_pages __P ((void));
 
 /* Return number of available physical pages of memory in the system.  */
-extern int __get_avphys_pages __P ((void));
 extern int get_avphys_pages __P ((void));
 
 __END_DECLS