$OpenBSD: patch-src_sysdeps_openbsd_c,v 1.9 2008/07/01 10:17:35 ajacoutot Exp $
--- src/sysdeps/openbsd.c.orig	Sat Jul  7 01:54:22 2007
+++ src/sysdeps/openbsd.c	Tue Jul  1 10:48:13 2008
@@ -53,41 +53,71 @@ gkrellm_sys_main_cleanup(void)
 #include <sys/dkstat.h>
 #include <kvm.h>
 
-extern	kvm_t	*kvmd;
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/sched.h>
 
+static gint ncpus;
+
+static gint get_ncpus(void);
+
 void
 gkrellm_sys_cpu_read_data(void)
 	{
-	long		cp_time[CPUSTATES];
-	static struct nlist nl[] = {
-#define N_CP_TIME	0
-		{ "_cp_time" },
-		{ "" }
-	};
+	int64_t	cp_time[ncpus][CPUSTATES];
+	size_t size;
+	int i;
 
+	size = sizeof(cp_time[0]);
+	if (ncpus > 1) {
+		for (i = 0; i < ncpus; i++) {
+			int cp_time_mib[] = {CTL_KERN, KERN_CPTIME2, i};
 
-	if (kvmd == NULL)
-		return;
-	if (nl[0].n_type == 0)
-		if (kvm_nlist(kvmd, nl) < 0 || nl[0].n_type == 0)
+			if (sysctl(cp_time_mib, 3, cp_time[i], &size, NULL, 0)
+			    < 0)
+				continue;
+
+			gkrellm_cpu_assign_data(i, cp_time[i][CP_USER],
+			    cp_time[i][CP_NICE], cp_time[i][CP_SYS],
+			    cp_time[i][CP_IDLE]);
+		}
+	} else {
+		int cp_time_mib[] = {CTL_KERN, KERN_CPTIME};
+		long cp_time_tmp[CPUSTATES];
+
+		if (sysctl(cp_time_mib, 2, cp_time_tmp, &size, NULL, 0) < 0)
 			return;
-	if (kvm_read(kvmd, nl[N_CP_TIME].n_value,
-		     (char *)&cp_time, sizeof(cp_time)) != sizeof(cp_time))
-		return;
+		for (i = 0; i < CPUSTATES; i++)
+			cp_time[0][i] = cp_time_tmp[i];
 
-	/* Currently, SMP is not supported */
-	gkrellm_cpu_assign_data(0, cp_time[CP_USER], cp_time[CP_NICE],
-				cp_time[CP_SYS], cp_time[CP_IDLE]);
+		gkrellm_cpu_assign_data(0, cp_time[0][CP_USER],
+		    cp_time[0][CP_NICE], cp_time[0][CP_SYS],
+		    cp_time[0][CP_IDLE]);
+
 	}
+}
 
 gboolean
 gkrellm_sys_cpu_init(void)
-    {
-	gkrellm_cpu_set_number_of_cpus(1);
+{
+	ncpus = get_ncpus();
+	gkrellm_cpu_set_number_of_cpus(ncpus);
 	return TRUE;
-	}
+}
 
+static gint
+get_ncpus(void)
+{
+	static int mib[] = { CTL_HW, HW_NCPU };
+	int ncpus;
+	size_t size = sizeof(int);
 
+	if (sysctl(mib, 2, &ncpus, &size, NULL, 0) < 0)
+		return 1;
+	else
+		return ncpus;
+}
+
 /* ===================================================================== */
 /* Proc monitor interface */
 
@@ -293,7 +323,7 @@ gkrellm_sys_sensors_init(void)
 /* Battery monitor interface */
 #include <sys/ioctl.h>
 
-#if defined(__i386__) || defined(__powerpc__)
+#if defined(__i386__) || defined(__powerpc__) || defined(__amd64__) || defined(__arm__) || (defined(__sparc__) && !defined(__sparc64__))
 
 #include <machine/apmvar.h>
 #define	APMDEV		"/dev/apm"
@@ -405,7 +435,7 @@ gkrellm_sys_disk_read_data(void)
 		/* Separate read/write stats were implemented in NetBSD 1.6K.
 		*/
 
-#if __NetBSD_Version__ >= 106110000
+#if __NetBSD_Version__ >= 106110000 || defined(__OpenBSD__)
 		rbytes = d.dk_rbytes;
 		wbytes = d.dk_wbytes;
 #else
@@ -413,7 +443,7 @@ gkrellm_sys_disk_read_data(void)
 		wbytes = 0;
 #endif
 
-		gkrellm_disk_assign_data_by_name(buf, rbytes, wbytes);
+		gkrellm_disk_assign_data_by_name(buf, rbytes, wbytes, FALSE);
 		}
 	}
 }
