Code

Sync with the latest Gnulib code (177f525)
[nagiosplug.git] / gl / getloadavg.c
index 5a4005cee0b9e5d6af9ef8165582a1f440598956..c6d782b4e2ed1437dbba701502c1f96bbdcf36b0 100644 (file)
@@ -1,8 +1,7 @@
 /* Get the system load averages.
 
-   Copyright (C) 1985, 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994,
-   1995, 1997, 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free
-   Software Foundation, Inc.
+   Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2010 Free Software
+   Foundation, Inc.
 
    NOTE: The canonical source of this file is maintained with gnulib.
    Bugs can be reported to bug-gnulib@gnu.org.
 
 /* Compile-time symbols that this file uses:
 
-   HAVE_PSTAT_GETDYNAMIC       Define this if your system has the
+   HAVE_PSTAT_GETDYNAMIC        Define this if your system has the
                                 pstat_getdynamic function.  I think it
-                               is unique to HPUX9.  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.
+                                is unique to HPUX9.  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.
    HAVE_LIBPERFSTAT Define this if your system has the
-                               perfstat_cpu_total function in libperfstat (AIX).
-   FIXUP_KERNEL_SYMBOL_ADDR()  Adjust address in returned struct nlist.
-   KERNEL_FILE                 Name of the kernel file 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 unless one of
-                               apollo, DGUX, NeXT, or UMAX is defined;
+                                perfstat_cpu_total function in libperfstat (AIX).
+   FIXUP_KERNEL_SYMBOL_ADDR()   Adjust address in returned struct nlist.
+   KERNEL_FILE                  Name of the kernel file 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 unless one of
+                                apollo, DGUX, NeXT, or UMAX is defined;
                                 or we have libkstat;
-                               otherwise, no load average is available.
+                                otherwise, no load average is available.
    HAVE_NLIST_H                 nlist.h is available.  NLIST_STRUCT defaults
                                 to this.
-   NLIST_STRUCT                        Include nlist.h, not a.out.h, and
-                               the nlist n_name element is a pointer,
-                               not an array.
+   NLIST_STRUCT                 Include nlist.h, not a.out.h.
+   N_NAME_POINTER               The nlist n_name element is a pointer,
+                                not an array.
    HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'.
-   LINUX_LDAV_FILE             [__linux__, __CYGWIN__]: File containing
-                               load averages.
+   LINUX_LDAV_FILE              [__linux__, __CYGWIN__]: File containing
+                                load averages.
 
    Specific system predefines this file uses, aside from setting
    default values if not emacs:
 
    apollo
-   BSD                         Real BSD, not just BSD-like.
+   BSD                          Real BSD, not just BSD-like.
    convex
    DGUX
-   eunice                      UNIX emulator under VMS.
+   eunice                       UNIX emulator under VMS.
    hpux
-   __MSDOS__                   No-op for MSDOS.
+   __MSDOS__                    No-op for MSDOS.
    NeXT
    sgi
-   sequent                     Sequent Dynix 3.x.x (BSD)
-   _SEQUENT_                   Sequent DYNIX/ptx 1.x.x (SYSV)
+   sequent                      Sequent Dynix 3.x.x (BSD)
+   _SEQUENT_                    Sequent DYNIX/ptx 1.x.x (SYSV)
    sony_news                    NEWS-OS (works at least for 4.1C)
    UMAX
    UMAX4_3
    VMS
-   WINDOWS32                   No-op for Windows95/NT.
-   __linux__                   Linux: assumes /proc file system mounted.
-                               Support from Michael K. Johnson.
-   __CYGWIN__                  Cygwin emulates linux /proc/loadavg.
-   __NetBSD__                  NetBSD: assumes /kern file system mounted.
+   WINDOWS32                    No-op for Windows95/NT.
+   __linux__                    Linux: assumes /proc file system mounted.
+                                Support from Michael K. Johnson.
+   __CYGWIN__                   Cygwin emulates linux /proc/loadavg.
+   __NetBSD__                   NetBSD: assumes /kern file system mounted.
 
    In addition, to avoid nesting many #ifdefs, we internally set
    LDAV_DONE to indicate that the load average has been computed.
 # include "c-strtod.h"
 # include "cloexec.h"
 # include "intprops.h"
-# include "xalloc.h"
 
 /* The existing Emacs configuration files define a macro called
    LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and
    default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>.  Combine
    that with a couple of other things and we'll have a unique match.  */
 # if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES)
-#  define tek4300                      /* Define by emacs, but not by other users.  */
+#  define tek4300                       /* Define by emacs, but not by other users.  */
 # endif
 
 
 #   define FSCALE 65536.0
 #  endif
 
-# endif        /* Not FSCALE.  */
+# endif /* Not FSCALE.  */
 
 # if !defined (LDAV_CVT) && defined (FSCALE)
 #  define LDAV_CVT(n) (((double) (n)) / FSCALE)
@@ -478,7 +476,7 @@ static unsigned int samples;
 # endif /* UMAX */
 
 # ifdef DGUX
-static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */
+static struct dg_sys_info_load_info load_info;  /* what-a-mouthful! */
 # endif /* DGUX */
 
 # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
@@ -507,7 +505,7 @@ static kvm_t *kd;
 int
 getloadavg (double loadavg[], int nelem)
 {
-  int elem = 0;                        /* Return value.  */
+  int elem = 0;                 /* Return value.  */
 
 # ifdef NO_GET_LOAD_AVG
 #  define LDAV_DONE
@@ -549,16 +547,16 @@ getloadavg (double loadavg[], int nelem)
     {
       kn = kstat_data_lookup (ksp, "avenrun_5min");
       if (kn != 0)
-       {
-         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;
+
+          if (nelem >= 3)
+            {
+              kn = kstat_data_lookup (ksp, "avenrun_15min");
+              if (kn != 0)
+                loadavg[elem++] = (double) kn->value.ul / FSCALE;
+            }
+        }
     }
 
   kstat_close (kc);
@@ -626,11 +624,11 @@ getloadavg (double loadavg[], int nelem)
       errno = 0;
       d = c_strtod (ptr, &endptr);
       if (ptr == endptr || (d == 0 && errno != 0))
-       {
-         if (elem == 0)
-           return -1;
-         break;
-       }
+        {
+          if (elem == 0)
+            return -1;
+          break;
+        }
       loadavg[elem] = d;
       ptr = endptr;
     }
@@ -655,8 +653,8 @@ getloadavg (double loadavg[], int nelem)
   if (fp == NULL)
     return -1;
   count = fscanf (fp, "%lu %lu %lu %lu\n",
-                 &load_ave[0], &load_ave[1], &load_ave[2],
-                 &scale);
+                  &load_ave[0], &load_ave[1], &load_ave[2],
+                  &scale);
   (void) fclose (fp);
   if (count != 4)
     return -1;
@@ -682,21 +680,21 @@ getloadavg (double loadavg[], int nelem)
   if (!getloadavg_initialized)
     {
       if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
-       getloadavg_initialized = true;
+        getloadavg_initialized = true;
     }
 
   if (getloadavg_initialized)
     {
       info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
       if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
-                             (processor_set_info_t) &info, &info_count)
-         != KERN_SUCCESS)
-       getloadavg_initialized = false;
+                              (processor_set_info_t) &info, &info_count)
+          != KERN_SUCCESS)
+        getloadavg_initialized = false;
       else
-       {
-         if (nelem > 0)
-           loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
-       }
+        {
+          if (nelem > 0)
+            loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
+        }
     }
 
   if (!getloadavg_initialized)
@@ -728,24 +726,24 @@ getloadavg (double loadavg[], int nelem)
       desc.sd_size = sizeof conf;
 
       if (inq_stats (1, &desc))
-       return -1;
+        return -1;
 
       c = 0;
       for (i = 0; i < conf.config_maxclass; ++i)
-       {
-         struct class_stats stats;
-         bzero ((char *) &stats, sizeof stats);
+        {
+          struct class_stats stats;
+          bzero ((char *) &stats, sizeof stats);
 
-         desc.sd_type = CPUTYPE_CLASS;
-         desc.sd_objid = i;
-         desc.sd_addr = (char *) &stats;
-         desc.sd_size = sizeof stats;
+          desc.sd_type = CPUTYPE_CLASS;
+          desc.sd_objid = i;
+          desc.sd_addr = (char *) &stats;
+          desc.sd_size = sizeof stats;
 
-         if (inq_stats (1, &desc))
-           return -1;
+          if (inq_stats (1, &desc))
+            return -1;
 
-         c += stats.class_numcpus;
-       }
+          c += stats.class_numcpus;
+        }
       cpus = c;
       samples = cpus < 2 ? 3 : (2 * cpus / 3);
     }
@@ -766,7 +764,7 @@ getloadavg (double loadavg[], int nelem)
     {
       load += proc_sum_data.ps_nrun[j];
       if (j++ == PS_NRUNSIZE)
-       j = 0;
+        j = 0;
     }
 
   if (nelem > 0)
@@ -779,8 +777,8 @@ getloadavg (double loadavg[], int nelem)
      it's not supposed to fail.  The first argument is for no
      apparent reason of type `long int *'.  */
   dg_sys_info ((long int *) &load_info,
-              DG_SYS_INFO_LOAD_INFO_TYPE,
-              DG_SYS_INFO_LOAD_VERSION_0);
+               DG_SYS_INFO_LOAD_INFO_TYPE,
+               DG_SYS_INFO_LOAD_VERSION_0);
 
   if (nelem > 0)
     loadavg[elem++] = load_info.one_minute;
@@ -824,7 +822,7 @@ getloadavg (double loadavg[], int nelem)
     = (load_ave.tl_lscale == 0
        ? load_ave.tl_avenrun.d[0]
        : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
-# endif        /* OSF_MIPS */
+# endif /* OSF_MIPS */
 
 # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
 #  define LDAV_DONE
@@ -844,8 +842,8 @@ getloadavg (double loadavg[], int nelem)
   for (elem = 0; elem < nelem; elem++)
     loadavg[elem]
       = (load_ave.tl_lscale == 0
-        ? load_ave.tl_avenrun.d[elem]
-        : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
+         ? load_ave.tl_avenrun.d[elem]
+         : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
 # endif /* OSF_ALPHA */
 
 # if ! defined LDAV_DONE && defined __VMS
@@ -872,13 +870,13 @@ getloadavg (double loadavg[], int nelem)
       $DESCRIPTOR (descriptor, "LAV0:");
 #  endif
       if (sys$assign (&descriptor, &channel, 0, 0) & 1)
-       getloadavg_initialized = true;
+        getloadavg_initialized = true;
     }
 
   /* Read the load average vector.  */
   if (getloadavg_initialized
       && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
-                    load_ave, 12, 0, 0, 0, 0) & 1))
+                     load_ave, 12, 0, 0, 0, 0) & 1))
     {
       sys$dassgn (channel);
       getloadavg_initialized = false;
@@ -892,7 +890,7 @@ getloadavg (double loadavg[], int nelem)
 
   /* 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];
 
@@ -900,7 +898,7 @@ getloadavg (double loadavg[], int nelem)
   if (offset == 0)
     {
 #  ifndef sgi
-#   ifndef NLIST_STRUCT
+#   if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
       strcpy (nl[0].n_name, LDAV_SYMBOL);
       strcpy (nl[1].n_name, "");
 #   else /* NLIST_STRUCT */
@@ -916,25 +914,25 @@ getloadavg (double loadavg[], int nelem)
 #   ifndef SUNOS_5
       if (
 #    if !(defined (_AIX) && !defined (ps2))
-         nlist (KERNEL_FILE, nl)
+          nlist (KERNEL_FILE, nl)
 #    else  /* _AIX */
-         knlist (nl, 1, sizeof (nl[0]))
+          knlist (nl, 1, sizeof (nl[0]))
 #    endif
-         >= 0)
-         /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i.  */
-         {
+          >= 0)
+          /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i.  */
+          {
 #    ifdef FIXUP_KERNEL_SYMBOL_ADDR
-           FIXUP_KERNEL_SYMBOL_ADDR (nl);
+            FIXUP_KERNEL_SYMBOL_ADDR (nl);
 #    endif
-           offset = nl[0].n_value;
-         }
+            offset = nl[0].n_value;
+          }
 #   endif /* !SUNOS_5 */
 #  else  /* sgi */
       int ldav_off;
 
       ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
       if (ldav_off != -1)
-       offset = (long int) ldav_off & 0x7fffffff;
+        offset = (long int) ldav_off & 0x7fffffff;
 #  endif /* sgi */
     }
 
@@ -944,23 +942,23 @@ getloadavg (double loadavg[], int nelem)
 #  ifndef SUNOS_5
       channel = open ("/dev/kmem", O_RDONLY);
       if (channel >= 0)
-       {
-         /* Set the channel to close on exec, so it does not
-            litter any child's descriptor table.  */
-         set_cloexec_flag (channel, true);
-         getloadavg_initialized = true;
-       }
+        {
+          /* Set the channel to close on exec, so it does not
+             litter any child's descriptor table.  */
+          set_cloexec_flag (channel, true);
+          getloadavg_initialized = true;
+        }
 #  else /* SUNOS_5 */
       /* We pass 0 for the kernel, corefile, and swapfile names
-        to use the currently running kernel.  */
+         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;
-         getloadavg_initialized = true;
-       }
+        {
+          /* nlist the currently running kernel.  */
+          kvm_nlist (kd, nl);
+          offset = nl[0].n_value;
+          getloadavg_initialized = true;
+        }
 #  endif /* SUNOS_5 */
     }
 
@@ -970,19 +968,19 @@ getloadavg (double loadavg[], int nelem)
       /* Try to read the load.  */
 #  ifndef SUNOS_5
       if (lseek (channel, offset, 0) == -1L
-         || read (channel, (char *) load_ave, sizeof (load_ave))
-         != sizeof (load_ave))
-       {
-         close (channel);
-         getloadavg_initialized = false;
-       }
+          || read (channel, (char *) load_ave, sizeof (load_ave))
+          != sizeof (load_ave))
+        {
+          close (channel);
+          getloadavg_initialized = false;
+        }
 #  else  /* SUNOS_5 */
       if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
-         != sizeof (load_ave))
-       {
-         kvm_close (kd);
-         getloadavg_initialized = false;
-       }
+          != sizeof (load_ave))
+        {
+          kvm_close (kd);
+          getloadavg_initialized = false;
+        }
 #  endif /* SUNOS_5 */
     }
 
@@ -1026,24 +1024,24 @@ main (int argc, char **argv)
       double avg[3];
       int loads;
 
-      errno = 0;               /* Don't be misled if it doesn't set errno.  */
+      errno = 0;                /* Don't be misled if it doesn't set errno.  */
       loads = getloadavg (avg, 3);
       if (loads == -1)
-       {
-         perror ("Error getting load average");
-         return EXIT_FAILURE;
-       }
+        {
+          perror ("Error getting load average");
+          return EXIT_FAILURE;
+        }
       if (loads > 0)
-       printf ("1-minute: %f  ", avg[0]);
+        printf ("1-minute: %f  ", avg[0]);
       if (loads > 1)
-       printf ("5-minute: %f  ", avg[1]);
+        printf ("5-minute: %f  ", avg[1]);
       if (loads > 2)
-       printf ("15-minute: %f  ", avg[2]);
+        printf ("15-minute: %f  ", avg[2]);
       if (loads > 0)
-       putchar ('\n');
+        putchar ('\n');
 
       if (naptime == 0)
-       break;
+        break;
       sleep (naptime);
     }