From 3bd2bd2c6d6ee9360a7171bd6a79f7e2a5dd7c87 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Mon, 18 Feb 2008 01:42:52 +0000 Subject: [PATCH] OpenBSD porting of sigar_proc_ functions --- src/os/darwin/darwin_sigar.c | 79 ++++++++++++++++++++++++++++-------- src/os/darwin/sigar_os.h | 8 +++- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/os/darwin/darwin_sigar.c b/src/os/darwin/darwin_sigar.c index b9678c6b..dcd5494c 100644 --- a/src/os/darwin/darwin_sigar.c +++ b/src/os/darwin/darwin_sigar.c @@ -101,7 +101,7 @@ # endif #endif -#ifdef SIGAR_FREEBSD5 +#if defined(SIGAR_FREEBSD5) #define KI_FD ki_fd #define KI_PID ki_pid @@ -122,7 +122,7 @@ #define KI_FLAG ki_flag #define KI_START ki_start -#else +#elif defined(DARWIN) || defined(SIGAR_FREEBSD4) || defined(__OpenBSD__) #define KI_FD kp_proc.p_fd #define KI_PID kp_proc.p_pid @@ -770,7 +770,7 @@ static int proc_fdinfo_get(sigar_t *sigar, sigar_pid_t pid, int *num) int sigar_os_proc_list_get(sigar_t *sigar, sigar_proc_list_t *proclist) { -#if defined(DARWIN) || defined(SIGAR_FREEBSD5) +#if defined(DARWIN) || defined(SIGAR_FREEBSD5) || defined(__OpenBSD__) int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PROC, 0 }; int i, num; size_t len; @@ -827,7 +827,11 @@ int sigar_os_proc_list_get(sigar_t *sigar, static int sigar_get_pinfo(sigar_t *sigar, sigar_pid_t pid) { - int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 }; +#ifdef __OpenBSD__ + int mib[] = { CTL_KERN, KERN_PROC2, KERN_PROC_PID, 0, sizeof(*sigar->pinfo), 1 }; +#else + int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 }; +#endif size_t len = sizeof(*sigar->pinfo); time_t timenow = time(NULL); mib[3] = pid; @@ -855,7 +859,7 @@ static int sigar_get_pinfo(sigar_t *sigar, sigar_pid_t pid) int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid, sigar_proc_mem_t *procmem) { -#ifdef DARWIN +#if defined(DARWIN) mach_port_t task, self = mach_task_self(); kern_return_t status; task_basic_info_data_t info; @@ -910,9 +914,9 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid, procmem->share = SIGAR_FIELD_NOTIMPL; return SIGAR_OK; -#else +#elif defined(__FreeBSD__) int status = sigar_get_pinfo(sigar, pid); - struct kinfo_proc *pinfo = sigar->pinfo; + bsd_pinfo_t *pinfo = sigar->pinfo; if (status != SIGAR_OK) { return status; @@ -928,25 +932,49 @@ int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid, procmem->page_faults = SIGAR_FIELD_NOTIMPL; procmem->minor_faults = SIGAR_FIELD_NOTIMPL; procmem->major_faults = SIGAR_FIELD_NOTIMPL; +#elif defined(__OpenBSD__) + int status = sigar_get_pinfo(sigar, pid); + bsd_pinfo_t *pinfo = sigar->pinfo; - return SIGAR_OK; + if (status != SIGAR_OK) { + return status; + } + + procmem->size = + (pinfo->p_vm_tsize + pinfo->p_vm_dsize + pinfo->p_vm_ssize) * sigar->pagesize; + + procmem->resident = pinfo->p_vm_rssize * sigar->pagesize; + + procmem->share = SIGAR_FIELD_NOTIMPL; + + procmem->minor_faults = pinfo->p_uru_minflt; + procmem->major_faults = pinfo->p_uru_majflt; + procmem->page_faults = procmem->minor_faults + procmem->major_faults; #endif + return SIGAR_OK; } int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid, sigar_proc_cred_t *proccred) { int status = sigar_get_pinfo(sigar, pid); - struct kinfo_proc *pinfo = sigar->pinfo; + bsd_pinfo_t *pinfo = sigar->pinfo; if (status != SIGAR_OK) { return status; } +#ifdef __OpenBSD__ + proccred->uid = pinfo->p_ruid; + proccred->gid = pinfo->p_rgid; + proccred->euid = pinfo->p_uid; + proccred->egid = pinfo->p_gid; +#else proccred->uid = pinfo->KI_UID; proccred->gid = pinfo->KI_GID; proccred->euid = pinfo->KI_EUID; proccred->egid = pinfo->KI_EGID; +#endif return SIGAR_OK; } @@ -1028,7 +1056,7 @@ int sigar_proc_time_get(sigar_t *sigar, sigar_pid_t pid, struct user user; #endif int status = sigar_get_pinfo(sigar, pid); - struct kinfo_proc *pinfo = sigar->pinfo; + bsd_pinfo_t *pinfo = sigar->pinfo; if (status != SIGAR_OK) { return status; @@ -1059,8 +1087,12 @@ int sigar_proc_time_get(sigar_t *sigar, sigar_pid_t pid, proctime->sys = tv2msec(user.u_stats.p_ru.ru_stime); proctime->total = proctime->user + proctime->sys; proctime->start_time = tv2msec(user.u_stats.p_start); -#else - /*XXX OpenBSD*/ +#elif defined(__OpenBSD__) + /* XXX *_usec */ + proctime->user = pinfo->p_uutime_sec * SIGAR_MSEC; + proctime->sys = pinfo->p_ustime_sec * SIGAR_MSEC; + proctime->total = proctime->user + proctime->sys; + proctime->start_time = pinfo->p_ustart_sec * SIGAR_MSEC; #endif return SIGAR_OK; @@ -1144,12 +1176,26 @@ int sigar_proc_state_get(sigar_t *sigar, sigar_pid_t pid, sigar_proc_state_t *procstate) { int status = sigar_get_pinfo(sigar, pid); - struct kinfo_proc *pinfo = sigar->pinfo; - + bsd_pinfo_t *pinfo = sigar->pinfo; +#ifdef __OpenBSD__ + int state = pinfo->p_stat; +#else + int state = pinfo->KI_STAT; +#endif + if (status != SIGAR_OK) { return status; } +#ifdef __OpenBSD__ + SIGAR_SSTRCPY(procstate->name, pinfo->p_comm); + procstate->ppid = pinfo->p_ppid; + procstate->priority = pinfo->p_priority; + procstate->nice = pinfo->p_nice; + procstate->tty = pinfo->p_tdev; + procstate->threads = SIGAR_FIELD_NOTIMPL; + procstate->processor = pinfo->p_cpuid; +#else SIGAR_SSTRCPY(procstate->name, pinfo->KI_COMM); procstate->ppid = pinfo->KI_PPID; procstate->priority = pinfo->KI_PRI; @@ -1157,6 +1203,7 @@ int sigar_proc_state_get(sigar_t *sigar, sigar_pid_t pid, procstate->tty = SIGAR_FIELD_NOTIMPL; /*XXX*/ procstate->threads = SIGAR_FIELD_NOTIMPL; procstate->processor = SIGAR_FIELD_NOTIMPL; +#endif #ifdef DARWIN status = sigar_proc_threads_get(sigar, pid, procstate); @@ -1165,7 +1212,7 @@ int sigar_proc_state_get(sigar_t *sigar, sigar_pid_t pid, } #endif - switch (pinfo->KI_STAT) { + switch (state) { case SIDL: procstate->state = 'D'; break; @@ -1461,7 +1508,7 @@ int sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid, { #ifdef __FreeBSD__ int status; - struct kinfo_proc *pinfo; + bsd_pinfo_t *pinfo; struct filedesc filed; #if 0 struct file **ofiles; diff --git a/src/os/darwin/sigar_os.h b/src/os/darwin/sigar_os.h index 29989b73..96329aeb 100644 --- a/src/os/darwin/sigar_os.h +++ b/src/os/darwin/sigar_os.h @@ -37,12 +37,18 @@ enum { KOFFSET_MAX }; +#ifdef __OpenBSD__ +typedef struct kinfo_proc2 bsd_pinfo_t; +#else +typedef struct kinfo_proc bsd_pinfo_t; +#endif + struct sigar_t { SIGAR_T_BASE; int pagesize; time_t last_getprocs; sigar_pid_t last_pid; - struct kinfo_proc *pinfo; + bsd_pinfo_t *pinfo; #ifdef DARWIN mach_port_t mach_port; #else