summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2013-07-10 22:04:40 +0400
committerIgor Pashev <pashev.igor@gmail.com>2013-07-10 22:20:42 +0400
commitbb3e012b6ec4efbadd17b851cb5d889ee088e920 (patch)
tree9ea7df61e0783b13cbf4929207cfa8ef3ac3ed8f /sysdeps
parente6bc5825e64282d560e8dca5cdc2bf590a8a8ce2 (diff)
downloadhtop-bb3e012b6ec4efbadd17b851cb5d889ee088e920.tar.gz
/proc/%d/status is not accessible
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/solaris.c28
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;
}