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.
This commit is contained in:
Drazen Kacar
1999-05-03 03:40:24 +00:00
parent fd2ddf8b50
commit aa6f26f9fb
3 changed files with 79 additions and 5 deletions

View File

@@ -1,6 +1,16 @@
1999-05-03 Drazen Kacar <dave@srce.hr> 1999-05-03 Drazen Kacar <dave@srce.hr>
* 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 <dave@srce.hr>
* glibtop_private.h, procdata.c (glibtop_get_proc_status_s):
Read pstatus info from /proc Read pstatus info from /proc
* procsignal.c (glibtop_get_proc_signal_s): Implemented * procsignal.c (glibtop_get_proc_signal_s): Implemented

View File

@@ -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); int glibtop_get_proc_credentials_s(glibtop *, struct prcred *, pid_t);
/* Read /proc/<pid>/status */ /* Read /proc/<pid>/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 */ /* Reread kstat chains */
void glibtop_get_kstats(glibtop *); void glibtop_get_kstats(glibtop *);

View File

@@ -27,7 +27,16 @@
#include <glibtop/xmalloc.h> #include <glibtop/xmalloc.h>
#include <glibtop/procmap.h> #include <glibtop/procmap.h>
static const unsigned long _glibtop_sysdeps_proc_map = 0; #include <errno.h>
#include <alloca.h>
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. */ /* Init function. */
@@ -42,9 +51,64 @@ glibtop_init_proc_map_s (glibtop *server)
glibtop_map_entry * glibtop_map_entry *
glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) 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)); memset (buf, 0, sizeof (glibtop_proc_map));
return NULL; 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;
}
buf->flags = _glibtop_sysdeps_proc_map;
return entry;
} }