diff options
author | Martin Baulig <martin@home-of-linux.org> | 1998-08-10 16:57:44 +0000 |
---|---|---|
committer | Martin Baulig <martin@src.gnome.org> | 1998-08-10 16:57:44 +0000 |
commit | d9361d388cdbb18a25459c7f5bd70bb37fe97569 (patch) | |
tree | 583dea7a2e4a56595a503528ba3cd170fa6a0781 /sysdeps | |
parent | b6885555c1c40e4d554a5c6d74e7c2f375b41299 (diff) | |
download | libgtop-d9361d388cdbb18a25459c7f5bd70bb37fe97569.tar.gz |
New file. Added definition of `proc_map'.
1998-08-10 Martin Baulig <martin@home-of-linux.org>
* include/glibtop/procmap.h (glibtop_proc_map): New file.
* features.def: Added definition of `proc_map'.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/common/sysdeps_suid.c | 3 | ||||
-rw-r--r-- | sysdeps/freebsd/Makefile.am | 2 | ||||
-rw-r--r-- | sysdeps/freebsd/glibtop_server.h | 1 | ||||
-rw-r--r-- | sysdeps/freebsd/procmap.c | 176 | ||||
-rw-r--r-- | sysdeps/freebsd/procmem.c | 31 | ||||
-rw-r--r-- | sysdeps/names/Makefile.am | 2 | ||||
-rw-r--r-- | sysdeps/names/procmap.c | 46 | ||||
-rw-r--r-- | sysdeps/names/sysdeps.c | 8 |
8 files changed, 262 insertions, 7 deletions
diff --git a/sysdeps/common/sysdeps_suid.c b/sysdeps/common/sysdeps_suid.c index 2723f3e8..318c9388 100644 --- a/sysdeps/common/sysdeps_suid.c +++ b/sysdeps/common/sysdeps_suid.c @@ -71,6 +71,9 @@ glibtop_init_func_t _glibtop_init_hook_p [] = { #if GLIBTOP_SUID_PROC_SEGMENT glibtop_init_proc_segment_p, #endif +#if GLIBTOP_SUID_PROC_MAP + glibtop_init_proc_map_p, +#endif NULL }; diff --git a/sysdeps/freebsd/Makefile.am b/sysdeps/freebsd/Makefile.am index 259f303f..eb8c727b 100644 --- a/sysdeps/freebsd/Makefile.am +++ b/sysdeps/freebsd/Makefile.am @@ -12,6 +12,6 @@ libgtop_sysdeps_suid_la_SOURCES = open.c close.c siglist.c cpu.c mem.c swap.c \ uptime.c loadavg.c shm_limits.c msg_limits.c \ sem_limits.c proclist.c procstate.c procuid.c \ proctime.c procmem.c procsignal.c prockernel.c \ - procsegment.c + procsegment.c procmap.c include_HEADERS = glibtop_server.h glibtop_machine.h diff --git a/sysdeps/freebsd/glibtop_server.h b/sysdeps/freebsd/glibtop_server.h index 4b37edfc..199991ac 100644 --- a/sysdeps/freebsd/glibtop_server.h +++ b/sysdeps/freebsd/glibtop_server.h @@ -40,6 +40,7 @@ __BEGIN_DECLS #define GLIBTOP_SUID_PROC_SIGNAL (1 << GLIBTOP_SYSDEPS_PROC_SIGNAL) #define GLIBTOP_SUID_PROC_KERNEL (1 << GLIBTOP_SYSDEPS_PROC_KERNEL) #define GLIBTOP_SUID_PROC_SEGMENT (1 << GLIBTOP_SYSDEPS_PROC_SEGMENT) +#define GLIBTOP_SUID_PROC_MAP (1 << GLIBTOP_SYSDEPS_PROC_MAP) __END_DECLS diff --git a/sysdeps/freebsd/procmap.c b/sysdeps/freebsd/procmap.c new file mode 100644 index 00000000..b918591d --- /dev/null +++ b/sysdeps/freebsd/procmap.c @@ -0,0 +1,176 @@ +/* $Id$ */ + +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the Gnome Top Library. + Contributed by Joshua Sled <jsled@xcf.berkeley.edu>, July 1998. + + The Gnome Top Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Top Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/xmalloc.h> +#include <glibtop/procmap.h> + +#include <glibtop_suid.h> + +#include <kvm.h> +#include <sys/param.h> +#include <sys/proc.h> +#include <sys/resource.h> +#include <vm/vm_object.h> +#include <vm/vm_map.h> + +#include <sys/vnode.h> +#include <sys/mount.h> +#include <ufs/ufs/quota.h> +#include <ufs/ufs/inode.h> + +#include <sys/ucred.h> +#include <sys/user.h> +#include <sys/sysctl.h> +#include <vm/vm.h> + +static const unsigned long _glibtop_sysdeps_proc_map = +(1 << GLIBTOP_PROC_MAP_TOTAL) + (1 << GLIBTOP_PROC_MAP_NUMBER) + +(1 << GLIBTOP_PROC_MAP_SIZE); + +/* Init function. */ + +void +glibtop_init_proc_map_p (glibtop *server) +{ + register int pagesize; + + server->sysdeps.proc_map = _glibtop_sysdeps_proc_map; +} + +/* Provides detailed information about a process. */ + +glibtop_map_entry * +glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, + pid_t pid) +{ + struct kinfo_proc *pinfo; + struct vm_map_entry entry, *first; + struct vmspace *vms, vmspace; + struct vm_object object; + glibtop_map_entry *maps; + struct vnode vnode; + struct inode inode; + struct mount mount; + int count, i = 0; + int update = 0; + + glibtop_suid_enter (server); + + /* Get the process data */ + pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + if ((pinfo == NULL) || (count < 1)) + glibtop_error_io_r (server, "kvm_getprocs (proclist)"); + + /* Now we get the memory maps. */ + + if (kvm_read (server->machine.kd, + (unsigned long) pinfo [0].kp_proc.p_vmspace, + (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) + glibtop_error_io_r (server, "kvm_read (vmspace)"); + + first = vmspace.vm_map.header.next; + + if (kvm_read (server->machine.kd, + (unsigned long) vmspace.vm_map.header.next, + (char *) &entry, sizeof (entry)) != sizeof (entry)) + glibtop_error_io_r (server, "kvm_read (entry)"); + + /* Allocate space. */ + + buf->number = vmspace.vm_map.nentries; + buf->size = sizeof (glibtop_map_entry); + + buf->total = buf->number * buf->size; + + maps = glibtop_malloc_r (server, buf->total); + + memset (maps, 0, buf->total); + + buf->flags = _glibtop_sysdeps_proc_map; + + /* Walk through the `vm_map_entry' list ... */ + + /* I tested this a few times with `mmap'; as soon as you write + * to the mmap'ed area, the object type changes from OBJT_VNODE + * to OBJT_DEFAULT so if seems this really works. */ + + do { + if (update) { + if (kvm_read (server->machine.kd, + (unsigned long) entry.next, + &entry, sizeof (entry)) != sizeof (entry)) + glibtop_error_io_r (server, "kvm_read (entry)"); + } else { + update = 1; + } + + if (entry.eflags & (MAP_ENTRY_IS_A_MAP|MAP_ENTRY_IS_SUB_MAP)) + continue; + + maps [i].start = entry.start; + maps [i].end = entry.end; + i++; + + if (!entry.object.vm_object) + continue; + + /* We're only interested in `vm_object's */ + + if (kvm_read (server->machine.kd, + (unsigned long) entry.object.vm_object, + &object, sizeof (object)) != sizeof (object)) + glibtop_error_io_r (server, "kvm_read (object)"); + + /* If the object is of type vnode, add its size */ + + if (object.type != OBJT_VNODE) + continue; + + if (!object.handle) + continue; + + if (kvm_read (server->machine.kd, + (unsigned long) object.handle, + &vnode, sizeof (vnode)) != sizeof (vnode)) + glibtop_error_io_r (server, "kvm_read (vnode)"); + + if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) || + !vnode.v_data) continue; + + if (kvm_read (server->machine.kd, + (unsigned long) vnode.v_data, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + + if (kvm_read (server->machine.kd, + (unsigned long) vnode.v_mount, + &mount, sizeof (mount)) != sizeof (mount)) + glibtop_error_io_r (server, "kvm_read (mount)"); + + maps [i-1].inode = inode.i_number; + maps [i-1].device = inode.i_dev; + + } while (entry.next != first); + + return maps; +} diff --git a/sysdeps/freebsd/procmem.c b/sysdeps/freebsd/procmem.c index 92dc0835..313dbe2f 100644 --- a/sysdeps/freebsd/procmem.c +++ b/sysdeps/freebsd/procmem.c @@ -32,6 +32,10 @@ #include <vm/vm_object.h> #include <vm/vm_map.h> +#include <sys/vnode.h> +#include <ufs/ufs/quota.h> +#include <ufs/ufs/inode.h> + #include <sys/ucred.h> #include <sys/user.h> #include <sys/sysctl.h> @@ -89,6 +93,8 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, struct vmspace *vms, vmspace; struct vm_object object; struct plimit plimit; + struct vnode vnode; + struct inode inode; int count; glibtop_suid_enter (server); @@ -157,8 +163,29 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, /* If the object is of type vnode, add its size */ - if (object.type == OBJT_VNODE) - buf->share += object.un_pager.vnp.vnp_size; + if (object.type != OBJT_VNODE) + continue; + + buf->share += object.un_pager.vnp.vnp_size; + + if (!object.handle) + continue; + + if (kvm_read (server->machine.kd, + (unsigned long) object.handle, + &vnode, sizeof (vnode)) != sizeof (vnode)) + glibtop_error_io_r (server, "kvm_read (vnode)"); + + if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) || + !vnode.v_data) continue; + + if (kvm_read (server->machine.kd, + (unsigned long) vnode.v_data, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + + fprintf (stderr, "INODE: %ld\n", inode.i_number); + } buf->flags = _glibtop_sysdeps_proc_mem; diff --git a/sysdeps/names/Makefile.am b/sysdeps/names/Makefile.am index 3eb11bf3..65ebcf06 100644 --- a/sysdeps/names/Makefile.am +++ b/sysdeps/names/Makefile.am @@ -9,4 +9,4 @@ libgtop_names_la_SOURCES = cpu.c mem.c swap.c uptime.c loadavg.c \ proclist.c sysdeps.c procstate.c procuid.c \ proctime.c procmem.c procsignal.c \ prockernel.c procsegment.c fsusage.c \ - mountlist.c + mountlist.c procmap.c diff --git a/sysdeps/names/procmap.c b/sysdeps/names/procmap.c new file mode 100644 index 00000000..7c969b22 --- /dev/null +++ b/sysdeps/names/procmap.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the Gnome Top Library. + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + The Gnome Top Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Top Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <glibtop/procmap.h> + +const char *glibtop_names_proc_map [GLIBTOP_MAX_PROC_MAP] = +{ + "number", "total", "size" +}; + +const unsigned glibtop_types_proc_map [GLIBTOP_MAX_PROC_MAP] = +{ + GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG +}; + +const char *glibtop_labels_proc_map [GLIBTOP_MAX_PROC_MAP] = +{ + N_("Number of list elements"), + N_("Total size of list"), + N_("Size of a single list element") +}; + +const char *glibtop_descriptions_proc_map [GLIBTOP_MAX_PROC_MAP] = +{ + N_("Number of list elements"), + N_("Total size of list"), + N_("Size of a single list element") +}; diff --git a/sysdeps/names/sysdeps.c b/sysdeps/names/sysdeps.c index 367681a8..2359549a 100644 --- a/sysdeps/names/sysdeps.c +++ b/sysdeps/names/sysdeps.c @@ -26,8 +26,8 @@ const char *glibtop_names_sysdeps [GLIBTOP_MAX_SYSDEPS] = "features", "cpu", "mem", "swap", "uptime", "loadavg", "shm_limits", "msg_limits", "sem_limits", "proclist", "proc_state", "proc_uid", "proc_mem", "proc_time", - "proc_signal", "proc_kernel", "proc_segment", "mountlist", - "fsusage" + "proc_signal", "proc_kernel", "proc_segment", "proc_map", + "mountlist", "fsusage" }; const unsigned glibtop_types_sysdeps [GLIBTOP_MAX_SYSDEPS] = @@ -38,7 +38,7 @@ const unsigned glibtop_types_sysdeps [GLIBTOP_MAX_SYSDEPS] = GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG, - GLIBTOP_TYPE_ULONG + GLIBTOP_TYPE_ULONG, GLIBTOP_TYPE_ULONG }; const char *glibtop_labels_sysdeps [GLIBTOP_MAX_SYSDEPS] = @@ -60,6 +60,7 @@ const char *glibtop_labels_sysdeps [GLIBTOP_MAX_SYSDEPS] = N_("Process Signal information"), N_("Process Kernel Data information"), N_("Process Segment information"), + N_("Process Memory Map"), N_("Mount List"), N_("File System Usage"), }; @@ -83,6 +84,7 @@ const char *glibtop_descriptions_sysdeps [GLIBTOP_MAX_SYSDEPS] = N_("Process Signal information"), N_("Process Kernel Data information"), N_("Process Segment information"), + N_("Process Memory Map"), N_("List of currently mounted filesystems"), N_("File System Usage"), }; |