summaryrefslogtreecommitdiff
path: root/sysdeps/openbsd/msg_limits.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/openbsd/msg_limits.c')
-rw-r--r--sysdeps/openbsd/msg_limits.c28
1 files changed, 17 insertions, 11 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 <sys/msg.h>. */
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;
}