diff src/getloadavg.c @ 5494:861f2601a38b

Sync s/ files with GNU 23.1.92, delete obsolete stuff, simplify other stuff --- ChangeLog 2010-02-20 Ben Wing <ben@xemacs.org> * configure: * configure.ac (XE_EXPAND_VARIABLE): * configure.ac (TAB): irix6-0.h renamed to irix6-5.h; sco7.h deleted. bsd4-3.h renamed to bsd-common.h. Simplify setting machine= for intel386, mips. Put back linux.h. Incorporate some stuff about debug/optimization flags in irix6-5.h into configure.ac. Add a comment about LCC stuff with optimization flags that should be fixed up. --- src/ChangeLog 2010-02-20 Ben Wing <ben@xemacs.org> * sysdep.c: * sysdep.c (qxe_reliable_signal): * sysdep.c (retry_open_1): * sysdep.c (retry_close): * sysdep.c (retry_read_1): * sysdep.c (retry_write_1): * sysdep.c (retry_fopen): * sysdep.c (retry_fclose): * sysdep.c (retry_fread): * sysdep.c (retry_fwrite): Remove conditionalization on INTERRUPTIBLE_IO, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE -- always check for EINTR as there's no harm in it. Remove old #if 0'ed out SA_RESTART code. Use manifest constant IRIX6_5 instead of IRIX. * Makefile.in.in: * dired.c: * dired.c (Ffile_attributes): Use manifest constant IRIX6_5 instead of IRIX. Eliminate constant BSD4_2, use BSD4_3 instead. * getloadavg.c: * getloadavg.c (getloadavg): * getloadavg.c (LDAV_PRIVILEGED): * getloadavg.c (LDAV_DONE): Sync with GNU 23.1.92. 2010-02-20 Ben Wing <ben@xemacs.org> * s/README: * s/aix4-2.h: * s/aix4-2.h (MAIL_USE_LOCKF): * s/bsd-common.h: * s/freebsd.h: * s/freebsd.h (Carey): * s/freebsd.h (or): * s/gnu.h: * s/gnu.h (DATA_START): * s/hpux11-shr.h: * s/hpux11.h: * s/hpux11.h (random): * s/irix6-5.h: * s/linux.h: * s/mach-bsd4-3.h: * s/netbsd.h: * s/netbsd.h (or): * s/netbsd.h (A_TEXT_OFFSET): * s/netbsd.h (NO_MATHERR): * s/openbsd.h: * s/sol2.h: * s/usg5-4-2.h: * s/usg5-4.h: * s/usg5-4.h (or): * s/usg5-4.h (ORDINARY_LINK): Sync with GNU 23.1.92. Put back linux.h. Rename: bsd4-3.h -> bsd-common.h; irix6-0.h -> irix6-5.h. Delete: template.h (useless). Delete a whole bunch of obsolete stuff in sol2.h, linux.h, freebsd.h -- assume anything over 10 years old is sufficiently obsolete to be deleted. Remove LIBS_DEBUG, C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, KERNEL_FILE, LDAV_SYMBOL, most remaining PTY stuff, remaining TERMINFO/TERMCAP stuff. Update README appropriately. Remove stuff in hpux11-shr.h duplicated in hpux11.h. Remove sco7.h, identical with usg5-4-2.h. Remove unused POSIX flag, BROKEN_TIOC*, NO_SIOCTL_H. 2010-02-20 Ben Wing <ben@xemacs.org> * m/arm.h: * m/hp800.h: * m/intel386.h: * m/mips.h: * m/powerpc.h: * m/sparc.h: * m/template.h: Temporarily ifdef out all defines involving load-average stuff -- using define ENABLE_SM_FILE_DECLS_OF_LOADAVG_STUFF, which is not defined. I'm pretty sure getloadavg.c will take care of defining stuff properly on all systems without the need to duplicate the info in m/*. --ben Delete LIBS_TERMCAP; configure auto-handles this. Delete extra stuff in hp800.h. Delete C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, LDAV_SYMBOL; incorporate some stuff into configure.ac.
author Ben Wing <ben@xemacs.org>
date Sat, 20 Feb 2010 06:03:00 -0600
parents aa5ed11f473b
children 1f0b15040456
line wrap: on
line diff
--- a/src/getloadavg.c	Fri Feb 19 22:41:03 2010 -0600
+++ b/src/getloadavg.c	Sat Feb 20 06:03:00 2010 -0600
@@ -1,6 +1,10 @@
 /* Get the system load averages.
-   Copyright (C) 1985, 86, 87, 88, 89, 91, 92, 93, 1994, 1995
-	Free Software Foundation, Inc.
+   Copyright (C) 1985-1989, 1991-1995, 1997, 2001-2008
+       Free Software Foundation, Inc.
+   Copyright (C) 2010 Ben Wing.
+
+   NOTE: The canonical source of this file is maintained with gnulib.
+   Bugs can be reported to bug-gnulib@gnu.org.
 
 This file is part of XEmacs.
 
@@ -19,20 +23,38 @@
 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
+/* Synced up with: FSF 23.1.92. */
+/* Synced by: Ben Wing. */
+
 /* Compile-time symbols that this file uses:
 
+   HAVE_SYS_PSTAT_H		Defined if the pstat() function is available
+				(HPUX only); the GNU version uses
+                                pstat_getdynamic() and HAVE_PSTAT_GETDYNAMIC.
+
+				[[ GNU says: The best way to get the
+				definition is through the AC_FUNC_GETLOADAVG
+				macro that comes with autoconf 2.13 or newer.
+				If that isn't an option, then just put
+				AC_CHECK_FUNCS(pstat_getdynamic) in your
+				configure.in file. ]] But we don't do this,
+				apparently we do the equivalent of
+				AC_FUNC_GETLOADAVG dynamically.
+
    FIXUP_KERNEL_SYMBOL_ADDR()	Adjust address in returned struct nlist.
    KERNEL_FILE			Pathname of the kernel to nlist.
    LDAV_CVT()			Scale the load average from the kernel.
 				Returns a double.
    LDAV_SYMBOL			Name of kernel symbol giving load average.
    LOAD_AVE_TYPE		Type of the load average array in the kernel.
-				Must be defined; otherwise, no load average
-				is available.
+				Must be defined; or we have libkstat;
+				otherwise, no load average is available.
    NLIST_STRUCT			Include nlist.h, not a.out.h, and
 				the nlist n_name element is a pointer,
 				not an array.
    LINUX_LDAV_FILE		[__linux__]: File containing load averages.
+   HAVE_LOCALE_H                locale.h is available.
+   HAVE_SETLOCALE               The `setlocale' function is available.
 
    Specific system predefines this file uses, aside from setting
    default values if not emacs:
@@ -55,12 +77,19 @@
 
 /* This should always be first.  */
 #ifdef HAVE_CONFIG_H
-#include <config.h>
+# include <config.h>
 #endif
 
 #include "lisp.h"
 #include "sysfile.h" /* for encapsulated open, close, read, write */
 
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+#ifndef HAVE_SETLOCALE
+# define setlocale(Category, Locale) /* empty */
+#endif
+
 #ifndef HAVE_GETLOADAVG
 
 /* The existing Emacs configuration files define a macro called
@@ -73,248 +102,253 @@
    LOAD_AVE_CVT, but future machine config files should just define
    LDAV_CVT directly.  */
 
-#if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT)
-#define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
-#endif
+# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT)
+#  define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
+# endif
 
 #if defined (HAVE_KSTAT_H)
 #include <kstat.h>
 #endif /* HAVE_KSTAT_H */
 
+/* Same issues as for NeXT apply to the HURD-based GNU system.  */
+# ifdef __GNU__
+#  undef BSD
+#  undef FSCALE
+# endif /* __GNU__ */
+
 /* Set values that are different from the defaults, which are
    set a little farther down with #ifndef.  */
 
 
 /* Some shorthands.  */
 
-#if defined (HPUX) && !defined (hpux)
-#define hpux
-#endif
+# if defined (HPUX) && !defined (hpux)
+#  define hpux
+# endif
+
+# if defined (__hpux) && !defined (hpux)
+#  define hpux
+# endif
 
-#if (defined(sun) && defined(SVR4)) || defined (SOLARIS2)
-#define SUNOS_5
-#endif
+# if defined (__sun) && !defined (sun)
+#  define sun
+# endif
+
+# if defined (__SVR4) && !defined (SVR4)
+#  define SVR4
+# endif
 
-#if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
-#define OSF_ALPHA
-#include <netdb.h>
-#include <netinet/in.h>		/* Needed for Digital UNIX V3 */
-#include <net/proto_net.h>
-#include <sys/table.h>
-#endif
+# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2)
+#  define SUNOS_5
+# endif
+
+# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
+#  define OSF_ALPHA
+#  /* XEmacs: First three below from FSF 23.1.92. */
+#  include <sys/mbuf.h>
+#  include <sys/socket.h>
+#  include <net/route.h>
+#  include <netdb.h>
+#  include <netinet/in.h>		/* Needed for Digital UNIX V3 */
+#  include <net/proto_net.h>
+#  include <sys/table.h>
+# endif
 
 #if defined (__osf__) && (defined (mips) || defined (__mips__))
-#define OSF_MIPS
-#include <sys/table.h>
+# define OSF_MIPS
+# include <sys/table.h>
 #endif
 
 
 /* VAX C can't handle multi-line #ifs, or lines longer than 256 chars.  */
-#ifndef LOAD_AVE_TYPE
+# ifndef LOAD_AVE_TYPE
 
-#ifdef sun
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef sun
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef decstation
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef decstation
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef sgi
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef sgi
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef SVR4
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef SVR4
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef sony_news
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef sony_news
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef OSF_ALPHA
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef OSF_ALPHA
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#if defined (ardent) && defined (titan)
-#define LOAD_AVE_TYPE long
-#endif
+#  if defined (ardent) && defined (titan)
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#ifdef _AIX
-#define LOAD_AVE_TYPE long
-#endif
+#  ifdef _AIX
+#   define LOAD_AVE_TYPE long
+#  endif
 
-#endif /* No LOAD_AVE_TYPE.  */
+# endif /* No LOAD_AVE_TYPE.  */
 
-#ifdef OSF_ALPHA
+# ifdef OSF_ALPHA
 /* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
    according to ghazi@noc.rutgers.edu.  */
-#undef FSCALE
-#define FSCALE 1024.0
-#endif
+#  undef FSCALE
+#  define FSCALE 1024.0
+# endif
 
-#ifndef	FSCALE
+# ifndef	FSCALE
 
 /* SunOS and some others define FSCALE in sys/param.h.  */
 
-#if defined(MIPS) || defined(SVR4) || defined(decstation)
-#define FSCALE 256
-#endif
+#  if defined(MIPS) || defined(SVR4) || defined(decstation)
+#   define FSCALE 256
+#  endif
 
-#if defined (sgi)
+#  if defined (sgi)
 /* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
    above under #ifdef MIPS.  But we want the sgi value.  */
-#undef FSCALE
-#define	FSCALE 1000.0
-#endif
-
-#if defined (ardent) && defined (titan)
-#define FSCALE 65536.0
-#endif
+#   undef FSCALE
+#   define FSCALE 1000.0
+#  endif
 
-#ifdef _AIX
-#define FSCALE 65536.0
-#endif
+#  if defined (ardent) && defined (titan)
+#   define FSCALE 65536.0
+#  endif
 
-#endif	/* Not FSCALE.  */
-
-#if !defined (LDAV_CVT) && defined (FSCALE)
-#define	LDAV_CVT(n) (((double) (n)) / FSCALE)
-#endif
+#  ifdef _AIX
+#   define FSCALE 65536.0
+#  endif
 
-/* VAX C can't handle multi-line #ifs, or lines longer that 256 characters.  */
-#ifndef NLIST_STRUCT
+# endif	/* Not FSCALE.  */
 
-#ifdef sun
-#define NLIST_STRUCT
-#endif
+# if !defined (LDAV_CVT) && defined (FSCALE)
+#  define LDAV_CVT(n) (((double) (n)) / FSCALE)
+# endif
 
-#ifdef decstation
-#define NLIST_STRUCT
-#endif
-
-#ifdef hpux
-#define NLIST_STRUCT
-#endif
-
-#ifdef sgi
-#define NLIST_STRUCT
+#if 0 /* XEmacs change ...  we check for nlist.h during configure and
+         automatically set NLIST_STRUCT if so; we have no HAVE_NLIST_H. */
+# ifndef NLIST_STRUCT
+#  if HAVE_NLIST_H
+#   define NLIST_STRUCT
+#  endif
+# endif
 #endif
 
-#ifdef SVR4
-#define NLIST_STRUCT
-#endif
-
-#ifdef sony_news
-#define NLIST_STRUCT
-#endif
-
-#ifdef OSF_ALPHA
-#define NLIST_STRUCT
-#endif
+# if defined(sgi) || (defined(mips) && !defined(BSD))
+#  define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
+# endif
 
-#if defined (ardent) && defined (titan)
-#define NLIST_STRUCT
-#endif
-
-#ifdef butterfly
-#define NLIST_STRUCT
-#endif
-
-#ifdef _AIX
-#define NLIST_STRUCT
-#endif
+# if !defined (KERNEL_FILE) && defined (hpux)
+#  define KERNEL_FILE "/hp-ux"
+# endif
 
-#endif /* defined (NLIST_STRUCT) */
-
-
-#if defined(sgi) || (defined(mips) && !defined(BSD))
-#define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
-#endif
-
-#if !defined (KERNEL_FILE) && defined (hpux)
-#define KERNEL_FILE "/hp-ux"
-#endif
+# if !defined(KERNEL_FILE) && (defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan)))
+#  define KERNEL_FILE "/unix"
+# endif
 
-#if !defined(KERNEL_FILE) && (defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || defined(SVR4) || (defined (ardent) && defined (titan)))
-#define KERNEL_FILE "/unix"
-#endif
+# if !defined(LDAV_SYMBOL) && (defined(hpux) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX))
+#  define LDAV_SYMBOL "avenrun"
+# endif
 
-#if !defined(LDAV_SYMBOL) && (defined(hpux) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX))
-#define LDAV_SYMBOL "avenrun"
-#endif
+# ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
 
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <stdio.h>
+# include <stdio.h>
 
 /* LOAD_AVE_TYPE should only get defined if we're going to use the
    nlist method.  */
-#if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL))
-#define LOAD_AVE_TYPE double
-#endif
+# if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL))
+#  define LOAD_AVE_TYPE double
+# endif
+
+# ifdef LOAD_AVE_TYPE
 
-#ifdef LOAD_AVE_TYPE
+#  ifndef __linux__
+#   ifndef NLIST_STRUCT
+#    include <a.out.h>
+#   else /* NLIST_STRUCT */
+#    include <nlist.h>
+#   endif /* NLIST_STRUCT */
 
-#ifndef NLIST_STRUCT
-#include <a.out.h>
-#else /* NLIST_STRUCT */
-#include <nlist.h>
-#endif /* NLIST_STRUCT */
+#   ifdef SUNOS_5
+#    include <fcntl.h>
+#    include <kvm.h>
+#    include <kstat.h>
+#   endif
 
-#ifdef SUNOS_5
-#include <fcntl.h>
-#include <kvm.h>
-#endif
+   /* XEmacs: GNU says: defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) */
+#   if defined (HAVE_SYS_PSTAT_H)
+#    include <sys/pstat.h>
+#   endif /* HAVE_SYS_PSTAT_H (on HPUX) */
+
+#   ifndef KERNEL_FILE
+#    define KERNEL_FILE "/vmunix"
+#   endif /* KERNEL_FILE */
 
-#ifndef KERNEL_FILE
-#define KERNEL_FILE "/vmunix"
-#endif /* KERNEL_FILE */
+#   ifndef LDAV_SYMBOL
+#    define LDAV_SYMBOL "_avenrun"
+#   endif /* LDAV_SYMBOL */
+#  endif /* __linux__ */
 
-#ifndef LDAV_SYMBOL
-#define LDAV_SYMBOL "_avenrun"
-#endif /* LDAV_SYMBOL */
+#  ifndef LDAV_CVT
+#   define LDAV_CVT(n) ((double) (n))
+#  endif /* !LDAV_CVT */
+
+# endif /* LOAD_AVE_TYPE */
 
-#ifndef LDAV_CVT
-#define LDAV_CVT(n) ((double) (n))
-#endif /* !LDAV_CVT */
-
-#endif /* LOAD_AVE_TYPE */
+# if defined(__GNU__) && !defined (NeXT)
+/* XEmacs -- FSF added code for the HURD, which depends on some NeXT
+   code that we deleted as outdated.  We hardly care about compiling
+   on the HURD, but I'm leaving this stuff here just in case; if someone
+   wants to get this working, figure out which NeXT code needs to be
+   restored. */
+# error "Code not working currently"
+/* Note that NeXT Openstep defines __GNU__ even though it should not.  */
+/* GNU system acts much like NeXT, for load average purposes,
+   but not exactly.  */
+#  define NeXT
+#  define host_self mach_host_self
+# endif /* defined(__GNU__) && !defined (NeXT) */
 
-#ifdef sgi
-#include <sys/sysmp.h>
-#endif /* sgi */
+/* (ifdef NeXT ...  deleted) */
 
-#if defined (HAVE_SYS_PSTAT_H)
-#include <sys/pstat.h>
-#endif /* HAVE_SYS_PSTAT_H (on HPUX) */
+# ifdef sgi
+#  include <sys/sysmp.h>
+# endif /* sgi */
 
 
 /* Avoid static vars inside a function since in HPUX they dump as pure.  */
 
-#ifdef LOAD_AVE_TYPE
-/* File descriptor open to /dev/kmem */
+#if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE)
+/* File descriptor open to /dev/kmem or VMS load ave driver.  */
 static int channel;
-/* Nonzero iff channel is valid.  */
+/* Nonzero if channel is valid.  */
 static int getloadavg_initialized;
 /* Offset in kmem to seek to read load average, or 0 means invalid.  */
 static long offset;
 
-#ifndef sgi
-static struct nlist nl[2];
-#endif /* not sgi */
+#  if !defined(sgi) && !defined(__linux__)
+static struct nlist name_list[2];
+#  endif /* Not Linux or sgi */
 
-#ifdef SUNOS_5
+#  ifdef SUNOS_5
 static kvm_t *kd;
-#endif /* SUNOS_5 */
+#  endif /* SUNOS_5 */
 
 #ifndef countof
 # define countof(x) (sizeof (x) / sizeof (*(x)))
 #endif
 
-#endif /* LOAD_AVE_TYPE */
+#endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
 
 /* Put the 1 minute, 5 minute and 15 minute load averages
    into the first NELEM elements of LOADAVG.
@@ -328,87 +362,97 @@
 {
   int elem = 0;			/* Return value.  */
 
-#ifdef NO_GET_LOAD_AVG
-#define LDAV_DONE
+# ifdef NO_GET_LOAD_AVG
+#  define LDAV_DONE
   /* Set errno to zero to indicate that there was no particular error;
      this function just can't work at all on this system.  */
   errno = 0;
   elem = -2;
-#endif /* NO_GET_LOAD_AVG */
+# endif /* NO_GET_LOAD_AVG */
 
 #if ! defined (LDAV_DONE) && defined (HAVE_KSTAT_H) && defined (HAVE_LIBKSTAT)
-#define LDAV_DONE
-/* getloadavg is best implemented using kstat (kernel stats), on
-   systems (like SunOS5) that support it, since you don't need special
-   privileges to use it.
-
-   Initial implementation courtesy Zlatko Calusic <zcalusic@carnet.hr>.
-   Integrated to XEmacs by Hrvoje Niksic <hniksic@xemacs.org>.
-   Additional cleanup by Hrvoje Niksic, based on code published by
-   Casper Dik <Casper.Dik@Holland.Sun.Com>.  */
+/* Use libkstat because we don't have to be root.  */
+#  define LDAV_DONE
   kstat_ctl_t *kc;
   kstat_t *ksp;
-  static char *avestrings[] = { "avenrun_1min",
-				"avenrun_5min",
-				"avenrun_15min" };
-
-  if (nelem > countof (avestrings))
-    nelem = countof (avestrings);
+  kstat_named_t *kn;
 
   kc = kstat_open ();
-  if (!kc)
+  if (kc == 0)
     return -1;
   ksp = kstat_lookup (kc, "unix", 0, "system_misc");
-  if (!ksp)
+  if (ksp == 0 )
+    return -1;
+  if (kstat_read (kc, ksp, 0) == -1)
+    return -1;
+
+
+  kn = kstat_data_lookup (ksp, "avenrun_1min");
+  if (kn == 0)
     {
-      kstat_close (kc);
-      return -1;
+      /* Return -1 if no load average information is available.  */
+      nelem = 0;
+      elem = -1;
     }
-  if (kstat_read (kc, ksp, 0) < 0)
-    {
-      kstat_close (kc);
-      return -1;
-    }
-  for (elem = 0; elem < nelem; elem++)
+
+  if (nelem >= 1)
+    loadavg[elem++] = (double) kn->value.ul/FSCALE;
+
+  if (nelem >= 2)
     {
-      kstat_named_t *kn =
-	(kstat_named_t *) kstat_data_lookup (ksp, avestrings[elem]);
-      if (!kn)
+      kn = kstat_data_lookup (ksp, "avenrun_5min");
+      if (kn != 0)
 	{
-	  kstat_close (kc);
-	  return -1;
+	  loadavg[elem++] = (double) kn->value.ul/FSCALE;
+
+	  if (nelem >= 3)
+	    {
+	      kn = kstat_data_lookup (ksp, "avenrun_15min");
+	      if (kn != 0)
+		loadavg[elem++] = (double) kn->value.ul/FSCALE;
+	    }
 	}
-      loadavg[elem] = (double)kn->value.ul / FSCALE;
     }
+
   kstat_close (kc);
-#endif /* HAVE_KSTAT_H && HAVE_LIBKSTAT */
-
-#if !defined (LDAV_DONE) && defined (HAVE_SYS_PSTAT_H)
-#define LDAV_DONE
+# endif /* HAVE_LIBKSTAT */
+# if !defined (LDAV_DONE) && defined (HAVE_SYS_PSTAT_H)
+        /* GNU says: .... && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) */
+#  define LDAV_DONE
   /* This is totally undocumented, and is not guaranteed to work, but
      mayhap it might ....  If it does work, it will work only on HP-UX
      8.0 or later.  -- Darryl Okahata <darrylo@sr.hp.com> */
-#undef LOAD_AVE_TYPE		/* Make sure these don't exist. */
-#undef LOAD_AVE_CVT
-#undef LDAV_SYMBOL
-  struct pst_dynamic	procinfo;
-  union pstun		statbuf;
+#  undef LOAD_AVE_TYPE
+#  undef LOAD_AVE_CVT
+#  undef LDAV_SYMBOL
 
-  statbuf.pst_dynamic = &procinfo;
-  if (pstat (PSTAT_DYNAMIC, statbuf, sizeof (struct pst_dynamic), 0, 0) == -1)
-    return (-1);
-  loadavg[elem++] = procinfo.psd_avg_1_min;
-  loadavg[elem++] = procinfo.psd_avg_5_min;
-  loadavg[elem++] = procinfo.psd_avg_15_min;
-#endif	/* HPUX */
+  struct pst_dynamic dyn_info;
+#if 0 /* GNU 23.1.92 */
+  /* Use pstat_getdynamic() because we don't have to be root.  */
+  if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
+    return -1;
+#else
+  union pstun		statbuf;
+  statbuf.pst_dynamic = &dyn_info;
+  if (pstat (PSTAT_DYNAMIC, statbuf, sizeof (dyn_info), 0, 0) == -1)
+    return -1;
+#endif
+  if (nelem > 0)
+    loadavg[elem++] = dyn_info.psd_avg_1_min;
+  if (nelem > 1)
+    loadavg[elem++] = dyn_info.psd_avg_5_min;
+  if (nelem > 2)
+    loadavg[elem++] = dyn_info.psd_avg_15_min;
 
-#if !defined (LDAV_DONE) && defined (__linux__)
-#define LDAV_DONE
-#undef LOAD_AVE_TYPE
+# endif /* HAVE_SYS_PSTAT_H (GNU: hpux && HAVE_PSTAT_GETDYNAMIC) */
 
-#ifndef LINUX_LDAV_FILE
-#define LINUX_LDAV_FILE "/proc/loadavg"
-#endif
+# if !defined (LDAV_DONE) && defined (__linux__)
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
+
+#  ifndef LINUX_LDAV_FILE
+#   define LINUX_LDAV_FILE "/proc/loadavg"
+#  endif
 
   char ldavgbuf[40];
   double load_ave[3];
@@ -422,22 +466,28 @@
   if (count <= 0)
     return -1;
 
+  /* The following sscanf must use the C locale.  */
+  setlocale (LC_NUMERIC, "C");
   count = sscanf (ldavgbuf, "%lf %lf %lf",
 		  &load_ave[0], &load_ave[1], &load_ave[2]);
+  setlocale (LC_NUMERIC, "");
   if (count < 1)
     return -1;
 
   for (elem = 0; elem < nelem && elem < count; elem++)
     loadavg[elem] = load_ave[elem];
-#endif /* __linux__ */
+
+  return elem;
+
+# endif /* __linux__ */
 
-#if !defined (LDAV_DONE) && defined (__NetBSD__) || defined (__OpenBSD__)
-#define LDAV_DONE
-#undef LOAD_AVE_TYPE
+# if !defined (LDAV_DONE) && (defined (__NetBSD__) || defined (__OpenBSD__))
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
 
-#ifndef NETBSD_LDAV_FILE
-#define NETBSD_LDAV_FILE "/kern/loadavg"
-#endif
+#  ifndef NETBSD_LDAV_FILE
+#   define NETBSD_LDAV_FILE "/kern/loadavg"
+#  endif
 
   unsigned long int load_ave[3], scale;
   int count;
@@ -471,83 +521,84 @@
 
   /* UNIX-specific code -- read the average from /dev/kmem.  */
 
-#define LDAV_PRIVILEGED		/* This code requires special installation.  */
+#  define LDAV_PRIVILEGED		/* This code requires special installation.  */
 
   LOAD_AVE_TYPE load_ave[3];
 
   /* Get the address of LDAV_SYMBOL.  */
   if (offset == 0)
     {
-#ifndef sgi
-#ifndef NLIST_STRUCT
-      strcpy (nl[0].n_name, LDAV_SYMBOL);
-      strcpy (nl[1].n_name, "");
-#else /* NLIST_STRUCT */
-      nl[0].n_name = (char *) LDAV_SYMBOL;
-      nl[1].n_name = 0;
-#endif /* NLIST_STRUCT */
+#  ifndef sgi
+#   ifndef NLIST_STRUCT
+      strcpy (name_list[0].n_name, LDAV_SYMBOL);
+      strcpy (name_list[1].n_name, "");
+#   else /* NLIST_STRUCT */
+      /* #### XEmacs deletes HAVE_STRUCT_NLIST_N_UN_N_NAME code. Why? */
+      name_list[0].n_name = (char *) LDAV_SYMBOL;
+      name_list[1].n_name = 0;
+#   endif /* NLIST_STRUCT */
 
-#ifndef SUNOS_5
+#   ifndef SUNOS_5
       if (
-#if !(defined (_AIX) && !defined (ps2))
-	  nlist (KERNEL_FILE, nl)
-#else  /* _AIX */
-	  knlist (nl, 1, sizeof (nl[0]))
-#endif
+#    if !(defined (_AIX) && !defined (ps2))
+	  nlist (KERNEL_FILE, name_list)
+#    else  /* _AIX */
+	  knlist (name_list, 1, sizeof (name_list[0]))
+#    endif
 	  >= 0)
-	  /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i.  */
+	  /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i.  */
 	  {
-#ifdef FIXUP_KERNEL_SYMBOL_ADDR
-	    FIXUP_KERNEL_SYMBOL_ADDR (nl);
-#endif
-	    offset = nl[0].n_value;
+#    ifdef FIXUP_KERNEL_SYMBOL_ADDR
+	    FIXUP_KERNEL_SYMBOL_ADDR (name_list);
+#    endif
+	    offset = name_list[0].n_value;
 	  }
-#endif /* !SUNOS_5 */
-#else  /* sgi */
-	  int ldav_off;
+#   endif /* !SUNOS_5 */
+#  else  /* sgi */
+      int ldav_off;
 
-	  ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
-	  if (ldav_off != -1)
-	  offset = (long) ldav_off & 0x7fffffff;
-#endif /* sgi */
-	}
+      ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
+      if (ldav_off != -1)
+	offset = (long) ldav_off & 0x7fffffff;
+#  endif /* sgi */
+    }
 
   /* Make sure we have /dev/kmem open.  */
   if (!getloadavg_initialized)
     {
-#ifndef SUNOS_5
+#  ifndef SUNOS_5
       channel = retry_open ("/dev/kmem", 0);
       if (channel >= 0)
 	{
 	  /* Set the channel to close on exec, so it does not
 	     litter any child's descriptor table.  */
-#ifdef FD_SETFD
-#ifndef FD_CLOEXEC
-#define FD_CLOEXEC 1
-#endif
+#   ifdef F_SETFD
+#    ifndef FD_CLOEXEC
+#     define FD_CLOEXEC 1
+#    endif
 	  (void) fcntl (channel, F_SETFD, FD_CLOEXEC);
-#endif
+#   endif
 	  getloadavg_initialized = 1;
 	}
-#else /* SUNOS_5 */
+#  else /* SUNOS_5 */
       /* We pass 0 for the kernel, corefile, and swapfile names
 	 to use the currently running kernel.  */
       kd = kvm_open (0, 0, 0, O_RDONLY, 0);
       if (kd != 0)
 	{
 	  /* nlist the currently running kernel.  */
-	  kvm_nlist (kd, nl);
-	  offset = nl[0].n_value;
+	  kvm_nlist (kd, name_list);
+	  offset = name_list[0].n_value;
 	  getloadavg_initialized = 1;
 	}
-#endif /* SUNOS_5 */
+#  endif /* SUNOS_5 */
     }
 
   /* If we can, get the load average values.  */
   if (offset && getloadavg_initialized)
     {
       /* Try to read the load.  */
-#ifndef SUNOS_5
+#  ifndef SUNOS_5
       if (lseek (channel, offset, 0) == -1L
 	  || retry_read (channel, (char *) load_ave, sizeof (load_ave))
 	  != sizeof (load_ave))
@@ -555,14 +606,14 @@
 	  retry_close (channel);
 	  getloadavg_initialized = 0;
 	}
-#else  /* SUNOS_5 */
+#  else  /* SUNOS_5 */
       if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
 	  != sizeof (load_ave))
         {
           kvm_close (kd);
           getloadavg_initialized = 0;
 	}
-#endif /* SUNOS_5 */
+#  endif /* SUNOS_5 */
     }
 
   if (offset == 0 || !getloadavg_initialized)
@@ -575,8 +626,8 @@
   if (nelem > 2)
     loadavg[elem++] = LDAV_CVT (load_ave[2]);
 
-#define LDAV_DONE
-#endif /* !LDAV_DONE && LOAD_AVE_TYPE */
+#  define LDAV_DONE
+# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
 
   return elem;
 }
@@ -621,3 +672,6 @@
   exit (0);
 }
 #endif /* TEST */
+
+/* arch-tag: 2b37a242-6289-41f4-8cd5-0e73fd615db1
+   (do not change this comment) */