summaryrefslogtreecommitdiff
path: root/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_procmap.c')
-rw-r--r--devel/libgtop/files/patch-sysdeps_freebsd_procmap.c135
1 files changed, 11 insertions, 124 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c b/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c
index a0f64e09184f..a3b4fcc550f2 100644
--- a/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c
+++ b/devel/libgtop/files/patch-sysdeps_freebsd_procmap.c
@@ -1,15 +1,15 @@
---- sysdeps/freebsd/procmap.c.orig 2021-06-06 05:13:00 UTC
+--- sysdeps/freebsd/procmap.c.orig 2023-01-15 10:43:14 UTC
+++ sysdeps/freebsd/procmap.c
-@@ -34,6 +34,8 @@
- #include <vm/vm_map.h>
- #include <vm/vm.h>
+@@ -26,6 +26,8 @@
+
+ #include <glibtop_suid.h>
+#include <stdbool.h>
+
- #define _KVM_VNODE
- #include <sys/vnode.h>
- #undef _KVM_VNODE
-@@ -51,14 +53,15 @@
+ #include <kvm.h>
+ #include <sys/param.h>
+ #include <sys/proc.h>
+@@ -51,12 +53,14 @@
#define _KERNEL
#include <sys/mount.h>
#include <ufs/ufs/quota.h>
@@ -23,18 +23,9 @@
#undef _KERNEL
+#include <ufs/ufs/inode.h>
--
- #if (__FreeBSD_version >= 1101001)
- #define _KERNEL
- #include <ufs/ufs/extattr.h>
-@@ -95,12 +98,14 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, s
- struct cdev_priv priv;
- #if __FreeBSD_version < 800039
- struct cdev si;
-+#else
-+ struct ufsmount um;
- #endif
+ #if (__FreeBSD_version >= 1101001)
+@@ -100,7 +104,7 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, s
*inum = 0;
*dev = 0;
@@ -43,7 +34,7 @@
(char *) &tagptr, sizeof (tagptr)) != sizeof (tagptr) ||
kvm_read (server->machine->kd, (gulong) tagptr,
(char *) tagstr, sizeof (tagstr)) != sizeof (tagstr))
-@@ -120,7 +125,7 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, s
+@@ -120,7 +124,7 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, s
return;
}
@@ -52,107 +43,3 @@
sizeof (inode)) != sizeof (inode))
{
glibtop_warn_io_r (server, "kvm_read (inode)");
-@@ -231,6 +236,32 @@ _glibtop_init_proc_map_p (glibtop *server)
- server->sysdeps.proc_map = _glibtop_sysdeps_proc_map;
- }
-
-+static int
-+vm_map_reader(void *token, vm_map_entry_t addr, vm_map_entry_t dest)
-+{
-+ kvm_t *kd;
-+
-+ kd = (kvm_t *)token;
-+ return (kvm_read (kd, (gulong) addr, dest, sizeof(*dest)) == sizeof(*dest));
-+}
-+
-+#if (__FreeBSD_version < 1300062)
-+typedef int vm_map_entry_reader(void *token, vm_map_entry_t addr,
-+ vm_map_entry_t dest);
-+
-+static inline vm_map_entry_t
-+vm_map_entry_read_succ(void *token, struct vm_map_entry *const clone,
-+ vm_map_entry_reader reader)
-+{
-+ vm_map_entry_t next;
-+
-+ next = clone->next;
-+ if (!reader (token, next, clone))
-+ return (NULL);
-+ return (next);
-+}
-+#endif
-+
- /* Provides detailed information about a process. */
-
- glibtop_map_entry *
-@@ -238,13 +269,12 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
- pid_t pid)
- {
- struct kinfo_proc *pinfo;
-- struct vm_map_entry entry, *first;
-+ struct vm_map_entry entry;
- struct vmspace vmspace;
- struct vm_object object;
- GArray *maps;
- struct vnode vnode;
-- int count;
-- int update = 0;
-+ int i, count;
-
- memset (buf, 0, sizeof (glibtop_proc_map));
-
-@@ -273,16 +303,6 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
- return NULL;
- }
-
-- first = vmspace.vm_map.header.next;
--
-- if (kvm_read (server->machine->kd,
-- (gulong) vmspace.vm_map.header.next,
-- (char *) &entry, sizeof (entry)) != sizeof (entry)) {
-- glibtop_warn_io_r (server, "kvm_read (entry)");
-- glibtop_suid_leave (server);
-- return NULL;
-- }
--
- /* Walk through the `vm_map_entry' list ... */
-
- /* I tested this a few times with `mmap'; as soon as you write
-@@ -292,21 +312,17 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
- maps = g_array_sized_new(FALSE, FALSE, sizeof(glibtop_map_entry),
- vmspace.vm_map.nentries);
-
-- do {
-+ entry = vmspace.vm_map.header;
-+ for (i = 0; i < vmspace.vm_map.nentries; i++) {
- glibtop_map_entry *mentry;
- guint64 inum, dev;
- guint len;
-
-- if (update) {
-- if (kvm_read (server->machine->kd,
-- (gulong) entry.next,
-- (char *) &entry, sizeof (entry)) != sizeof (entry)) {
-- glibtop_warn_io_r (server, "kvm_read (entry)");
-- continue;
-- }
-- } else {
-- update = 1;
-- }
-+ if (!vm_map_entry_read_succ(server->machine->kd, &entry, vm_map_reader)) {
-+ glibtop_warn_io_r (server, "kvm_read (entry)");
-+ glibtop_suid_leave (server);
-+ return NULL;
-+ }
-
- if (entry.eflags & (MAP_ENTRY_IS_SUB_MAP))
- continue;
-@@ -377,7 +393,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
- if (entry.protection & VM_PROT_EXECUTE)
- mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE;
-
-- } while (entry.next != first);
-+ }
-
- glibtop_suid_leave (server);
-