Module Name:    src
Committed By:   mrg
Date:           Sun Apr 11 01:52:11 UTC 2010

Modified Files:
        src/sbin/sysctl: sysctl.c

Log Message:
implement CTLTYPE_BOOL support.  it was entirely missing.  HI MATT!


To generate a diff of this commit:
cvs rdiff -u -r1.130 -r1.131 src/sbin/sysctl/sysctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/sysctl/sysctl.c
diff -u src/sbin/sysctl/sysctl.c:1.130 src/sbin/sysctl/sysctl.c:1.131
--- src/sbin/sysctl/sysctl.c:1.130	Wed Sep 30 04:30:50 2009
+++ src/sbin/sysctl/sysctl.c	Sun Apr 11 01:52:10 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysctl.c,v 1.130 2009/09/30 04:30:50 elad Exp $ */
+/*	$NetBSD: sysctl.c,v 1.131 2010/04/11 01:52:10 mrg Exp $ */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
 #if 0
 static char sccsid[] = "@(#)sysctl.c	8.1 (Berkeley) 6/6/93";
 #else
-__RCSID("$NetBSD: sysctl.c,v 1.130 2009/09/30 04:30:50 elad Exp $");
+__RCSID("$NetBSD: sysctl.c,v 1.131 2010/04/11 01:52:10 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -502,6 +502,8 @@
                 return "QUAD";
 	case CTLTYPE_STRUCT:
 		return "STRUCT";
+	case CTLTYPE_BOOL:
+		return "BOOL";
 	}
 
 	return "???";
@@ -712,6 +714,16 @@
 		display_number(pnode, gsname, &i, sizeof(i), DISPLAY_VALUE);
 		break;
 	}
+	case CTLTYPE_BOOL: {
+		bool b;
+		rc = sysctl(name, namelen, &b, &sz, NULL, 0);
+		if (rc == -1) {
+			sysctlerror(1);
+			break;
+		}
+		display_number(pnode, gsname, &b, sizeof(b), DISPLAY_VALUE);
+		break;
+	}
 	case CTLTYPE_STRING: {
 		unsigned char buf[1024], *tbuf;
 		tbuf = buf;
@@ -884,14 +896,13 @@
 		print_tree(&name[0], namelen, node, CTLTYPE_NODE, 1);
 		break;
 	case CTLTYPE_INT:
+	case CTLTYPE_BOOL:
+	case CTLTYPE_QUAD:
 		write_number(&name[0], namelen, node, value);
 		break;
 	case CTLTYPE_STRING:
 		write_string(&name[0], namelen, node, value);
 		break;
-	case CTLTYPE_QUAD:
-		write_number(&name[0], namelen, node, value);
-		break;
 	case CTLTYPE_STRUCT:
 		/*
 		 * XXX old behavior is to print.  should we error instead?
@@ -932,6 +943,7 @@
 	u_int namelen, type;
 	u_quad_t uq;
 	quad_t q;
+	bool b;
 
 	if (!wflag) {
 		sysctlperror("Must specify -w to create nodes\n");
@@ -957,6 +969,7 @@
 	 * misc stuff used when constructing
 	 */
 	i = 0;
+	b = false;
 	uq = 0;
 	key = NULL;
 	value = NULL;
@@ -1053,6 +1066,10 @@
 				sz = sizeof(int);
 				type = CTLTYPE_INT;
 			}
+			else if (strcmp(value, "bool") == 0) {
+				sz = sizeof(bool);
+				type = CTLTYPE_BOOL;
+			}
 			else if (strcmp(value, "string") == 0)
 				type = CTLTYPE_STRING;
 			else if (strcmp(value, "quad") == 0) {
@@ -1192,6 +1209,26 @@
 			if (sz == 0)
 				sz = sizeof(int);
 			break;
+		case CTLTYPE_BOOL:
+			errno = 0;
+			q = strtoll(data, &t, 0);
+			if (t == data || *t != '\0' || errno != 0 ||
+				(q != 0 && q != 1)) {
+				sysctlperror(
+				    "%s: '%s' is not a valid bool\n",
+				    nname, value);
+				EXIT(1);
+			}
+			b = q == 1;
+			if (!(flags & CTLFLAG_OWNDATA)) {
+				flags |= CTLFLAG_IMMEDIATE;
+				node.sysctl_idata = b;
+			}
+			else
+				node.sysctl_data = &b;
+			if (sz == 0)
+				sz = sizeof(bool);
+			break;
 		case CTLTYPE_STRING:
 			flags |= CTLFLAG_OWNDATA;
 			node.sysctl_data = data;
@@ -1277,6 +1314,7 @@
 	 */
 	if (sz != 0) {
 		if ((type == CTLTYPE_INT && sz != sizeof(int)) ||
+		    (type == CTLTYPE_BOOL && sz != sizeof(bool)) ||
 		    (type == CTLTYPE_QUAD && sz != sizeof(u_quad_t)) ||
 		    (type == CTLTYPE_NODE && sz != 0)) {
 			sysctlperror("%s: wrong size for type\n", nname);
@@ -1664,6 +1702,7 @@
 	u_int ii, io;
 	u_quad_t qi, qo;
 	size_t si, so;
+	bool bi, bo;
 	int rc;
 	void *i, *o;
 	char *t;
@@ -1673,6 +1712,7 @@
 
 	si = so = 0;
 	i = o = NULL;
+	bi = bo = false;
 	errno = 0;
 	qi = strtouq(value, &t, 0);
 	if (qi == UQUAD_MAX && errno == ERANGE) {
@@ -1697,6 +1737,13 @@
 		i = ⅈ
 		si = sizeof(ii);
 		break;
+	case CTLTYPE_BOOL:
+		bi = (bool)qi;
+		o = &bo;
+		so = sizeof(bo);
+		i = &bi;
+		si = sizeof(bi);
+		break;
 	case CTLTYPE_QUAD:
 		o = &qo;
 		so = sizeof(qo);
@@ -1716,6 +1763,10 @@
 		display_number(node, gsname, &io, sizeof(io), DISPLAY_OLD);
 		display_number(node, gsname, &ii, sizeof(ii), DISPLAY_NEW);
 		break;
+	case CTLTYPE_BOOL:
+		display_number(node, gsname, &bo, sizeof(bo), DISPLAY_OLD);
+		display_number(node, gsname, &bi, sizeof(bi), DISPLAY_NEW);
+		break;
 	case CTLTYPE_QUAD:
 		display_number(node, gsname, &qo, sizeof(qo), DISPLAY_OLD);
 		display_number(node, gsname, &qi, sizeof(qi), DISPLAY_NEW);
@@ -1764,6 +1815,7 @@
 	       const void *data, size_t sz, int n)
 {
 	u_quad_t q;
+	bool b;
 	int i;
 
 	if (qflag)
@@ -1800,6 +1852,15 @@
 		else
 			printf("%d", i);
 		break;
+	case CTLTYPE_BOOL:
+		memcpy(&b, data, sz);
+		if (xflag)
+			printf("0x%0*x", (int)sz * 2, b);
+		else if (node->sysctl_flags & CTLFLAG_HEX)
+			printf("%#x", b);
+		else
+			printf("%d", b);
+		break;
 	case CTLTYPE_QUAD:
 		memcpy(&q, data, sz);
 		if (xflag)

Reply via email to