[libgtop] Fix shm_limits.c, sem_limits.c, and msg_limits.c



commit 43e4c5257918fafdfb32eb1cca40c7ae0b4806b4
Author: robert <robert openbsd org>
Date:   Mon Apr 19 15:34:58 2021 +0200

    Fix shm_limits.c, sem_limits.c, and msg_limits.c
    
    by using sysctl instead of kvm_nlist
    
    Co-authored-by: jasper <jasper openbsd org>

 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 <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;
 }
 
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;
 }
 
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 <sys/shm.h>. */
 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;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]