--- sysinfo.c.orig	Tue Apr  6 22:53:17 1999
+++ sysinfo.c	Tue Apr  6 23:09:37 1999
@@ -102,6 +102,7 @@
 struct nlist	nl[] = {
 #define	X_CP_TIME	0
 	{ "_cp_time" },
+#if __FreeBSD_version < 400000
 #define VM_SWAPLIST	1
 	{ "_swaplist" },/* list of free swap areas */
 #define VM_SWDEVT	2
@@ -129,6 +130,27 @@
 #define X_DKXFER        12
         { "_dk_xfer" },
 #endif
+#else /* __FreeBSD_version < 400000 */
+#define VM_DMMAX	1
+	{ "_dmmax" },	/* maximum size of a swap block */
+#define	V_MOUNTLIST	2
+	{ "_mountlist" },	/* address of head of mount list. */
+#define V_NUMV		3
+	{ "_numvnodes" },
+#define	FNL_NFILE	4
+	{"_nfiles"},
+#define FNL_MAXFILE	5
+	{"_maxfiles"},
+#define NLMANDATORY FNL_MAXFILE	/* names up to here are mandatory */
+#define X_CNT           6
+	{ "_cnt" },                /* struct vmmeter cnt */
+#define N_IFNET         7
+        { "_ifnet" },
+#ifndef HAVE_DEVSTAT
+#define X_DKXFER        8
+        { "_dk_xfer" },
+#endif
+#endif /* __FreeBSD_version < 400000 */
 	{ "" },
 };
 
@@ -444,6 +466,21 @@
 void
 swapmode(int *used, int *avail)
 {
+#if __FreeBSD_version >= 400000
+	/* based on swapmode from /usr/src/usr.bin/top/machine.c */
+	int n;
+	struct kvm_swap swapary[1];
+
+	n = kvm_getswapinfo(kd, swapary, 1, 0);
+	if (n < 0) {
+		*avail = *used = 0;
+		return;
+	}
+
+	*avail = swapary[0].ksw_total - swapary[0].ksw_used;
+	*used = swapary[0].ksw_used;
+	return;
+#else
 	char *header;
 	int hlen, nswap, nswdev, dmmax;
 	int i, div, nfree, npfree;
@@ -552,6 +589,7 @@
 	*used = *avail - nfree;
 	free(sw);
 	free(perdev);
+#endif /* __FreeBSD_version >= 400000 */
 }
 
 /*
