From 56a0d6235862195ac7c557f5856ad1a99924f2a9 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 19 May 1998 23:03:56 +0000 Subject: [PATCH] added implementation for DEC OSF/1. * sysdeps/osf1/procuid.c (glibtop_get_proc_uid__r): added implementation for DEC OSF/1. --- sysdeps/osf1/procuid.c | 89 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/sysdeps/osf1/procuid.c b/sysdeps/osf1/procuid.c index 7fbb85fa..8635e8d3 100644 --- a/sysdeps/osf1/procuid.c +++ b/sysdeps/osf1/procuid.c @@ -22,11 +22,100 @@ #include #include +#include +#include + +#include +#include +#include + /* Provides detailed information about a process. */ +static const unsigned long _glibtop_sysdeps_proc_uid = +(1 << GLIBTOP_PROC_UID_UID) + (1 << GLIBTOP_PROC_UID_EUID) + +(1 << GLIBTOP_PROC_UID_GID) + (1 << GLIBTOP_PROC_UID_EGID) + +(1 << GLIBTOP_PROC_UID_PID) + (1 << GLIBTOP_PROC_UID_PPID) + +(1 << GLIBTOP_PROC_UID_PGRP) + (1 << GLIBTOP_PROC_UID_SESSION) + +(1 << GLIBTOP_PROC_UID_TTY) + (1 << GLIBTOP_PROC_UID_TPGID); + void glibtop_get_proc_uid__r (glibtop *server, glibtop_proc_uid *buf, pid_t pid) { + struct tbl_procinfo procinfo; + task_basic_info_data_t taskinfo; + int ret, info_count; + task_t thistask; + + glibtop_init (); + memset (buf, 0, sizeof (glibtop_proc_uid)); + + /* !!! THE FOLLOWING CODE RUNS SUID ROOT - CHANGE WITH CAUTION !!! */ + + setreuid (server->machine.uid, server->machine.euid); + + ret = table (TBL_PROCINFO, pid, (char *) &procinfo, 1, + sizeof (struct tbl_procinfo)); + + if (setreuid (server->machine.euid, server->machine.uid)) + _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + if (ret != 1) return; + + buf->uid = procinfo.pi_ruid; + buf->euid = procinfo.pi_svuid; + buf->gid = procinfo.pi_rgid; + buf->egid = procinfo.pi_svgid; + + buf->pid = procinfo.pi_pid; + buf->ppid = procinfo.pi_ppid; + buf->pgrp = procinfo.pi_pgrp; + buf->tty = procinfo.pi_ttyd; + buf->session = procinfo.pi_session; + buf->tpgid = procinfo.pi_tpgrp; + + buf->flags = _glibtop_sysdeps_proc_uid; + + /* !!! THE FOLLOWING CODE RUNS SUID ROOT - CHANGE WITH CAUTION !!! */ + + setreuid (server->machine.uid, server->machine.euid); + + /* Get task structure. */ + + ret = task_by_unix_pid (task_self(), procinfo.pi_pid, &thistask); + + if (ret == KERN_SUCCESS) { + + /* Get taskinfo about this task. */ + + info_count = TASK_BASIC_INFO_COUNT; + + ret = task_info (thistask, TASK_BASIC_INFO, + (task_info_t) &taskinfo, &info_count); + + } + + if (setreuid (server->machine.euid, server->machine.uid)) + _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + if (ret != KERN_SUCCESS) return; + + buf->priority = taskinfo.base_priority; + + buf->flags += (1 << GLIBTOP_PROC_UID_PRIORITY); + + errno = 0; + + ret = getpriority (PRIO_PROCESS, pid); + + if ((ret == -1) && (errno != 0)) return; + + buf->nice = ret; + + buf->flags += (1 << GLIBTOP_PROC_UID_NICE); }