From aa6f26f9fbb844b4ba149789536aa959b2e97981 Mon Sep 17 00:00:00 2001 From: Drazen Kacar Date: Mon, 3 May 1999 03:40:24 +0000 Subject: [PATCH] Fixed typoo. * glibtop_private.h: Fixed typoo. * procmap.c (glibtop_get_proc_map_s): Implemented start, end, offset and perm for mapped segments. File name and inode should be accessible from bunyip kstat data. The only obstacle is that the data format is undocumented and possibly not the same accross releases. --- sysdeps/solaris/ChangeLog | 12 +++++- sysdeps/solaris/glibtop_private.h | 2 +- sysdeps/solaris/procmap.c | 70 +++++++++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/sysdeps/solaris/ChangeLog b/sysdeps/solaris/ChangeLog index 7ae5ceb0..fb05754c 100644 --- a/sysdeps/solaris/ChangeLog +++ b/sysdeps/solaris/ChangeLog @@ -1,6 +1,16 @@ 1999-05-03 Drazen Kacar - * glibtop_private.h, procdata.c (glibtop_get_proc_signal_s): + * glibtop_private.h: Fixed typoo. + + * procmap.c (glibtop_get_proc_map_s): Implemented start, end, + offset and perm for mapped segments. File name and inode + should be accessible from bunyip kstat data. The only + obstacle is that the data format is undocumented and + possibly not the same accross releases. + +1999-05-03 Drazen Kacar + + * glibtop_private.h, procdata.c (glibtop_get_proc_status_s): Read pstatus info from /proc * procsignal.c (glibtop_get_proc_signal_s): Implemented diff --git a/sysdeps/solaris/glibtop_private.h b/sysdeps/solaris/glibtop_private.h index 3737c889..d765c35a 100644 --- a/sysdeps/solaris/glibtop_private.h +++ b/sysdeps/solaris/glibtop_private.h @@ -44,7 +44,7 @@ int glibtop_get_proc_data_usage_s (glibtop *server, struct prusage *prusage, pid int glibtop_get_proc_credentials_s(glibtop *, struct prcred *, pid_t); /* Read /proc//status */ -glibtop_get_proc_status_s(glibtop *, struct pstatus *, pid_t); +int glibtop_get_proc_status_s(glibtop *, struct pstatus *, pid_t); /* Reread kstat chains */ void glibtop_get_kstats(glibtop *); diff --git a/sysdeps/solaris/procmap.c b/sysdeps/solaris/procmap.c index 5a6c479a..cf47710a 100644 --- a/sysdeps/solaris/procmap.c +++ b/sysdeps/solaris/procmap.c @@ -27,7 +27,16 @@ #include #include -static const unsigned long _glibtop_sysdeps_proc_map = 0; +#include +#include + +static const unsigned long _glibtop_sysdeps_proc_map = +(1L << GLIBTOP_PROC_MAP_NUMBER) + (1L << GLIBTOP_PROC_MAP_TOTAL) + +(1L << GLIBTOP_PROC_MAP_SIZE); +static const unsigned long _glibtop_sysdeps_map_entry = +(1L << GLIBTOP_MAP_ENTRY_START) + (1L << GLIBTOP_MAP_ENTRY_END) + +(1L << GLIBTOP_MAP_ENTRY_OFFSET) + (1L << GLIBTOP_MAP_ENTRY_PERM); + /* Init function. */ @@ -42,9 +51,64 @@ glibtop_init_proc_map_s (glibtop *server) glibtop_map_entry * glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) { - glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0); + int fd, i, nmaps; + prmap_t *maps; + glibtop_map_entry *entry; + struct stat inode; + char buffer[BUFSIZ]; memset (buf, 0, sizeof (glibtop_proc_map)); + + sprintf(buffer, "/proc/%d/map", (int)pid); + if((fd = open(buffer, O_RDONLY)) < 0) + { + if(errno != EPERM && errno != EACCES) + glibtop_warn_io_r(server, "open (%s)", buffer); + return; + } + if(fstat(fd, &inode) < 0) + { + if(errno != EOVERFLOW) + glibtop_warn_io_r(server, "fstat (%s)", buffer); + /* else call daemon for 64-bit support */ + close(fd); + return; + } + maps = alloca(inode.st_size); + nmaps = inode.st_size / sizeof(prmap_t); + if(pread(fd, maps, inode.st_size, 0) != inode.st_size) + { + glibtop_warn_io_r(server, "pread (%s)", buffer); + close(fd); + return; + } + close(fd); + if(!(entry = glibtop_malloc_r(server, nmaps * sizeof(glibtop_map_entry)))) + return; + + buf->number = nmaps; + buf->size = sizeof(glibtop_map_entry); + buf->total = nmaps * sizeof(glibtop_map_entry); + + memset(entry, 0, nmaps * sizeof(glibtop_map_entry)); + for(i = 0; i < nmaps; ++i) + { + entry[i].start = maps[i].pr_vaddr; + entry[i].end = maps[i].pr_vaddr + maps[i].pr_size; + entry[i].offset = maps[i].pr_offset; + if(maps[i].pr_mflags & MA_READ) + entry[i].perm |= GLIBTOP_MAP_PERM_READ; + if(maps[i].pr_mflags & MA_WRITE) + entry[i].perm |= GLIBTOP_MAP_PERM_WRITE; + if(maps[i].pr_mflags & MA_EXEC) + entry[i].perm |= GLIBTOP_MAP_PERM_EXECUTE; + if(maps[i].pr_mflags & MA_SHARED) + entry[i].perm |= GLIBTOP_MAP_PERM_SHARED; + else + entry[i].perm |= GLIBTOP_MAP_PERM_PRIVATE; + entry[i].flags = _glibtop_sysdeps_map_entry; + } - return NULL; + buf->flags = _glibtop_sysdeps_proc_map; + return entry; }