[SIGAR-115] fix proc_exe.name for self process
This commit is contained in:
parent
311714fcc3
commit
2f65249d52
@ -1057,6 +1057,40 @@ static int sigar_proc_path_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
|||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int proc_module_get_exe(void *data, char *name, int len)
|
||||||
|
{
|
||||||
|
sigar_proc_exe_t *procexe = (sigar_proc_exe_t *)data;
|
||||||
|
SIGAR_STRNCPY(procexe->name, name, sizeof(procexe->name));
|
||||||
|
return !SIGAR_OK; /* break loop */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sigar_which_exe_get(sigar_t *sigar, sigar_proc_exe_t *procexe)
|
||||||
|
{
|
||||||
|
char *path = getenv("PATH");
|
||||||
|
char exe[PATH_MAX];
|
||||||
|
if (path == NULL) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (path) {
|
||||||
|
char *ptr = strchr(path, ':');
|
||||||
|
if (!ptr) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
exe[0] = '\0';
|
||||||
|
strncat(exe, path, ptr-path);
|
||||||
|
strncat(exe, "/", 1);
|
||||||
|
strcat(exe, procexe->name);
|
||||||
|
if (access(exe, X_OK) == 0) {
|
||||||
|
SIGAR_STRNCPY(procexe->name, exe, sizeof(procexe->name));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
path = ptr+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
sigar_proc_exe_t *procexe)
|
sigar_proc_exe_t *procexe)
|
||||||
{
|
{
|
||||||
@ -1076,10 +1110,16 @@ int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
|||||||
|
|
||||||
/* Pgrab would return G_SELF error */
|
/* Pgrab would return G_SELF error */
|
||||||
if (pid == sigar_pid_get(sigar)) {
|
if (pid == sigar_pid_get(sigar)) {
|
||||||
/* XXX: dunno if this will always work? */
|
sigar_proc_modules_t procmods;
|
||||||
char *exe = getenv("_");
|
procmods.module_getter = proc_module_get_exe;
|
||||||
if (exe) {
|
procmods.data = procexe;
|
||||||
SIGAR_STRNCPY(procexe->name, exe, sizeof(procexe->name));
|
|
||||||
|
status =
|
||||||
|
sigar_dlinfo_modules(sigar, &procmods);
|
||||||
|
if (status == SIGAR_OK) {
|
||||||
|
if (procexe->name[0] != '/') {
|
||||||
|
sigar_which_exe_get(sigar, procexe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user