{
int fd;
int ret;
- char *dup_cmd_path;
+ char cmdline[PATH_MAX];
char cmdline_path[PATH_MAX];
+ char exe_link[PATH_MAX];
snprintf(cmdline_path, sizeof(cmdline_path),
"/proc/%s/cmdline", cinfo->pid_info);
return -1;
}
- ret = read(fd, cinfo->cmd_path, sizeof(cinfo->cmd_path) - 1);
+ ret = read(fd, cmdline, sizeof(cmdline) - 1);
if (ret <= 0) {
_E("Failed to read %s", cmdline_path);
goto error;
- } else if (access(cinfo->cmd_path, F_OK) == -1) {
- _E("Invalid path %s", cinfo->cmd_path);
- ret = -1;
+ }
+
+ snprintf(cinfo->cmd_name, sizeof(cinfo->cmd_name), "%s",
+ basename(cmdline));
+
+ snprintf(exe_link, sizeof(exe_link),
+ "/proc/%s/exe", cinfo->pid_info);
+
+ ret = readlink(exe_link, cinfo->cmd_path,
+ sizeof(cinfo->cmd_path) - 1);
+ if (ret <= 0) {
+ _E("Failed to read link %s", exe_link);
goto error;
}
+
cinfo->cmd_path[ret] = '\0';
- dup_cmd_path = strdup(cinfo->cmd_path);
- snprintf(cinfo->cmd_name, sizeof(cinfo->cmd_name),
- "%s", basename(dup_cmd_path));
- free(dup_cmd_path);
+ if (access(cinfo->cmd_path, F_OK) == -1) {
+ _E("Invalid path %s", cinfo->cmd_path);
+ ret = -1;
+ goto error;
+ }
error:
close(fd);