diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2013-07-10 22:04:40 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2013-07-10 22:20:42 +0400 |
commit | bb3e012b6ec4efbadd17b851cb5d889ee088e920 (patch) | |
tree | 9ea7df61e0783b13cbf4929207cfa8ef3ac3ed8f /sysdeps | |
parent | e6bc5825e64282d560e8dca5cdc2bf590a8a8ce2 (diff) | |
download | htop-bb3e012b6ec4efbadd17b851cb5d889ee088e920.tar.gz |
/proc/%d/status is not accessible
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/solaris.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/sysdeps/solaris.c b/sysdeps/solaris.c index 7fc2e3e..ddae1a5 100644 --- a/sysdeps/solaris.c +++ b/sysdeps/solaris.c @@ -96,7 +96,7 @@ bool sysdep_get_process_info(Process *process, pid_t pid) int fd; ssize_t r; psinfo_t info; - pstatus_t status; + prusage_t usage; snprintf(filename, sizeof(filename), "/proc/%d/psinfo", pid); fd = open(filename, O_RDONLY); @@ -105,15 +105,17 @@ bool sysdep_get_process_info(Process *process, pid_t pid) (void) close(fd); if (!r) return false; - snprintf(filename, sizeof(filename), "/proc/%d/status", pid); + snprintf(filename, sizeof(filename), "/proc/%d/usage", pid); fd = open(filename, O_RDONLY); if (-1 == fd) return false; - r = xread(fd, &status, sizeof(status)); + r = xread(fd, &usage, sizeof(usage)); (void) close(fd); if (!r) return false; process->state = info.pr_lwp.pr_state; + process->st_uid = info.pr_uid; + process->ppid = info.pr_ppid; process->pgrp = info.pr_pgid; process->session = info.pr_sid; @@ -122,10 +124,8 @@ bool sysdep_get_process_info(Process *process, pid_t pid) process->flags = info.pr_flag; long tix = sysconf(_SC_CLK_TCK); - process->utime = status.pr_utime.tv_sec * tix; - process->stime = status.pr_stime.tv_sec * tix; - process->cutime = status.pr_cutime.tv_sec * tix; - process->cstime = status.pr_cstime.tv_sec * tix; + process->utime = usage.pr_utime.tv_sec * tix; + process->stime = usage.pr_stime.tv_sec * tix; process->priority = info.pr_lwp.pr_pri; process->nice = info.pr_lwp.pr_nice; @@ -139,5 +139,19 @@ bool sysdep_get_process_info(Process *process, pid_t pid) process->comm = strdup(info.pr_psargs); + + /* XXX root only: */ + snprintf(filename, sizeof(filename), "/proc/%d/status", pid); + fd = open(filename, O_RDONLY); + if (fd > 0) { + pstatus_t status; + if (xread(fd, &status, sizeof(status)) > 0) { + process->cutime = status.pr_cutime.tv_sec * tix; + process->cstime = status.pr_cstime.tv_sec * tix; + } + (void) close(fd); + } + + return true; } |