Index: process_stats.c =================================================================== RCS file: /cvs/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c,v retrieving revision 1.82 diff -u -r1.82 process_stats.c --- process_stats.c 9 Oct 2006 14:47:58 -0000 1.82 +++ process_stats.c 11 Jun 2010 15:49:47 -0000 @@ -105,9 +105,14 @@ int num, i; #endif #ifdef ALLBSD +#ifdef OPENBSD + int mib[6]; + struct kinfo_proc2 *kp_stats; +#else int mib[4]; - size_t size; struct kinfo_proc *kp_stats; +#endif + size_t size; int procs, i; char *proctitle; #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) @@ -346,17 +351,36 @@ #endif #ifdef ALLBSD +#ifdef OPENBSD + mib[0] = CTL_KERN; + mib[1] = KERN_PROC2; + mib[2] = KERN_PROC_ALL; + mib[3] = 0; + mib[4] = sizeof(struct KPROCSTRUCT); + mib[5] = 0; +#else mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_ALL; +#endif +#ifdef OPENBSD + if(sysctl(mib, 6, NULL, &size, NULL, 0) < 0) { + sg_set_error_with_errno(SG_ERROR_SYSCTL, + "CTL_KERN.KERN_PROC2.KERN_PROC_ALL"); + return NULL; + } +#else if(sysctl(mib, 3, NULL, &size, NULL, 0) < 0) { sg_set_error_with_errno(SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC.KERN_PROC_ALL"); return NULL; } +#endif - procs = size / sizeof(struct kinfo_proc); +#ifdef OPENBSD + size = 5 * size / 4; +#endif kp_stats = sg_malloc(size); if(kp_stats == NULL) { @@ -364,22 +388,40 @@ } memset(kp_stats, 0, size); +#ifdef OPENBSD + mib[5] = (int)(size / sizeof(struct kinfo_proc2)); + if(sysctl(mib, 6, kp_stats, &size, NULL, 0) < 0) { + sg_set_error_with_errno(SG_ERROR_SYSCTL, + "CTL_KERN.KERN_PROC2.KERN_PROC_ALL"); + free(kp_stats); + return NULL; + } +#else if(sysctl(mib, 3, kp_stats, &size, NULL, 0) < 0) { sg_set_error_with_errno(SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC.KERN_PROC_ALL"); free(kp_stats); return NULL; } +#endif #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) kvmd = sg_get_kvm2(); #endif +#ifdef OPENBSD + procs = (int)(size / sizeof(struct kinfo_proc2)); +#else + procs = (int)(size / sizeof(struct kinfo_proc)); +#endif + for (i = 0; i < procs; i++) { const char *name; #ifdef FREEBSD5 if (kp_stats[i].ki_stat == 0) { +#elif defined(OPENBSD) + if (kp_stats[i].p_stat == 0) { #else if (kp_stats[i].kp_proc.p_stat == 0) { #endif @@ -400,6 +442,8 @@ name = kp_stats[i].ki_comm; #elif defined(DFBSD) name = kp_stats[i].kp_thread.td_comm; +#elif defined(OPENBSD) + name = kp_stats[i].p_comm; #else name = kp_stats[i].kp_proc.p_comm; #endif @@ -412,6 +456,10 @@ #ifdef FREEBSD5 mib[2] = KERN_PROC_ARGS; mib[3] = kp_stats[i].ki_pid; +#elif defined(OPENBSD) + mib[1] = KERN_PROC_ARGS; + mib[2] = kp_stats[i].p_pid; + mib[3] = KERN_PROC_ARGV; #else mib[1] = KERN_PROC_ARGS; mib[2] = kp_stats[i].kp_proc.p_pid; @@ -523,6 +571,10 @@ proc_state_ptr->pid = kp_stats[i].ki_pid; proc_state_ptr->parent = kp_stats[i].ki_ppid; proc_state_ptr->pgid = kp_stats[i].ki_pgid; +#elif defined(OPENBSD) + proc_state_ptr->pid = kp_stats[i].p_pid; + proc_state_ptr->parent = kp_stats[i].p_ppid; + proc_state_ptr->pgid = kp_stats[i].p__pgid; #else proc_state_ptr->pid = kp_stats[i].kp_proc.p_pid; proc_state_ptr->parent = kp_stats[i].kp_eproc.e_ppid; @@ -539,6 +591,11 @@ proc_state_ptr->euid = kp_stats[i].kp_eproc.e_ucred.cr_svuid; proc_state_ptr->gid = kp_stats[i].kp_eproc.e_ucred.cr_rgid; proc_state_ptr->egid = kp_stats[i].kp_eproc.e_ucred.cr_svgid; +#elif defined(OPENBSD) + proc_state_ptr->uid = kp_stats[i].p_ruid; + proc_state_ptr->euid = kp_stats[i].p_svuid; + proc_state_ptr->gid = kp_stats[i].p_rgid; + proc_state_ptr->egid = kp_stats[i].p_svgid; #else proc_state_ptr->uid = kp_stats[i].kp_eproc.e_pcred.p_ruid; proc_state_ptr->euid = kp_stats[i].kp_eproc.e_pcred.p_svuid; @@ -562,11 +619,14 @@ /* This is in pages */ proc_state_ptr->proc_resident = kp_stats[i].kp_eproc.e_vm.vm_rssize * getpagesize(); -#if defined(NETBSD) || defined(OPENBSD) +#ifdef NETBSD proc_state_ptr->time_spent = kp_stats[i].kp_proc.p_rtime.tv_sec; +#elif defined(OPENBSD) + proc_state_ptr->time_spent = + kp_stats[i].p_rtime_sec; #elif defined(DFBSD) - proc_state_ptr->time_spent = + proc_state_ptr->time_spent = ( kp_stats[i].kp_thread.td_uticks + kp_stats[i].kp_thread.td_sticks + kp_stats[i].kp_thread.td_iticks ) / 1000000; @@ -575,10 +635,16 @@ proc_state_ptr->time_spent = kp_stats[i].kp_proc.p_runtime / 1000000; #endif +#ifdef OPENBSD + proc_state_ptr->cpu_percent = + ((double)kp_stats[i].p_pctcpu / FSCALE) * 100.0; + proc_state_ptr->nice = kp_stats[i].p_nice; +#else proc_state_ptr->cpu_percent = ((double)kp_stats[i].kp_proc.p_pctcpu / FSCALE) * 100.0; proc_state_ptr->nice = kp_stats[i].kp_proc.p_nice; #endif +#endif #ifdef NETBSD2 { @@ -652,6 +718,8 @@ #else #ifdef FREEBSD5 switch (kp_stats[i].ki_stat) { +#elif defined(OPENBSD) + switch (kp_stats[i].p_stat) { #else switch (kp_stats[i].kp_proc.p_stat) { #endif