summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Baulig <martin@home-of-linux.org>1998-08-10 16:57:44 +0000
committerMartin Baulig <martin@src.gnome.org>1998-08-10 16:57:44 +0000
commitd9361d388cdbb18a25459c7f5bd70bb37fe97569 (patch)
tree583dea7a2e4a56595a503528ba3cd170fa6a0781
parentb6885555c1c40e4d554a5c6d74e7c2f375b41299 (diff)
downloadlibgtop-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--ChangeLog3
-rw-r--r--examples/Makefile.am13
-rw-r--r--examples/first.c31
-rw-r--r--examples/procmap.c96
-rw-r--r--features.def1
-rw-r--r--glibtop.h4
-rw-r--r--include/glibtop/Makefile.am2
-rw-r--r--include/glibtop/command.h7
-rw-r--r--include/glibtop/mountlist.h2
-rw-r--r--include/glibtop/procmap.h103
-rw-r--r--include/glibtop/sysdeps.h8
-rw-r--r--include/glibtop/union.h2
-rw-r--r--lib/sysdeps.c6
-rw-r--r--src/daemon/main.c9
-rw-r--r--src/daemon/server.c3
-rw-r--r--src/daemon/slave.c12
-rw-r--r--sysdeps/common/sysdeps_suid.c3
-rw-r--r--sysdeps/freebsd/Makefile.am2
-rw-r--r--sysdeps/freebsd/glibtop_server.h1
-rw-r--r--sysdeps/freebsd/procmap.c176
-rw-r--r--sysdeps/freebsd/procmem.c31
-rw-r--r--sysdeps/names/Makefile.am2
-rw-r--r--sysdeps/names/procmap.c46
-rw-r--r--sysdeps/names/sysdeps.c8
24 files changed, 552 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 8168eea5..a2e26ef1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/glibtop.h b/glibtop.h
index 6d82f299..e57d08a1 100644
--- a/glibtop.h
+++ b/glibtop.h
@@ -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"),
};