From kbyanc@kronos.alcnet.com Sat Dec  4 00:04:39 1999
Return-Path: <kbyanc@kronos.alcnet.com>
Received: from kronos.alcnet.com (kronos.alcnet.com [63.69.28.22])
	by hub.freebsd.org (Postfix) with ESMTP id 117B315347
	for <FreeBSD-gnats-submit@freebsd.org>; Sat,  4 Dec 1999 00:04:36 -0800 (PST)
	(envelope-from kbyanc@kronos.alcnet.com)
Received: (from kbyanc@localhost)
	by kronos.alcnet.com (8.9.3/8.9.3/antispam) id DAA92493;
	Sat, 4 Dec 1999 03:04:33 -0500 (EST)
Message-Id: <199912040804.DAA92493@kronos.alcnet.com>
Date: Sat, 4 Dec 1999 03:04:33 -0500 (EST)
From: kbyanc@posi.net
Sender: kbyanc@kronos.alcnet.com
Reply-To: kbyanc@posi.net
To: FreeBSD-gnats-submit@freebsd.org
Subject: patch to add unsigned support to sysctl
X-Send-Pr-Version: 3.2

>Number:         15251
>Category:       kern
>Synopsis:       patch to add unsigned support to sysctl
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    jhb
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec  4 00:10:01 PST 1999
>Closed-Date:    Wed Jul 5 00:47:15 PDT 2000
>Last-Modified:  Wed Jul 05 00:48:26 PDT 2000
>Originator:     Kelly Yancey
>Release:        FreeBSD 3.2-STABLE i386
>Organization:
>Environment:

	3.3-STABLE, but review of -current sources via cvs-web show the
	same problems there.

>Description:

	The sysctl interface wasn't providing signed-ness along with type
	information in oid_fmt. This caused /sbin/sysctl to erroniously
	display some values as signed when they are in fact unsigned.

	Unrelated, these patches also address the problem where in
	/sys/kern/vfs_cache.c is was registering sysctls as integer types
	when they were in fact longs. While this isn't a problem on i386
	where ints and longs are the same size, on alpha this should cause
	erronious values to be displayed by sysctl.

>How-To-Repeat:

	kern.ps_strings and kern.usrstack are always negative.

	Run sysctl -a on a box that has been running for a long time, and
	you will most likely notice negative counts in one of the
	vm.stats.sys variables.

>Fix:
	
	Here is a rather sizeable patch which touches the following files:

	src/sys/sys/sysctl.h
		Adds SYSCTL_UINT and SYSCTL_ULONG to provide friendly
		interfaces to the new unsigned int and unsigned long
		oid formats. The strings "IU" and "LU" are used as oid_fmt
		identifiers respectively.

	src/sbin/sysctl/sysctl.c
		Added support for the new "IU" and "LU" format strings.
		Also, fixed the displaying of dev_t to treat it as
		unsigned (as it is defined).

	src/sys/kern/vfs_cache.c
		Fixed problem noted above to export u_long-typed
		variables as unsigned longs rather than (signed) ints.

	src/sys/kern/kern_exec.c
		Fixed kern.ps_strings and kern.usrstack to be registered
		with SYSCTL_ULONG rather than SYSCTL_LONG. I also noted
		that both ps_strings and usrstack, which are defined as
		type "long" really should be "vm_size_t". However, I
		didn't make the change myself because I'de rather someone
		wiser to comment on the change first :)

	src/sys/kern/vm_meter.c
		Fixed the export of all the vm.stats.sys.* tree to use
		the new SYSCTL_UINT registration hook since all of the
		source values are unsigned.


--- sys/kern/vfs_cache.c.orig	Sat Dec  4 01:31:04 1999
+++ sys/kern/vfs_cache.c	Sat Dec  4 02:27:14 1999
@@ -72,13 +72,13 @@
 static LIST_HEAD(nchashhead, namecache) *nchashtbl;	/* Hash Table */
 static TAILQ_HEAD(, namecache) ncneg;	/* Hash Table */
 static u_long	nchash;			/* size of hash table */
-SYSCTL_INT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
+SYSCTL_ULONG(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, "");
 static u_long	ncnegfactor = 16;	/* ratio of negative entries */
-SYSCTL_INT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
+SYSCTL_ULONG(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, "");
 static u_long	numneg;		/* number of cache entries allocated */
-SYSCTL_INT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
+SYSCTL_ULONG(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, "");
 static u_long	numcache;		/* number of cache entries allocated */
-SYSCTL_INT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
+SYSCTL_ULONG(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, "");
 struct	nchstats nchstats;		/* cache effectiveness statistics */
 
 static int	doingcache = 1;		/* 1 => enable the cache */
@@ -91,7 +91,7 @@
  */
 SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW, 0, "Name cache statistics");
 #define STATNODE(mode, name, var) \
-	SYSCTL_INT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
+	SYSCTL_ULONG(_vfs_cache, OID_AUTO, name, mode, var, "");
 STATNODE(CTLFLAG_RD, numneg, &numneg);
 STATNODE(CTLFLAG_RD, numcache, &numcache);
 static u_long numcalls; STATNODE(CTLFLAG_RD, numcalls, &numcalls);
--- sys/vm/vm_meter.c.orig	Sat Dec  4 02:16:54 1999
+++ sys/vm/vm_meter.c	Sat Dec  4 02:22:40 1999
@@ -105,19 +105,19 @@
 		wakeup(&proc0);
 }
 
-SYSCTL_INT(_vm, VM_V_FREE_MIN, v_free_min,
+SYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
 	CTLFLAG_RW, &cnt.v_free_min, 0, "");
-SYSCTL_INT(_vm, VM_V_FREE_TARGET, v_free_target,
+SYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
 	CTLFLAG_RW, &cnt.v_free_target, 0, "");
-SYSCTL_INT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
+SYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
 	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
-SYSCTL_INT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
+SYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
 	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
-SYSCTL_INT(_vm, VM_V_CACHE_MIN, v_cache_min,
+SYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
 	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
-SYSCTL_INT(_vm, VM_V_CACHE_MAX, v_cache_max,
+SYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
 	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
-SYSCTL_INT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
+SYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
 	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
 
 SYSCTL_STRUCT(_vm, VM_LOADAVG, loadavg, CTLFLAG_RD, &averunnable, loadavg, "");
@@ -221,87 +221,87 @@
 SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0, "VM meter sys stats");
 SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0, "VM meter vm stats");
 SYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 	v_swtch, CTLFLAG_RD, &cnt.v_swtch, 0, "Context switches");
-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 	v_trap, CTLFLAG_RD, &cnt.v_trap, 0, "Traps");
-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 	v_syscall, CTLFLAG_RD, &cnt.v_syscall, 0, "Syscalls");
-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 	v_intr, CTLFLAG_RD, &cnt.v_intr, 0, "HW intr");
-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 	v_soft, CTLFLAG_RD, &cnt.v_soft, 0, "SW intr");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_vm_faults, CTLFLAG_RD, &cnt.v_vm_faults, 0, "VM faults");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_cow_faults, CTLFLAG_RD, &cnt.v_cow_faults, 0, "COW faults");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_cow_optim, CTLFLAG_RD, &cnt.v_cow_optim, 0, "Optimized COW faults");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_zfod, CTLFLAG_RD, &cnt.v_zfod, 0, "Zero fill");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_ozfod, CTLFLAG_RD, &cnt.v_ozfod, 0, "Optimized zero fill");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_swapin, CTLFLAG_RD, &cnt.v_swapin, 0, "Swapin operations");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_swapout, CTLFLAG_RD, &cnt.v_swapout, 0, "Swapout operations");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_swappgsin, CTLFLAG_RD, &cnt.v_swappgsin, 0, "Swapin pages");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_swappgsout, CTLFLAG_RD, &cnt.v_swappgsout, 0, "Swapout pages");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_vnodein, CTLFLAG_RD, &cnt.v_vnodein, 0, "Vnodein operations");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_vnodeout, CTLFLAG_RD, &cnt.v_vnodeout, 0, "Vnodeout operations");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_vnodepgsin, CTLFLAG_RD, &cnt.v_vnodepgsin, 0, "Vnodein pages");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_vnodepgsout, CTLFLAG_RD, &cnt.v_vnodepgsout, 0, "Vnodeout pages");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_intrans, CTLFLAG_RD, &cnt.v_intrans, 0, "In transit page blocking");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_reactivated, CTLFLAG_RD, &cnt.v_reactivated, 0, "Reactivated pages");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_pdwakeups, CTLFLAG_RD, &cnt.v_pdwakeups, 0, "Pagedaemon wakeups");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_pdpages, CTLFLAG_RD, &cnt.v_pdpages, 0, "Pagedaemon page scans");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_dfree, CTLFLAG_RD, &cnt.v_dfree, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_pfree, CTLFLAG_RD, &cnt.v_pfree, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_tfree, CTLFLAG_RD, &cnt.v_tfree, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_page_size, CTLFLAG_RD, &cnt.v_page_size, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_page_count, CTLFLAG_RD, &cnt.v_page_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_free_reserved, CTLFLAG_RD, &cnt.v_free_reserved, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_free_target, CTLFLAG_RD, &cnt.v_free_target, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_free_min, CTLFLAG_RD, &cnt.v_free_min, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_free_count, CTLFLAG_RD, &cnt.v_free_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_wire_count, CTLFLAG_RD, &cnt.v_wire_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_active_count, CTLFLAG_RD, &cnt.v_active_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_inactive_target, CTLFLAG_RD, &cnt.v_inactive_target, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_inactive_count, CTLFLAG_RD, &cnt.v_inactive_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_cache_count, CTLFLAG_RD, &cnt.v_cache_count, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_cache_min, CTLFLAG_RD, &cnt.v_cache_min, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_cache_max, CTLFLAG_RD, &cnt.v_cache_max, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_pageout_free_min, CTLFLAG_RD, &cnt.v_pageout_free_min, 0, "");
-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 	v_interrupt_free_min, CTLFLAG_RD, &cnt.v_interrupt_free_min, 0, "");
-SYSCTL_INT(_vm_stats_misc, OID_AUTO,
+SYSCTL_UINT(_vm_stats_misc, OID_AUTO,
 	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
 #if 0
 SYSCTL_INT(_vm_stats_misc, OID_AUTO,
--- sys/kern/kern_exec.c.orig	Sat Dec  4 02:06:41 1999
+++ sys/kern/kern_exec.c	Sat Dec  4 02:30:13 1999
@@ -66,11 +66,13 @@
 
 static long *exec_copyout_strings __P((struct image_params *));
 
-static long ps_strings = PS_STRINGS;
-SYSCTL_LONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
+/* XXX This should be vm_size_t. */
+static u_long ps_strings = PS_STRINGS;
+SYSCTL_ULONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
 
-static long usrstack = USRSTACK;
-SYSCTL_LONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
+/* XXX This should be vm_size_t. */
+static u_long usrstack = USRSTACK;
+SYSCTL_ULONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
 
 /*
  * Each of the items is a pointer to a `const struct execsw', hence the
--- sys/sys/sysctl.h.orig	Sat Dec  4 01:26:11 1999
+++ sys/sys/sysctl.h	Sat Dec  4 01:32:15 1999
@@ -156,10 +156,20 @@
 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 		ptr, val, sysctl_handle_int, "I", descr)
 
+/* Oid for an unsigned int.  If ptr is NULL, val is returned. */
+#define SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) \
+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
+		ptr, val, sysctl_handle_int, "IU", descr)
+
 /* Oid for a long.  The pointer must be non NULL. */
 #define SYSCTL_LONG(parent, nbr, name, access, ptr, descr) \
 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 		ptr, 0, sysctl_handle_long, "L", descr)
+
+/* Oid for an unsigned long.  The pointer must be non NULL. */
+#define SYSCTL_ULONG(parent, nbr, name, access, ptr, descr) \
+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
+		ptr, 0, sysctl_handle_long, "LU", descr)
 
 /* Oid for an opaque object.  Specified by a pointer and a length. */
 #define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \
--- sbin/sysctl/sysctl.c.orig	Sat Dec  4 01:34:13 1999
+++ sbin/sysctl/sysctl.c	Sat Dec  4 02:01:59 1999
@@ -270,7 +270,7 @@
 	dev_t *d = (dev_t *)p;
 	if (l2 != sizeof *d)
 		err(1, "T_dev_T %d != %d", l2, sizeof *d);
-	printf("{ major = %d, minor = %d }",
+	printf("{ major = %u, minor = %u }",
 		major(*d), minor(*d));
 	return (0);
 }
@@ -392,9 +392,13 @@
 	case 'I':
 		if (!nflag)
 			printf("%s: ", name);
+		fmt++;
 		val = "";
 		while (len >= sizeof(int)) {
-			printf("%s%d", val, *(int *)p);
+			if(*fmt == 'U')
+				printf("%s%u", val, *(unsigned int *)p);
+			else
+				printf("%s%d", val, *(int *)p);
 			val = " ";
 			len -= sizeof (int);
 			p += sizeof (int);
@@ -404,7 +408,11 @@
 	case 'L':
 		if (!nflag)
 			printf("%s: ", name);
-		printf("%ld", *(long *)p);
+		fmt++;
+		if(*fmt == 'U')
+			printf("%lu", *(unsigned long *)p);
+		else
+			printf("%ld", *(long *)p);
 		return (0);
 
 	case 'P':

>Release-Note:
>Audit-Trail:

From: Kelly Yancey <kbyanc@posi.net>
To: freebsd-gnats-submit@freebsd.org
Cc:  
Subject: Re: kern/15251: patch to add unsigned support to sysctl
Date: Wed, 24 May 2000 23:41:29 -0400 (EDT)

   Here is the same patchset, diffed from -current, broken into bite-size
 pieces:
 
   Patch-aa is the necessary kernel change to support unsigned sysctl 
 variables (against sys/sys/sysctl.h).
   Patch-ab makes sysctl(8) understand how to display unsigned sysctl
 variables (against src/sbin/sysctl/sysctl.c).
 
   Patches ac, ad, and ae change sysctl definitions in various parts of the
 kernel to use the new unsigned types where appropriate. Surely there are
 more, but this is a start. These MUST have patch-aa applied first and
 SHOULD have patch-ab applied first.
 
   These patches do not include the fix for displaying dev_t as unsigned
 (which was in the original patchset) since it would appear that this is
 best left to a later commit. Other than that, all of the original patchset
 notes apply this these patches too. These should be easy to backport to
 RELENG_4 when the time comes as it appears the code touched by these
 patches doesn't change much (the original patches were against 3.x and
 applied cleanly to 5-CURRENT).
 
   Kelly
 
 
 # This is a shell archive.  Save it in a file, remove anything before
 # this line, and then unpack it by entering "sh file".  Note, it may
 # create directories; files and directories will be owned by you and
 # have default permissions.
 #
 # This archive contains:
 #
 #	patch-aa
 #	patch-ab
 #	patch-ac
 #	patch-ad
 #	patch-ae
 #
 echo x - patch-aa
 sed 's/^X//' >patch-aa << 'END-of-patch-aa'
 XIndex: sbin/sysctl/sysctl.c
 X===================================================================
 XRCS file: /home/cvs/src/sbin/sysctl/sysctl.c,v
 Xretrieving revision 1.25
 Xdiff -u -r1.25 sysctl.c
 X--- sbin/sysctl/sysctl.c	1999/11/22 08:43:00	1.25
 X+++ sbin/sysctl/sysctl.c	2000/05/25 01:33:28
 X@@ -392,9 +392,13 @@
 X 	case 'I':
 X 		if (!nflag)
 X 			printf("%s: ", name);
 X+		fmt++;
 X 		val = "";
 X 		while (len >= sizeof(int)) {
 X-			printf("%s%d", val, *(int *)p);
 X+			if(*fmt == 'U')
 X+				printf("%s%u", val, *(unsigned int *)p);
 X+			else
 X+				printf("%s%d", val, *(int *)p);
 X 			val = " ";
 X 			len -= sizeof (int);
 X 			p += sizeof (int);
 X@@ -404,7 +408,11 @@
 X 	case 'L':
 X 		if (!nflag)
 X 			printf("%s: ", name);
 X-		printf("%ld", *(long *)p);
 X+		fmt++;
 X+		if(*fmt == 'U')
 X+			printf("%lu", *(unsigned long *)p);
 X+		else
 X+			printf("%ld", *(long *)p);
 X 		return (0);
 X 
 X 	case 'P':
 END-of-patch-aa
 echo x - patch-ab
 sed 's/^X//' >patch-ab << 'END-of-patch-ab'
 XIndex: sys/sys/sysctl.h
 X===================================================================
 XRCS file: /home/cvs/src/sys/sys/sysctl.h,v
 Xretrieving revision 1.82
 Xdiff -u -r1.82 sysctl.h
 X--- sys/sys/sysctl.h	2000/05/23 20:39:14	1.82
 X+++ sys/sys/sysctl.h	2000/05/25 01:27:51
 X@@ -173,10 +173,20 @@
 X 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X 		ptr, val, sysctl_handle_int, "I", descr)
 X 
 X+/* Oid for an unsigned int.  If ptr is NULL, val is returned. */
 X+#define SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) \
 X+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X+		ptr, val, sysctl_handle_int, "IU", descr)
 X+
 X /* Oid for a long.  The pointer must be non NULL. */
 X #define SYSCTL_LONG(parent, nbr, name, access, ptr, descr) \
 X 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X 		ptr, 0, sysctl_handle_long, "L", descr)
 X+
 X+/* Oid for a long.  The pointer must be non NULL. */
 X+#define SYSCTL_ULONG(parent, nbr, name, access, ptr, descr) \
 X+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X+		ptr, 0, sysctl_handle_long, "LU", descr)
 X 
 X /* Oid for an opaque object.  Specified by a pointer and a length. */
 X #define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \
 END-of-patch-ab
 echo x - patch-ac
 sed 's/^X//' >patch-ac << 'END-of-patch-ac'
 XIndex: sys/vm/vm_meter.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/vm/vm_meter.c,v
 Xretrieving revision 1.36
 Xdiff -u -r1.36 vm_meter.c
 X--- sys/vm/vm_meter.c	2000/03/27 20:41:15	1.36
 X+++ sys/vm/vm_meter.c	2000/05/25 02:05:19
 X@@ -104,21 +104,21 @@
 X 		wakeup(&proc0);
 X }
 X 
 X-SYSCTL_INT(_vm, VM_V_FREE_MIN, v_free_min,
 X+SYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
 X 	CTLFLAG_RW, &cnt.v_free_min, 0, "");
 X-SYSCTL_INT(_vm, VM_V_FREE_TARGET, v_free_target,
 X+SYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
 X 	CTLFLAG_RW, &cnt.v_free_target, 0, "");
 X-SYSCTL_INT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
 X+SYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
 X 	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
 X-SYSCTL_INT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
 X+SYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
 X 	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
 X-SYSCTL_INT(_vm, VM_V_CACHE_MIN, v_cache_min,
 X+SYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
 X 	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
 X-SYSCTL_INT(_vm, VM_V_CACHE_MAX, v_cache_max,
 X+SYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
 X 	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
 X-SYSCTL_INT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
 X+SYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
 X 	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
 X-SYSCTL_INT(_vm, OID_AUTO, v_free_severe,
 X+SYSCTL_UINT(_vm, OID_AUTO, v_free_severe,
 X 	CTLFLAG_RW, &cnt.v_free_severe, 0, "");
 X 
 X SYSCTL_STRUCT(_vm, VM_LOADAVG, loadavg, CTLFLAG_RD, 
 X@@ -229,87 +229,87 @@
 X SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0, "VM meter sys stats");
 X SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0, "VM meter vm stats");
 X SYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_swtch, CTLFLAG_RD, &cnt.v_swtch, 0, "Context switches");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_trap, CTLFLAG_RD, &cnt.v_trap, 0, "Traps");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_syscall, CTLFLAG_RD, &cnt.v_syscall, 0, "Syscalls");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO, v_intr, CTLFLAG_RD,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_intr, CTLFLAG_RD,
 X     &cnt.v_intr, 0, "Hardware interrupts");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO, v_soft, CTLFLAG_RD, 
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_soft, CTLFLAG_RD, 
 X     &cnt.v_soft, 0, "Software interrupts");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vm_faults, CTLFLAG_RD, &cnt.v_vm_faults, 0, "VM faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cow_faults, CTLFLAG_RD, &cnt.v_cow_faults, 0, "COW faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cow_optim, CTLFLAG_RD, &cnt.v_cow_optim, 0, "Optimized COW faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_zfod, CTLFLAG_RD, &cnt.v_zfod, 0, "Zero fill");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_ozfod, CTLFLAG_RD, &cnt.v_ozfod, 0, "Optimized zero fill");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swapin, CTLFLAG_RD, &cnt.v_swapin, 0, "Swapin operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swapout, CTLFLAG_RD, &cnt.v_swapout, 0, "Swapout operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swappgsin, CTLFLAG_RD, &cnt.v_swappgsin, 0, "Swapin pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swappgsout, CTLFLAG_RD, &cnt.v_swappgsout, 0, "Swapout pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodein, CTLFLAG_RD, &cnt.v_vnodein, 0, "Vnodein operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodeout, CTLFLAG_RD, &cnt.v_vnodeout, 0, "Vnodeout operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodepgsin, CTLFLAG_RD, &cnt.v_vnodepgsin, 0, "Vnodein pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodepgsout, CTLFLAG_RD, &cnt.v_vnodepgsout, 0, "Vnodeout pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_intrans, CTLFLAG_RD, &cnt.v_intrans, 0, "In transit page blocking");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_reactivated, CTLFLAG_RD, &cnt.v_reactivated, 0, "Reactivated pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pdwakeups, CTLFLAG_RD, &cnt.v_pdwakeups, 0, "Pagedaemon wakeups");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pdpages, CTLFLAG_RD, &cnt.v_pdpages, 0, "Pagedaemon page scans");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_dfree, CTLFLAG_RD, &cnt.v_dfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pfree, CTLFLAG_RD, &cnt.v_pfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_tfree, CTLFLAG_RD, &cnt.v_tfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_page_size, CTLFLAG_RD, &cnt.v_page_size, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_page_count, CTLFLAG_RD, &cnt.v_page_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_reserved, CTLFLAG_RD, &cnt.v_free_reserved, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_target, CTLFLAG_RD, &cnt.v_free_target, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_min, CTLFLAG_RD, &cnt.v_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_count, CTLFLAG_RD, &cnt.v_free_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_wire_count, CTLFLAG_RD, &cnt.v_wire_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_active_count, CTLFLAG_RD, &cnt.v_active_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_inactive_target, CTLFLAG_RD, &cnt.v_inactive_target, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_inactive_count, CTLFLAG_RD, &cnt.v_inactive_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_count, CTLFLAG_RD, &cnt.v_cache_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_min, CTLFLAG_RD, &cnt.v_cache_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_max, CTLFLAG_RD, &cnt.v_cache_max, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pageout_free_min, CTLFLAG_RD, &cnt.v_pageout_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_interrupt_free_min, CTLFLAG_RD, &cnt.v_interrupt_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_misc, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_misc, OID_AUTO,
 X 	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
 X #if 0
 X SYSCTL_INT(_vm_stats_misc, OID_AUTO,
 END-of-patch-ac
 echo x - patch-ad
 sed 's/^X//' >patch-ad << 'END-of-patch-ad'
 XIndex: sys/kern/kern_exec.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/kern/kern_exec.c,v
 Xretrieving revision 1.111
 Xdiff -u -r1.111 kern_exec.c
 X--- sys/kern/kern_exec.c	2000/04/30 18:51:41	1.111
 X+++ sys/kern/kern_exec.c	2000/05/25 02:08:24
 X@@ -65,11 +65,13 @@
 X 
 X static register_t *exec_copyout_strings __P((struct image_params *));
 X 
 X-static long ps_strings = PS_STRINGS;
 X-SYSCTL_LONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
 X+/* XXX This should be vm_size_t. */
 X+static u_long ps_strings = PS_STRINGS;
 X+SYSCTL_ULONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
 X 
 X-static long usrstack = USRSTACK;
 X-SYSCTL_LONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
 X+/* XXX This should be vm_size_t. */
 X+static u_long usrstack = USRSTACK;
 X+SYSCTL_ULONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
 X 
 X u_long ps_arg_cache_limit = PAGE_SIZE / 16;
 X SYSCTL_LONG(_kern, OID_AUTO, ps_arg_cache_limit, CTLFLAG_RW, 
 END-of-patch-ad
 echo x - patch-ae
 sed 's/^X//' >patch-ae << 'END-of-patch-ae'
 XIndex: sys/kern/vfs_cache.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/kern/vfs_cache.c,v
 Xretrieving revision 1.45
 Xdiff -u -r1.45 vfs_cache.c
 X--- sys/kern/vfs_cache.c	2000/05/23 20:37:18	1.45
 X+++ sys/kern/vfs_cache.c	2000/05/25 02:10:04
 X@@ -90,13 +90,13 @@
 X static LIST_HEAD(nchashhead, struct namecache) *nchashtbl;	/* Hash Table */
 X static TAILQ_HEAD(, struct namecache) ncneg;	/* Hash Table */
 X static u_long	nchash;			/* size of hash table */
 X-SYSCTL_INT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
 X static u_long	ncnegfactor = 16;	/* ratio of negative entries */
 X-SYSCTL_INT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
 X static u_long	numneg;		/* number of cache entries allocated */
 X-SYSCTL_INT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
 X static u_long	numcache;		/* number of cache entries allocated */
 X-SYSCTL_INT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
 X struct	nchstats nchstats;		/* cache effectiveness statistics */
 X 
 X static int	doingcache = 1;		/* 1 => enable the cache */
 X@@ -109,7 +109,7 @@
 X  */
 X SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW, 0, "Name cache statistics");
 X #define STATNODE(mode, name, var) \
 X-	SYSCTL_INT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
 X+	SYSCTL_UINT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
 X STATNODE(CTLFLAG_RD, numneg, &numneg);
 X STATNODE(CTLFLAG_RD, numcache, &numcache);
 X static u_long numcalls; STATNODE(CTLFLAG_RD, numcalls, &numcalls);
 END-of-patch-ae
 exit
 
 
Date: Wed, 24 May 2000 22:40:42 -0400 (EDT)
From: Kelly Yancey <kbyanc@posi.net>
To: freebsd-gnats-submit@FreeBSD.org
Cc: dwhite@FreeBSD.org
Subject: Re: kern/15251: patch to add unsigned support to sysctl
 
   Here is the same patchset, diffed from -current, broken into bite-size
 pieces:
 
   Patch-aa is the necessary kernel change to support unsigned sysctl 
 variables (against sys/sys/sysctl.h).
   Patch-ab makes sysctl(8) understand how to display unsigned sysctl
 variables (against src/sbin/sysctl/sysctl.c).
 
   Patches ac, ad, and ae change sysctl definitions in various parts of the
 kernel to use the new unsigned types where appropriate. Surely there are
 more, but this is a start. These MUST have patch-aa applied first and
 SHOULD have patch-ab applied first.
 
   These patches do not include the fix for displaying dev_t as unsigned
 (which was in the original patchset) since it would appear that this is
 best left to a later commit. Other than that, all of the original patchset
 notes apply this these patches too. These should be easy to backport to
 RELENG_4 when the time comes as it appears the code touched by these
 patches doesn't change much (the original patches were against 3.x and
 applied cleanly to 5-CURRENT).
 
   Kelly
  
  
 # This is a shell archive.  Save it in a file, remove anything before
 # this line, and then unpack it by entering "sh file".  Note, it may
 # create directories; files and directories will be owned by you and
 # have default permissions.
 #
 # This archive contains:
 #
 #	patch-aa
 #	patch-ab
 #	patch-ac
 #	patch-ad
 #	patch-ae
 #
 echo x - patch-aa
 sed 's/^X//' >patch-aa << 'END-of-patch-aa'
 XIndex: sbin/sysctl/sysctl.c
 X===================================================================
 XRCS file: /home/cvs/src/sbin/sysctl/sysctl.c,v
 Xretrieving revision 1.25
 Xdiff -u -r1.25 sysctl.c
 X--- sbin/sysctl/sysctl.c	1999/11/22 08:43:00	1.25
 X+++ sbin/sysctl/sysctl.c	2000/05/25 01:33:28
 X@@ -392,9 +392,13 @@
 X 	case 'I':
 X 		if (!nflag)
 X 			printf("%s: ", name);
 X+		fmt++;
 X 		val = "";
 X 		while (len >= sizeof(int)) {
 X-			printf("%s%d", val, *(int *)p);
 X+			if(*fmt == 'U')
 X+				printf("%s%u", val, *(unsigned int *)p);
 X+			else
 X+				printf("%s%d", val, *(int *)p);
 X 			val = " ";
 X 			len -= sizeof (int);
 X 			p += sizeof (int);
 X@@ -404,7 +408,11 @@
 X 	case 'L':
 X 		if (!nflag)
 X 			printf("%s: ", name);
 X-		printf("%ld", *(long *)p);
 X+		fmt++;
 X+		if(*fmt == 'U')
 X+			printf("%lu", *(unsigned long *)p);
 X+		else
 X+			printf("%ld", *(long *)p);
 X 		return (0);
 X 
 X 	case 'P':
 END-of-patch-aa
 echo x - patch-ab
 sed 's/^X//' >patch-ab << 'END-of-patch-ab'
 XIndex: sys/sys/sysctl.h
 X===================================================================
 XRCS file: /home/cvs/src/sys/sys/sysctl.h,v
 Xretrieving revision 1.82
 Xdiff -u -r1.82 sysctl.h
 X--- sys/sys/sysctl.h	2000/05/23 20:39:14	1.82
 X+++ sys/sys/sysctl.h	2000/05/25 01:27:51
 X@@ -173,10 +173,20 @@
 X 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X 		ptr, val, sysctl_handle_int, "I", descr)
 X 
 X+/* Oid for an unsigned int.  If ptr is NULL, val is returned. */
 X+#define SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) \
 X+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X+		ptr, val, sysctl_handle_int, "IU", descr)
 X+
 X /* Oid for a long.  The pointer must be non NULL. */
 X #define SYSCTL_LONG(parent, nbr, name, access, ptr, descr) \
 X 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X 		ptr, 0, sysctl_handle_long, "L", descr)
 X+
 X+/* Oid for a long.  The pointer must be non NULL. */
 X+#define SYSCTL_ULONG(parent, nbr, name, access, ptr, descr) \
 X+	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
 X+		ptr, 0, sysctl_handle_long, "LU", descr)
 X 
 X /* Oid for an opaque object.  Specified by a pointer and a length. */
 X #define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \
 END-of-patch-ab
 echo x - patch-ac
 sed 's/^X//' >patch-ac << 'END-of-patch-ac'
 XIndex: sys/vm/vm_meter.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/vm/vm_meter.c,v
 Xretrieving revision 1.36
 Xdiff -u -r1.36 vm_meter.c
 X--- sys/vm/vm_meter.c	2000/03/27 20:41:15	1.36
 X+++ sys/vm/vm_meter.c	2000/05/25 02:05:19
 X@@ -104,21 +104,21 @@
 X 		wakeup(&proc0);
 X }
 X 
 X-SYSCTL_INT(_vm, VM_V_FREE_MIN, v_free_min,
 X+SYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
 X 	CTLFLAG_RW, &cnt.v_free_min, 0, "");
 X-SYSCTL_INT(_vm, VM_V_FREE_TARGET, v_free_target,
 X+SYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
 X 	CTLFLAG_RW, &cnt.v_free_target, 0, "");
 X-SYSCTL_INT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
 X+SYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
 X 	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
 X-SYSCTL_INT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
 X+SYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
 X 	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
 X-SYSCTL_INT(_vm, VM_V_CACHE_MIN, v_cache_min,
 X+SYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
 X 	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
 X-SYSCTL_INT(_vm, VM_V_CACHE_MAX, v_cache_max,
 X+SYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
 X 	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
 X-SYSCTL_INT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
 X+SYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
 X 	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
 X-SYSCTL_INT(_vm, OID_AUTO, v_free_severe,
 X+SYSCTL_UINT(_vm, OID_AUTO, v_free_severe,
 X 	CTLFLAG_RW, &cnt.v_free_severe, 0, "");
 X 
 X SYSCTL_STRUCT(_vm, VM_LOADAVG, loadavg, CTLFLAG_RD, 
 X@@ -229,87 +229,87 @@
 X SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0, "VM meter sys stats");
 X SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0, "VM meter vm stats");
 X SYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_swtch, CTLFLAG_RD, &cnt.v_swtch, 0, "Context switches");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_trap, CTLFLAG_RD, &cnt.v_trap, 0, "Traps");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
 X 	v_syscall, CTLFLAG_RD, &cnt.v_syscall, 0, "Syscalls");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO, v_intr, CTLFLAG_RD,
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_intr, CTLFLAG_RD,
 X     &cnt.v_intr, 0, "Hardware interrupts");
 X-SYSCTL_INT(_vm_stats_sys, OID_AUTO, v_soft, CTLFLAG_RD, 
 X+SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_soft, CTLFLAG_RD, 
 X     &cnt.v_soft, 0, "Software interrupts");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vm_faults, CTLFLAG_RD, &cnt.v_vm_faults, 0, "VM faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cow_faults, CTLFLAG_RD, &cnt.v_cow_faults, 0, "COW faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cow_optim, CTLFLAG_RD, &cnt.v_cow_optim, 0, "Optimized COW faults");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_zfod, CTLFLAG_RD, &cnt.v_zfod, 0, "Zero fill");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_ozfod, CTLFLAG_RD, &cnt.v_ozfod, 0, "Optimized zero fill");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swapin, CTLFLAG_RD, &cnt.v_swapin, 0, "Swapin operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swapout, CTLFLAG_RD, &cnt.v_swapout, 0, "Swapout operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swappgsin, CTLFLAG_RD, &cnt.v_swappgsin, 0, "Swapin pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_swappgsout, CTLFLAG_RD, &cnt.v_swappgsout, 0, "Swapout pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodein, CTLFLAG_RD, &cnt.v_vnodein, 0, "Vnodein operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodeout, CTLFLAG_RD, &cnt.v_vnodeout, 0, "Vnodeout operations");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodepgsin, CTLFLAG_RD, &cnt.v_vnodepgsin, 0, "Vnodein pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_vnodepgsout, CTLFLAG_RD, &cnt.v_vnodepgsout, 0, "Vnodeout pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_intrans, CTLFLAG_RD, &cnt.v_intrans, 0, "In transit page blocking");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_reactivated, CTLFLAG_RD, &cnt.v_reactivated, 0, "Reactivated pages");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pdwakeups, CTLFLAG_RD, &cnt.v_pdwakeups, 0, "Pagedaemon wakeups");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pdpages, CTLFLAG_RD, &cnt.v_pdpages, 0, "Pagedaemon page scans");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_dfree, CTLFLAG_RD, &cnt.v_dfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pfree, CTLFLAG_RD, &cnt.v_pfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_tfree, CTLFLAG_RD, &cnt.v_tfree, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_page_size, CTLFLAG_RD, &cnt.v_page_size, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_page_count, CTLFLAG_RD, &cnt.v_page_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_reserved, CTLFLAG_RD, &cnt.v_free_reserved, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_target, CTLFLAG_RD, &cnt.v_free_target, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_min, CTLFLAG_RD, &cnt.v_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_free_count, CTLFLAG_RD, &cnt.v_free_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_wire_count, CTLFLAG_RD, &cnt.v_wire_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_active_count, CTLFLAG_RD, &cnt.v_active_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_inactive_target, CTLFLAG_RD, &cnt.v_inactive_target, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_inactive_count, CTLFLAG_RD, &cnt.v_inactive_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_count, CTLFLAG_RD, &cnt.v_cache_count, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_min, CTLFLAG_RD, &cnt.v_cache_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_cache_max, CTLFLAG_RD, &cnt.v_cache_max, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_pageout_free_min, CTLFLAG_RD, &cnt.v_pageout_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_vm, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
 X 	v_interrupt_free_min, CTLFLAG_RD, &cnt.v_interrupt_free_min, 0, "");
 X-SYSCTL_INT(_vm_stats_misc, OID_AUTO,
 X+SYSCTL_UINT(_vm_stats_misc, OID_AUTO,
 X 	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
 X #if 0
 X SYSCTL_INT(_vm_stats_misc, OID_AUTO,
 END-of-patch-ac
 echo x - patch-ad
 sed 's/^X//' >patch-ad << 'END-of-patch-ad'
 XIndex: sys/kern/kern_exec.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/kern/kern_exec.c,v
 Xretrieving revision 1.111
 Xdiff -u -r1.111 kern_exec.c
 X--- sys/kern/kern_exec.c	2000/04/30 18:51:41	1.111
 X+++ sys/kern/kern_exec.c	2000/05/25 02:08:24
 X@@ -65,11 +65,13 @@
 X 
 X static register_t *exec_copyout_strings __P((struct image_params *));
 X 
 X-static long ps_strings = PS_STRINGS;
 X-SYSCTL_LONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
 X+/* XXX This should be vm_size_t. */
 X+static u_long ps_strings = PS_STRINGS;
 X+SYSCTL_ULONG(_kern, KERN_PS_STRINGS, ps_strings, CTLFLAG_RD, &ps_strings, "");
 X 
 X-static long usrstack = USRSTACK;
 X-SYSCTL_LONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
 X+/* XXX This should be vm_size_t. */
 X+static u_long usrstack = USRSTACK;
 X+SYSCTL_ULONG(_kern, KERN_USRSTACK, usrstack, CTLFLAG_RD, &usrstack, "");
 X 
 X u_long ps_arg_cache_limit = PAGE_SIZE / 16;
 X SYSCTL_LONG(_kern, OID_AUTO, ps_arg_cache_limit, CTLFLAG_RW, 
 END-of-patch-ad
 echo x - patch-ae
 sed 's/^X//' >patch-ae << 'END-of-patch-ae'
 XIndex: sys/kern/vfs_cache.c
 X===================================================================
 XRCS file: /home/cvs/src/sys/kern/vfs_cache.c,v
 Xretrieving revision 1.45
 Xdiff -u -r1.45 vfs_cache.c
 X--- sys/kern/vfs_cache.c	2000/05/23 20:37:18	1.45
 X+++ sys/kern/vfs_cache.c	2000/05/25 02:10:04
 X@@ -90,13 +90,13 @@
 X static LIST_HEAD(nchashhead, struct namecache) *nchashtbl;	/* Hash Table */
 X static TAILQ_HEAD(, struct namecache) ncneg;	/* Hash Table */
 X static u_long	nchash;			/* size of hash table */
 X-SYSCTL_INT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
 X static u_long	ncnegfactor = 16;	/* ratio of negative entries */
 X-SYSCTL_INT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
 X static u_long	numneg;		/* number of cache entries allocated */
 X-SYSCTL_INT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
 X static u_long	numcache;		/* number of cache entries allocated */
 X-SYSCTL_INT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
 X+SYSCTL_UINT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
 X struct	nchstats nchstats;		/* cache effectiveness statistics */
 X 
 X static int	doingcache = 1;		/* 1 => enable the cache */
 X@@ -109,7 +109,7 @@
 X  */
 X SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW, 0, "Name cache statistics");
 X #define STATNODE(mode, name, var) \
 X-	SYSCTL_INT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
 X+	SYSCTL_UINT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
 X STATNODE(CTLFLAG_RD, numneg, &numneg);
 X STATNODE(CTLFLAG_RD, numcache, &numcache);
 X static u_long numcalls; STATNODE(CTLFLAG_RD, numcalls, &numcalls);
 END-of-patch-ae
 exit
 
 

From: Kelly Yancey <kbyanc@posi.net>
To: freebsd-gnats-submit@FreeBSD.org
Cc:  
Subject: Re: kern/15251: patch to add unsigned support to sysctl
Date: Sun, 25 Jun 2000 17:38:48 -0700 (PDT)

   When updating the original patches to -current, I left out the fix to use
 the correct datatype for sysctl's in vfs_cache.c (see original PR notes for
 details of the bug). Here is a patch, to be applied after the last patchset I
 attached to this PR, which fixes the datatype mismatch in vfs_cache.c.
 
   In short, the latest patchset against current is already attached to this PR
 (as a shar of 5 'bite-size' patches). Commit that.
   Then, apply this patch and commit that.
 
   Kelly
 
 --- sys/kern/vfs_cache.c.orig	Sun Jun 25 17:30:44 2000
 +++ sys/kern/vfs_cache.c	Sun Jun 25 17:33:04 2000
 @@ -90,13 +90,13 @@
  static LIST_HEAD(nchashhead, namecache) *nchashtbl;	/* Hash Table */
  static TAILQ_HEAD(, namecache) ncneg;	/* Hash Table */
  static u_long	nchash;			/* size of hash table */
 -SYSCTL_UINT(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
 +SYSCTL_ULONG(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0, "");
  static u_long	ncnegfactor = 16;	/* ratio of negative entries */
 -SYSCTL_UINT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
 +SYSCTL_ULONG(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0, "");
  static u_long	numneg;		/* number of cache entries allocated */
 -SYSCTL_UINT(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
 +SYSCTL_ULONG(_debug, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0, "");
  static u_long	numcache;		/* number of cache entries allocated */
 -SYSCTL_UINT(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
 +SYSCTL_ULONG(_debug, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0, "");
  struct	nchstats nchstats;		/* cache effectiveness statistics */
  
  static int	doingcache = 1;		/* 1 => enable the cache */
 @@ -109,7 +109,7 @@
   */
  SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW, 0, "Name cache statistics");
  #define STATNODE(mode, name, var) \
 -	SYSCTL_UINT(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
 +	SYSCTL_ULONG(_vfs_cache, OID_AUTO, name, mode, var, 0, "");
  STATNODE(CTLFLAG_RD, numneg, &numneg);
  STATNODE(CTLFLAG_RD, numcache, &numcache);
  static u_long numcalls; STATNODE(CTLFLAG_RD, numcalls, &numcalls);
 
 --
 Kelly Yancey  -  kbyanc@posi.net  -  Belmont, CA
 System Administrator, eGroups.com                  http://www.egroups.com/
 Maintainer, BSD Driver Database       http://www.posi.net/freebsd/drivers/
 Coordinator, Team FreeBSD        http://www.posi.net/freebsd/Team-FreeBSD/
 
 
Responsible-Changed-From-To: freebsd-bugs->jhb 
Responsible-Changed-By: jhb 
Responsible-Changed-When: Tue Jul 4 02:00:26 PDT 2000 
Responsible-Changed-Why:  
I'll take this. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=15251 
State-Changed-From-To: open->closed 
State-Changed-By: jhb 
State-Changed-When: Wed Jul 5 00:47:15 PDT 2000 
State-Changed-Why:  
Committed, thanks. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=15251 
>Unformatted:
