diff options
author | Alexander Naumov <alexander_naumov@opensuse.org> | 2017-10-04 15:21:36 +0200 |
---|---|---|
committer | Alexander Naumov <alexander_naumov@opensuse.org> | 2017-10-04 15:21:36 +0200 |
commit | 46bc00dd34c088325bcb77941e33341877440a38 (patch) | |
tree | ba646d7ad4f0aa73a91a356d2ca8b26bf88f726f | |
parent | aaac75d80948be3f1753ca5c9b6edc02b7804535 (diff) | |
download | screen-46bc00dd34c088325bcb77941e33341877440a38.tar.gz |
Replace the use of read /dev/kmem by a syscall for AIX platforms
bug #49148
-rw-r--r-- | src/loadav.c | 40 |
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) |