summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Naumov <alexander_naumov@opensuse.org>2017-10-04 15:21:36 +0200
committerAlexander Naumov <alexander_naumov@opensuse.org>2017-10-04 15:21:36 +0200
commit46bc00dd34c088325bcb77941e33341877440a38 (patch)
treeba646d7ad4f0aa73a91a356d2ca8b26bf88f726f
parentaaac75d80948be3f1753ca5c9b6edc02b7804535 (diff)
downloadscreen-46bc00dd34c088325bcb77941e33341877440a38.tar.gz
Replace the use of read /dev/kmem by a syscall for AIX platforms
bug #49148
-rw-r--r--src/loadav.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/loadav.c b/src/loadav.c
index 770010c..ef05c86 100644
--- a/src/loadav.c
+++ b/src/loadav.c
@@ -42,6 +42,11 @@
# endif
#endif
+#ifdef _AIX
+#include <sys/kinfo.h>
+extern int getkerninfo(int op, char *buf, int *buf_size, int32long64_t arg);
+#endif
+
#include "config.h"
#include "screen.h"
@@ -261,6 +266,41 @@ GetLoadav()
}
#endif
+
+/***************************************************************/
+
+#if defined(_AIX) && !defined(LOADAV_DONE)
+#define LOADAV_DONE
+/*
+ * AIX uses KINFO_GET_AVENRUN syscall
+ */
+void
+InitLoadav()
+{
+ loadok = 1;
+}
+
+static int
+GetLoadav()
+{
+ long long avenrun[3];
+ int avsize = 3 * sizeof(long long);
+ int i;
+
+ if (getkerninfo(KINFO_GET_AVENRUN, (char *)&avenrun, &avsize, 0) < 0)
+ {
+ return 0;
+ }
+
+ for (i = 0; i < (LOADAV_NUM > 3 ? 3 : LOADAV_NUM); i++)
+ {
+ loadav[i] = avenrun[i];
+ }
+
+ return i;
+}
+#endif /* _AIX */
+
/***************************************************************/
#if !defined(LOADAV_DONE)