summaryrefslogtreecommitdiff
path: root/lib/getloadavg.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1996-09-19 12:54:15 +0000
committerJim Meyering <jim@meyering.net>1996-09-19 12:54:15 +0000
commite044081627316cb1a1a76cd296d210cfa2cc2ebc (patch)
treeb89eb6a68c92c6e2fb9ba95dd91515e51c9edc4f /lib/getloadavg.c
parentd1320b7277685c07afdd41365e4580c138e39bce (diff)
downloadcoreutils-e044081627316cb1a1a76cd296d210cfa2cc2ebc.tar.xz
Replace with FSF version.
Diffstat (limited to 'lib/getloadavg.c')
-rw-r--r--lib/getloadavg.c59
1 files changed, 53 insertions, 6 deletions
diff --git a/lib/getloadavg.c b/lib/getloadavg.c
index bd024cf20..2411e6a92 100644
--- a/lib/getloadavg.c
+++ b/lib/getloadavg.c
@@ -43,6 +43,7 @@
DGUX
eunice UNIX emulator under VMS.
hpux
+ MSDOS No-op for MSDOS.
NeXT
sgi
sequent Sequent Dynix 3.x.x (BSD)
@@ -51,6 +52,7 @@
UMAX
UMAX4_3
VMS
+ WIN32 No-op for Windows95/NT.
__linux__ Linux: assumes /proc filesystem mounted.
Support from Michael K. Johnson.
__NetBSD__ NetBSD: assumes /kern filesystem mounted.
@@ -139,7 +141,7 @@ extern int errno;
#define decstation
#endif
-#if (defined(sun) || defined(__sun)) && defined(SVR4)
+#if (defined(sun) && defined(SVR4)) || defined (SOLARIS2)
#define SUNOS_5
#endif
@@ -168,7 +170,7 @@ extern int errno;
#define LOAD_AVE_TYPE long
#endif
-#if defined(sun) || defined(__sun)
+#ifdef sun
#define LOAD_AVE_TYPE long
#endif
@@ -284,7 +286,7 @@ extern int errno;
#define NLIST_STRUCT
#endif
-#if defined(sun) || defined(__sun)
+#ifdef sun
#define NLIST_STRUCT
#endif
@@ -389,6 +391,7 @@ extern int errno;
#ifdef SUNOS_5
#include <fcntl.h>
#include <kvm.h>
+#include <kstat.h>
#endif
#ifndef KERNEL_FILE
@@ -514,6 +517,50 @@ getloadavg (loadavg, nelem)
elem = -1;
#endif
+#if !defined (LDAV_DONE) && defined (SUNOS_5)
+/* Use libkstat because we don't have to be root. */
+#define LDAV_DONE
+ kstat_ctl_t *kc;
+ kstat_t *ksp;
+ kstat_named_t *kn;
+
+ kc = kstat_open ();
+ if (kc == 0) return -1;
+ ksp = kstat_lookup (kc, "unix", 0, "system_misc");
+ if (ksp == 0 ) return -1;
+ if (kstat_read (kc, ksp, 0) == -1) return -1;
+
+
+ kn = kstat_data_lookup (ksp, "avenrun_1min");
+ if (kn == 0)
+ {
+ /* Return -1 if no load average information is available. */
+ nelem = 0;
+ elem = -1;
+ }
+
+ if (nelem >= 1)
+ loadavg[elem++] = (double) kn->value.ul/FSCALE;
+
+ if (nelem >= 2)
+ {
+ 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;
+ }
+ }
+ }
+
+ kstat_close (kc);
+#endif /* SUNOS_5 */
+
#if !defined (LDAV_DONE) && defined (__linux__)
#define LDAV_DONE
#undef LOAD_AVE_TYPE
@@ -733,11 +780,11 @@ getloadavg (loadavg, nelem)
: (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
#endif /* OSF_MIPS */
-#if !defined (LDAV_DONE) && defined(MSDOS)
+#if !defined (LDAV_DONE) && (defined (MSDOS) || defined (WIN32))
#define LDAV_DONE
/* A faithful emulation is going to have to be saved for a rainy day. */
- for ( ; elem < nelem; elem++)
+ for ( ; elem < nelem; elem++)
{
loadavg[elem] = 0.0;
}
@@ -866,7 +913,7 @@ getloadavg (loadavg, nelem)
/* 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)
+ if (kd != 0)
{
/* nlist the currently running kernel. */
kvm_nlist (kd, nl);