diff options
Diffstat (limited to 'sysdeps/openbsd/sem_limits.c')
-rw-r--r-- | sysdeps/openbsd/sem_limits.c | 28 |
1 files changed, 17 insertions, 11 deletions
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 <sys/sem.h>. */ 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; } |