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
