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 | |
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'.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | examples/Makefile.am | 13 | ||||
-rw-r--r-- | examples/first.c | 31 | ||||
-rw-r--r-- | examples/procmap.c | 96 | ||||
-rw-r--r-- | features.def | 1 | ||||
-rw-r--r-- | glibtop.h | 4 | ||||
-rw-r--r-- | include/glibtop/Makefile.am | 2 | ||||
-rw-r--r-- | include/glibtop/command.h | 7 | ||||
-rw-r--r-- | include/glibtop/mountlist.h | 2 | ||||
-rw-r--r-- | include/glibtop/procmap.h | 103 | ||||
-rw-r--r-- | include/glibtop/sysdeps.h | 8 | ||||
-rw-r--r-- | include/glibtop/union.h | 2 | ||||
-rw-r--r-- | lib/sysdeps.c | 6 | ||||
-rw-r--r-- | src/daemon/main.c | 9 | ||||
-rw-r--r-- | src/daemon/server.c | 3 | ||||
-rw-r--r-- | src/daemon/slave.c | 12 | ||||
-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 |
24 files changed, 552 insertions, 19 deletions
@@ -1,5 +1,8 @@ 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'. + * include/glibtop/proctime.h (glibtop_proc_time): Added new fields `rtime' and `frequency'. diff --git a/examples/Makefile.am b/examples/Makefile.am index 301a0da2..5b0931a9 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -8,6 +8,7 @@ DEFS = @DEFS@ bin_PROGRAMS = first first_static second second_static \ mountlist mountlist_static \ + procmap procmap_static \ @guile_examples@ EXTRA_PROGRAMS = third third_static @@ -32,6 +33,18 @@ second_static_SOURCES = $(second_SOURCES) second_static_LDADD = $(second_LDADD) second_static_LDFLAGS = -static +procmap_SOURCES = procmap.c +procmap_LDADD = $(top_builddir)/lib/libgtop.la \ + $(top_builddir)/sysdeps/common/libgtop_common.la \ + $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \ + @INTLLIBS@ @LIBSUPPORT@ @libs_xauth@ + +procmap_static_SOURCES = $(procmap_SOURCES) +procmap_static_LDADD = $(procmap_LDADD) +procmap_static_LDFLAGS = -static + + + third_guile_names_LIBS = $(top_builddir)/sysdeps/guile/names/libgtop_guile_names.la third_names_LIBS = $(top_builddir)/sysdeps/names/libgtop_names.la diff --git a/examples/first.c b/examples/first.c index cd83dbcf..5113bebb 100644 --- a/examples/first.c +++ b/examples/first.c @@ -32,6 +32,7 @@ #include <glibtop/sysdeps.h> #include <sys/resource.h> +#include <sys/mman.h> #ifndef PROFILE_COUNT #define PROFILE_COUNT 1 @@ -43,10 +44,12 @@ main (int argc, char *argv []) glibtop_union data; glibtop_sysdeps sysdeps; unsigned c, method, count, port, i, *ptr; - char buffer [BUFSIZ]; + char buffer [BUFSIZ], *mmap_ptr; struct rlimit rlim; struct rusage ru; + struct stat statb; pid_t pid, ppid; + int fd; count = PROFILE_COUNT; @@ -74,6 +77,18 @@ main (int argc, char *argv []) glibtop_init_r (&glibtop_global_server, 0, 0); + fd = open ("/COPYRIGHT", O_RDONLY); + if (!fd) glibtop_error_io ("open (/COPYRIGHT)"); + + if (stat ("/COPYRIGHT", &statb)) + glibtop_error_io ("stat (/COPYRIGHT)"); + + mmap_ptr = mmap (NULL, statb.st_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (!mmap_ptr) glibtop_error_io ("mmap (/COPYRIGHT)"); + + fprintf (stderr, "MMAP: %p - %lu\n", mmap_ptr, statb.st_size); + for (c = 0; c < PROFILE_COUNT; c++) glibtop_get_cpu (&data.cpu); @@ -257,6 +272,20 @@ main (int argc, char *argv []) (unsigned long) data.proc_mem.rss, (unsigned long) data.proc_mem.rss_rlim); + mmap_ptr [0] = 'M'; + + glibtop_get_proc_mem (&data.proc_mem, pid); + + printf ("Proc_Mem PID %5u (0x%08lx): " + "%lu %lu %lu %lu %lu %lu\n", pid, + (unsigned long) data.proc_mem.flags, + (unsigned long) data.proc_mem.size, + (unsigned long) data.proc_mem.vsize, + (unsigned long) data.proc_mem.resident, + (unsigned long) data.proc_mem.share, + (unsigned long) data.proc_mem.rss, + (unsigned long) data.proc_mem.rss_rlim); + getrusage (RUSAGE_SELF, &ru); fprintf (stderr, "GETRUSAGE: (%ld, %ld) - (%ld, %ld)\n", diff --git a/examples/procmap.c b/examples/procmap.c new file mode 100644 index 00000000..33514227 --- /dev/null +++ b/examples/procmap.c @@ -0,0 +1,96 @@ +/* $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 <locale.h> + +#include <glibtop.h> +#include <glibtop/open.h> +#include <glibtop/close.h> +#include <glibtop/xmalloc.h> + +#include <glibtop/parameter.h> + +#include <glibtop/procmap.h> + +#include <sys/resource.h> +#include <sys/mman.h> + +#ifndef PROFILE_COUNT +#define PROFILE_COUNT 1 +#endif + +int +main (int argc, char *argv []) +{ + glibtop_proc_map procmap; + glibtop_map_entry *maps; + unsigned method, count, port, i, *ptr; + char buffer [BUFSIZ]; + pid_t pid; + + count = PROFILE_COUNT; + + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, GTOPLOCALEDIR); + textdomain (PACKAGE); + + glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_INIT_NO_OPEN); + + glibtop_get_parameter (GLIBTOP_PARAM_METHOD, &method, sizeof (method)); + + printf ("Method = %d\n", method); + + count = glibtop_get_parameter (GLIBTOP_PARAM_COMMAND, buffer, BUFSIZ); + buffer [count] = 0; + + printf ("Command = '%s'\n", buffer); + + count = glibtop_get_parameter (GLIBTOP_PARAM_HOST, buffer, BUFSIZ); + buffer [count] = 0; + + glibtop_get_parameter (GLIBTOP_PARAM_PORT, &port, sizeof (port)); + + printf ("Host = '%s' - %u\n\n", buffer, port); + + glibtop_init_r (&glibtop_global_server, 0, 0); + + if ((argc != 2) || (sscanf (argv [1], "%d", &pid) != 1)) + glibtop_error ("Usage: %s pid", argv [0]); + + fprintf (stderr, "Getting memory maps for pid %d.\n\n", pid); + + maps = glibtop_get_proc_map (&procmap, pid); + + for (i = 0; i < procmap.number; i++) { + fprintf (stderr, "%08x - %08x - %08lu - %08lu - '%s'\n", + (unsigned long) maps [i].start, + (unsigned long) maps [i].end, + (unsigned long) maps [i].device, + (unsigned long) maps [i].inode, + devname (maps [i].device, S_IFBLK)); + } + + glibtop_free (maps); + + glibtop_close (); + + exit (0); +} diff --git a/features.def b/features.def index 97098458..abdf6be4 100644 --- a/features.def +++ b/features.def @@ -14,5 +14,6 @@ void|proc_time|long(start_time,rtime,utime,stime,cutime,cstime,timeout,it_real_v void|proc_signal|ulong(signal,blocked,sigignore,sigcatch)|pid_t(pid) void|proc_kernel|ulong(k_flags,min_flt,maj_flt,cmin_flt,cmaj_flt,kstk_esp,kstk_eip,nwchan):str(wchan)|pid_t(pid) void|proc_segment|long(trs,lrs,drs,dt):ulong(start_code,end_code,start_stack)|pid_t(pid) +glibtop_map_entry *|proc_map|ulong(number,size,total)|pid_t(pid) glibtop_mountentry *|@mountlist|ulong(number,size,total)|pid_t(all_fs) void|@fsusage|ulong(blocks,bfree,bavail,files,ffree)|string|mount_dir @@ -31,6 +31,10 @@ #include <glibtop_machine.h> #endif +#ifndef GLIBTOP_MOUNTENTRY_LEN +#define GLIBTOP_MOUNTENTRY_LEN 79 +#endif + typedef struct _glibtop glibtop; #include <glibtop/sysdeps.h> diff --git a/include/glibtop/Makefile.am b/include/glibtop/Makefile.am index 29cacae0..d56603a8 100644 --- a/include/glibtop/Makefile.am +++ b/include/glibtop/Makefile.am @@ -6,4 +6,4 @@ glibtop_HEADERS = close.h loadavg.h prockernel.h procstate.h \ procmem.h procuid.h swap.h write.h error.h open.h \ procsegment.h read.h sysdeps.h xmalloc.h global.h \ procsignal.h read_data.h union.h types.h \ - parameter.h mountlist.h fsusage.h + parameter.h mountlist.h fsusage.h procmap.h diff --git a/include/glibtop/command.h b/include/glibtop/command.h index afbb0237..5aaccf8e 100644 --- a/include/glibtop/command.h +++ b/include/glibtop/command.h @@ -48,11 +48,12 @@ __BEGIN_DECLS #define GLIBTOP_CMND_PROC_SIGNAL 15 #define GLIBTOP_CMND_PROC_KERNEL 16 #define GLIBTOP_CMND_PROC_SEGMENT 17 +#define GLIBTOP_CMND_PROC_MAP 18 -#define GLIBTOP_CMND_MOUNTLIST 18 -#define GLIBTOP_CMND_FSUSAGE 19 +#define GLIBTOP_CMND_MOUNTLIST 19 +#define GLIBTOP_CMND_FSUSAGE 20 -#define GLIBTOP_MAX_CMND 20 +#define GLIBTOP_MAX_CMND 21 #define _GLIBTOP_PARAM_SIZE 16 diff --git a/include/glibtop/mountlist.h b/include/glibtop/mountlist.h index 715a9dd8..1cc0a918 100644 --- a/include/glibtop/mountlist.h +++ b/include/glibtop/mountlist.h @@ -33,8 +33,6 @@ __BEGIN_DECLS #define GLIBTOP_MAX_MOUNTLIST 3 -#define GLIBTOP_MOUNTENTRY_LEN 79 - typedef struct _glibtop_mountentry glibtop_mountentry; typedef struct _glibtop_mountlist glibtop_mountlist; diff --git a/include/glibtop/procmap.h b/include/glibtop/procmap.h new file mode 100644 index 00000000..215f0045 --- /dev/null +++ b/include/glibtop/procmap.h @@ -0,0 +1,103 @@ +/* $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. */ + +#ifndef __GLIBTOP_PROC_MAP_H__ +#define __GLIBTOP_PROC_MAP_H__ + +#include <glibtop.h> +#include <glibtop/global.h> + +__BEGIN_DECLS + +#define GLIBTOP_PROC_MAP_NUMBER 0 +#define GLIBTOP_PROC_MAP_TOTAL 1 +#define GLIBTOP_PROC_MAP_SIZE 2 + +#define GLIBTOP_MAX_PROC_MAP 3 + +typedef struct _glibtop_map_entry glibtop_map_entry; + +typedef struct _glibtop_proc_map glibtop_proc_map; + +struct _glibtop_map_entry +{ + u_int64_t start, end, inode, device; +}; + +struct _glibtop_proc_map +{ + u_int64_t flags, + number, /* GLIBTOP_PROC_MAP_NUMBER */ + total, /* GLIBTOP_PROC_MAP_TOTAL */ + size; /* GLIBTOP_PROC_MAP_SIZE */ +}; + +#define glibtop_get_proc_map(proc_map,pid) glibtop_get_proc_map_l(glibtop_global_server, proc_map, pid) + +#if GLIBTOP_SUID_PROC_MAP +#define glibtop_get_proc_map_r glibtop_get_proc_map_p +#else +#define glibtop_get_proc_map_r glibtop_get_proc_map_s +#endif + +extern glibtop_map_entry *glibtop_get_proc_map_l __P((glibtop *, glibtop_proc_map *, pid_t)); + +#if GLIBTOP_SUID_PROC_MAP +extern void glibtop_init_proc_map_p __P((glibtop *)); +extern glibtop_map_entry *glibtop_get_proc_map_p __P((glibtop *, glibtop_proc_map *, pid_t)); +#else +extern void glibtop_init_proc_map_s __P((glibtop *)); +extern glibtop_map_entry *glibtop_get_proc_map_s __P((glibtop *, glibtop_proc_map *, pid_t)); +#endif + +#ifdef GLIBTOP_GUILE + +/* You need to link with -lgtop_guile to get this stuff here. */ + +extern SCM glibtop_guile_get_proc_map __P((SCM)); + +#endif + +#ifdef GLIBTOP_GUILE_NAMES + +/* You need to link with -lgtop_guile_names to get this stuff here. */ + +extern SCM glibtop_guile_names_proc_map __P((void)); +extern SCM glibtop_guile_types_proc_map __P((void)); +extern SCM glibtop_guile_labels_proc_map __P((void)); +extern SCM glibtop_guile_descriptions_proc_map __P((void)); + +#endif + +#ifdef GLIBTOP_NAMES + +/* You need to link with -lgtop_names to get this stuff here. */ + +extern const char *glibtop_names_proc_map []; +extern const unsigned glibtop_types_proc_map []; +extern const char *glibtop_labels_proc_map []; +extern const char *glibtop_descriptions_proc_map []; + +#endif + +__END_DECLS + +#endif diff --git a/include/glibtop/sysdeps.h b/include/glibtop/sysdeps.h index 14880f28..58c3fc11 100644 --- a/include/glibtop/sysdeps.h +++ b/include/glibtop/sysdeps.h @@ -43,10 +43,11 @@ __BEGIN_DECLS #define GLIBTOP_SYSDEPS_PROC_SIGNAL 14 #define GLIBTOP_SYSDEPS_PROC_KERNEL 15 #define GLIBTOP_SYSDEPS_PROC_SEGMENT 16 -#define GLIBTOP_SYSDEPS_MOUNTLIST 17 -#define GLIBTOP_SYSDEPS_FSUSAGE 18 +#define GLIBTOP_SYSDEPS_PROC_MAP 17 +#define GLIBTOP_SYSDEPS_MOUNTLIST 18 +#define GLIBTOP_SYSDEPS_FSUSAGE 19 -#define GLIBTOP_MAX_SYSDEPS 19 +#define GLIBTOP_MAX_SYSDEPS 20 #define GLIBTOP_SYSDEPS_ALL ((1 << GLIBTOP_MAX_SYSDEPS) - 1) @@ -76,6 +77,7 @@ struct _glibtop_sysdeps proc_signal, /* glibtop_proc_signal */ proc_kernel, /* glibtop_proc_kernel */ proc_segment, /* glibtop_proc_segment */ + proc_map, /* glibtop_proc_map */ mountlist, /* glibtop_mountlist */ fsusage; /* glibtop_fsusage */ }; diff --git a/include/glibtop/union.h b/include/glibtop/union.h index b04cf808..6a3f7c85 100644 --- a/include/glibtop/union.h +++ b/include/glibtop/union.h @@ -39,6 +39,7 @@ #include <glibtop/procsignal.h> #include <glibtop/prockernel.h> #include <glibtop/procsegment.h> +#include <glibtop/procmap.h> #include <glibtop/mountlist.h> #include <glibtop/fsusage.h> @@ -65,6 +66,7 @@ union _glibtop_union glibtop_proc_signal proc_signal; glibtop_proc_kernel proc_kernel; glibtop_proc_segment proc_segment; + glibtop_proc_map proc_map; glibtop_mountlist mountlist; glibtop_fsusage fsusage; }; diff --git a/lib/sysdeps.c b/lib/sysdeps.c index 17227665..7f18fe2d 100644 --- a/lib/sysdeps.c +++ b/lib/sysdeps.c @@ -37,7 +37,8 @@ GLIBTOP_SUID_PROC_MEM + GLIBTOP_SUID_PROC_TIME + GLIBTOP_SUID_PROC_SIGNAL + GLIBTOP_SUID_PROC_KERNEL + -GLIBTOP_SUID_PROC_SEGMENT; +GLIBTOP_SUID_PROC_SEGMENT + +GLIBTOP_SUID_PROC_MAP; glibtop_init_func_t _glibtop_init_hook_s [] = { #if !GLIBTOP_SUID_CPU @@ -88,6 +89,9 @@ glibtop_init_func_t _glibtop_init_hook_s [] = { #if !GLIBTOP_SUID_PROC_SEGMENT glibtop_init_proc_segment_s, #endif +#if !GLIBTOP_SUID_PROC_MAP + glibtop_init_proc_map_s, +#endif NULL }; diff --git a/src/daemon/main.c b/src/daemon/main.c index 00e53cf7..69c2caf4 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -141,6 +141,15 @@ handle_parent_connection (int s) resp->u.data.proclist.total, ptr); glibtop_free_r (server, ptr); break; + case GLIBTOP_CMND_PROC_MAP: + memcpy (&pid, parameter, sizeof (pid_t)); + ptr = glibtop_get_proc_map_l (server, + &resp->u.data.proc_map, + pid); + do_output (s, resp, _offset_data (proc_map), + resp->u.data.proc_map.total, ptr); + glibtop_free_r (server, ptr); + break; case GLIBTOP_CMND_PROC_STATE: memcpy (&pid, parameter, sizeof (pid_t)); glibtop_get_proc_state_l diff --git a/src/daemon/server.c b/src/daemon/server.c index c9785423..c8672b8d 100644 --- a/src/daemon/server.c +++ b/src/daemon/server.c @@ -44,7 +44,8 @@ GLIBTOP_SUID_PROC_MEM + GLIBTOP_SUID_PROC_TIME + GLIBTOP_SUID_PROC_SIGNAL + GLIBTOP_SUID_PROC_KERNEL + -GLIBTOP_SUID_PROC_SEGMENT; +GLIBTOP_SUID_PROC_SEGMENT + +GLIBTOP_SUID_PROC_MEM; #include <fcntl.h> #include <locale.h> diff --git a/src/daemon/slave.c b/src/daemon/slave.c index 33ed1e23..68a33b6a 100644 --- a/src/daemon/slave.c +++ b/src/daemon/slave.c @@ -30,6 +30,7 @@ handle_slave_connection (int input, int output) char parameter [BUFSIZ]; int64_t *param_ptr; void *ptr; + pid_t pid; glibtop_send_version (glibtop_global_server, output); @@ -75,6 +76,17 @@ handle_slave_connection (int input, int output) glibtop_free_r (server, ptr); break; #endif +#if GLIBTOP_SUID_PROC_MAP + case GLIBTOP_CMND_PROC_MAP: + memcpy (&pid, parameter, sizeof (pid_t)); + ptr = glibtop_get_proc_map_p (server, + &resp->u.data.proc_map, + pid); + do_output (output, resp, _offset_data (proc_map), + resp->u.data.proc_map.total, ptr); + glibtop_free_r (server, ptr); + break; +#endif default: handle_slave_command (cmnd, resp, parameter); do_output (output, resp, resp->offset, 0, NULL); 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"), }; |