From 43e4c5257918fafdfb32eb1cca40c7ae0b4806b4 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 19 Apr 2021 15:34:58 +0200 Subject: Fix shm_limits.c, sem_limits.c, and msg_limits.c by using sysctl instead of kvm_nlist Co-authored-by: jasper --- sysdeps/openbsd/msg_limits.c | 28 +++++++++++++++++----------- sysdeps/openbsd/sem_limits.c | 28 +++++++++++++++++----------- sysdeps/openbsd/shm_limits.c | 27 ++++++++++++++++----------- 3 files changed, 50 insertions(+), 33 deletions(-) diff --git a/sysdeps/openbsd/msg_limits.c b/sysdeps/openbsd/msg_limits.c index bc7c6e23..840d75e2 100644 --- a/sysdeps/openbsd/msg_limits.c +++ b/sysdeps/openbsd/msg_limits.c @@ -47,28 +47,34 @@ static const unsigned long _glibtop_sysdeps_msg_limits = * since `msginfo' is already declared external in . */ static struct msginfo _msginfo; -/* nlist structure for kernel access */ -static struct nlist nlst [] = { - { "_msginfo" }, - { 0 } -}; - /* Init function. */ void _glibtop_init_msg_limits_p (glibtop *server) { - if (kvm_nlist (server->machine->kd, nlst) < 0) { - glibtop_warn_io_r (server, "kvm_nlist (msg_limits)"); + int mib[3]; + struct msg_sysctl_info *msgsi; + + size_t len = sizeof(struct msginfo); + + mib[0] = CTL_KERN; + mib[1] = KERN_SYSVIPC_INFO; + mib[2] = KERN_SYSVIPC_MSG_INFO; + + if ((msgsi = malloc(len)) == NULL) { + glibtop_warn_io_r (server, "malloc (shm_limits)"); return; } - if (kvm_read (server->machine->kd, nlst [0].n_value, - &_msginfo, sizeof (_msginfo)) != sizeof (_msginfo)) { - glibtop_warn_io_r (server, "kvm_read (msginfo)"); + if (sysctl(mib, 3, msgsi, &len, NULL, 0) < 0) { + glibtop_warn_io_r (server, "sysctl (shm_limits)"); return; } + _msginfo = msgsi->msginfo; + + free (msgsi); + server->sysdeps.msg_limits = _glibtop_sysdeps_msg_limits; } diff --git a/sysdeps/openbsd/sem_limits.c b/sysdeps/openbsd/sem_limits.c index df1dfc29..12e88ff0 100644 --- a/sysdeps/openbsd/sem_limits.c +++ b/sysdeps/openbsd/sem_limits.c @@ -45,28 +45,34 @@ static unsigned long _glibtop_sysdeps_sem_limits = * since `seminfo' is already declared external in . */ static struct seminfo _seminfo; -/* nlist structure for kernel access */ -static struct nlist nlst [] = { - { "_seminfo" }, - { 0 } -}; - /* Init function. */ void _glibtop_init_sem_limits_p (glibtop *server) { - if (kvm_nlist (server->machine->kd, nlst) < 0) { - glibtop_warn_io_r (server, "kvm_nlist (sem_limits)"); + int mib[3]; + struct sem_sysctl_info *semsi; + + size_t len = sizeof(struct seminfo); + + mib[0] = CTL_KERN; + mib[1] = KERN_SYSVIPC_INFO; + mib[2] = KERN_SYSVIPC_SEM_INFO; + + if ((semsi = malloc(len)) == NULL) { + glibtop_warn_io_r (server, "malloc (shm_limits)"); return; } - if (kvm_read (server->machine->kd, nlst [0].n_value, - &_seminfo, sizeof (_seminfo)) != sizeof (_seminfo)) { - glibtop_warn_io_r (server, "kvm_read (seminfo)"); + if (sysctl(mib, 3, semsi, &len, NULL, 0) < 0) { + glibtop_warn_io_r (server, "sysctl (shm_limits)"); return; } + _seminfo = semsi->seminfo; + + free (semsi); + server->sysdeps.sem_limits = _glibtop_sysdeps_sem_limits; } diff --git a/sysdeps/openbsd/shm_limits.c b/sysdeps/openbsd/shm_limits.c index 16fc5cf7..fb43756a 100644 --- a/sysdeps/openbsd/shm_limits.c +++ b/sysdeps/openbsd/shm_limits.c @@ -39,28 +39,33 @@ static unsigned long _glibtop_sysdeps_shm_limits = * since `shminfo' is already declared external in . */ static struct shminfo _shminfo; -/* nlist structure for kernel access */ -static struct nlist nlst [] = { - { "_shminfo" }, - { 0 } -}; - /* Init function. */ void _glibtop_init_shm_limits_p (glibtop *server) { - if (kvm_nlist (server->machine->kd, nlst) < 0) { - glibtop_warn_io_r (server, "kvm_nlist (shm_limits)"); + int mib[3]; + struct shm_sysctl_info *shmsi; + size_t len = sizeof(struct shminfo); + + mib[0] = CTL_KERN; + mib[1] = KERN_SYSVIPC_INFO; + mib[2] = KERN_SYSVIPC_SHM_INFO; + + if ((shmsi = malloc(len)) == NULL) { + glibtop_warn_io_r (server, "malloc (shm_limits)"); return; } - if (kvm_read (server->machine->kd, nlst [0].n_value, - &_shminfo, sizeof (_shminfo)) != sizeof (_shminfo)) { - glibtop_warn_io_r (server, "kvm_read (shminfo)"); + if (sysctl(mib, 3, shmsi, &len, NULL, 0) < 0) { + glibtop_warn_io_r (server, "sysctl (shm_limits)"); return; } + _shminfo = shmsi->shminfo; + + free (shmsi); + server->sysdeps.shm_limits = _glibtop_sysdeps_shm_limits; } -- cgit v1.2.1