proc_modules impl
This commit is contained in:
parent
2672fc8219
commit
018f634896
|
@ -835,7 +835,45 @@ int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
sigar_proc_modules_t *procmods)
|
sigar_proc_modules_t *procmods)
|
||||||
{
|
{
|
||||||
return SIGAR_ENOTIMPL;
|
FILE *fp;
|
||||||
|
char buffer[BUFSIZ], *ptr;
|
||||||
|
unsigned long inode, last_inode = 0;
|
||||||
|
|
||||||
|
(void)SIGAR_PROC_FILENAME(buffer, pid, "/maps");
|
||||||
|
|
||||||
|
if (!(fp = fopen(buffer, "r"))) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((ptr = fgets(buffer, sizeof(buffer), fp))) {
|
||||||
|
int len;
|
||||||
|
/* skip region, flags, offset, dev */
|
||||||
|
ptr = sigar_skip_multiple_token(ptr, 4);
|
||||||
|
inode = sigar_strtoul(ptr);
|
||||||
|
|
||||||
|
if ((inode == 0) || (inode == last_inode)) {
|
||||||
|
last_inode = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_inode = inode;
|
||||||
|
SIGAR_SKIP_SPACE(ptr);
|
||||||
|
len = strlen(ptr);
|
||||||
|
ptr[len-1] = '\0'; /* chop \n */
|
||||||
|
|
||||||
|
int status =
|
||||||
|
procmods->module_getter(procmods->data,
|
||||||
|
ptr, len-1);
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
/* not an error; just stop iterating */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
|
|
Loading…
Reference in New Issue