svn commit: r367006 - head/sbin/sysctl

Ryan Moeller freqlabs at FreeBSD.org
Sat Oct 24 16:05:38 UTC 2020


Author: freqlabs
Date: Sat Oct 24 16:05:37 2020
New Revision: 367006
URL: https://svnweb.freebsd.org/changeset/base/367006

Log:
  sysctl: Misc code cleanup
  
  * Use defined SYS_SYSCTL names
  * Use memcmp instead of explicit loop
  * Use NULL instead of 0 for pointer value
  * Use __FBSDID
  * Reformat, improve comments in parse()
  
  No functional changes.
  
  Reviewed by:	imp
  MFC after:	1 week
  Sponsored by:	iXsystems, Inc.
  Differential Revision:	https://reviews.freebsd.org/D26832

Modified:
  head/sbin/sysctl/sysctl.c

Modified: head/sbin/sysctl/sysctl.c
==============================================================================
--- head/sbin/sysctl/sysctl.c	Sat Oct 24 15:58:42 2020	(r367005)
+++ head/sbin/sysctl/sysctl.c	Sat Oct 24 16:05:37 2020	(r367006)
@@ -29,20 +29,9 @@
  * SUCH DAMAGE.
  */
 
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
-	The Regents of the University of California.  All rights reserved.\n";
-#endif /* not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
 
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)from: sysctl.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-  "$FreeBSD$";
-#endif /* not lint */
-
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/resource.h>
@@ -221,7 +210,7 @@ main(int argc, char **argv)
 	if (Nflag && nflag)
 		usage();
 	if (aflag && argc == 0)
-		exit(sysctl_all(0, 0));
+		exit(sysctl_all(NULL, 0));
 	if (argc == 0 && conffile == NULL)
 		usage();
 
@@ -369,6 +358,13 @@ parse(const char *string, int lineno)
 	else
 		line[0] = '\0';
 
+	/*
+	 * Split the string into name and value.
+	 *
+	 * Either = or : may be used as the delimiter.
+	 * Whitespace surrounding the delimiter is trimmed.
+	 * Quotes around the value are stripped.
+	 */
 	cp = buf;
 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
 		warnx("oid too long: '%s'%s", string, line);
@@ -381,6 +377,7 @@ parse(const char *string, int lineno)
 			warnx("Can't set variables when using -T or -W");
 			usage();
 		}
+		/* Trim whitespace before the value. */
 		while (isspace(*cp))
 			cp++;
 		/* Strip a pair of " or ' if any. */
@@ -394,14 +391,17 @@ parse(const char *string, int lineno)
 		newvalstr = cp;
 		newsize = strlen(cp);
 	}
-	/* Trim spaces */
+	/* Trim whitespace after the name. */
 	cp = bufp + strlen(bufp) - 1;
 	while (cp >= bufp && isspace((int)*cp)) {
 		*cp = '\0';
 		cp--;
 	}
-	len = name2oid(bufp, mib);
 
+	/*
+	 * Check the name is a useable oid.
+	 */
+	len = name2oid(bufp, mib);
 	if (len < 0) {
 		if (iflag)
 			return (0);
@@ -425,6 +425,10 @@ parse(const char *string, int lineno)
 			exit(1);
 	}
 
+	/*
+	 * We have a useable oid to work with.  If there is no value given,
+	 * show the node and its children.  Otherwise, set the new value.
+	 */
 	if (newvalstr == NULL || dflag) {
 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
 			if (dflag) {
@@ -438,105 +442,109 @@ parse(const char *string, int lineno)
 			if (!i && !bflag)
 				putchar('\n');
 		}
-	} else {
-		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
-			warnx("oid '%s' isn't a leaf node%s", bufp, line);
-			return (1);
-		}
+		return (0);
+	}
 
-		if (!(kind & CTLFLAG_WR)) {
-			if (kind & CTLFLAG_TUN) {
-				warnx("oid '%s' is a read only tunable%s", bufp, line);
-				warnx("Tunable values are set in /boot/loader.conf");
-			} else
-				warnx("oid '%s' is read only%s", bufp, line);
-			return (1);
-		}
+	/*
+	 * We have a new value to set.  Check its validity and parse if numeric.
+	 */
+	if ((kind & CTLTYPE) == CTLTYPE_NODE) {
+		warnx("oid '%s' isn't a leaf node%s", bufp, line);
+		return (1);
+	}
 
-		switch (kind & CTLTYPE) {
-		case CTLTYPE_INT:
-		case CTLTYPE_UINT:
-		case CTLTYPE_LONG:
-		case CTLTYPE_ULONG:
-		case CTLTYPE_S8:
-		case CTLTYPE_S16:
-		case CTLTYPE_S32:
-		case CTLTYPE_S64:
-		case CTLTYPE_U8:
-		case CTLTYPE_U16:
-		case CTLTYPE_U32:
-		case CTLTYPE_U64:
-			if (strlen(newvalstr) == 0) {
-				warnx("empty numeric value");
-				return (1);
-			}
-			/* FALLTHROUGH */
-		case CTLTYPE_STRING:
-			break;
-		default:
-			warnx("oid '%s' is type %d,"
-				" cannot set that%s", bufp,
-				kind & CTLTYPE, line);
+	if (!(kind & CTLFLAG_WR)) {
+		if (kind & CTLFLAG_TUN) {
+			warnx("oid '%s' is a read only tunable%s", bufp, line);
+			warnx("Tunable values are set in /boot/loader.conf");
+		} else
+			warnx("oid '%s' is read only%s", bufp, line);
+		return (1);
+	}
+
+	switch (kind & CTLTYPE) {
+	case CTLTYPE_INT:
+	case CTLTYPE_UINT:
+	case CTLTYPE_LONG:
+	case CTLTYPE_ULONG:
+	case CTLTYPE_S8:
+	case CTLTYPE_S16:
+	case CTLTYPE_S32:
+	case CTLTYPE_S64:
+	case CTLTYPE_U8:
+	case CTLTYPE_U16:
+	case CTLTYPE_U32:
+	case CTLTYPE_U64:
+		if (strlen(newvalstr) == 0) {
+			warnx("empty numeric value");
 			return (1);
 		}
+		/* FALLTHROUGH */
+	case CTLTYPE_STRING:
+		break;
+	default:
+		warnx("oid '%s' is type %d, cannot set that%s",
+		    bufp, kind & CTLTYPE, line);
+		return (1);
+	}
 
-		newbuf = NULL;
+	newbuf = NULL;
 
-		switch (kind & CTLTYPE) {
-		case CTLTYPE_STRING:
-			newval = newvalstr;
-			break;
-		default:
-			newsize = 0;
-			while ((cp = strsep(&newvalstr, " ,")) != NULL) {
-				if (*cp == '\0')
-					continue;
-				if (!parse_numeric(cp, fmt, kind, &newbuf,
-				    &newsize)) {
-					warnx("invalid %s '%s'%s",
-					    ctl_typename[kind & CTLTYPE],
-					    cp, line);
-					free(newbuf);
-					return (1);
-				}
-			}
-			newval = newbuf;
-			break;
-		}
-
-		i = show_var(mib, len, false);
-		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
-			free(newbuf);
-			if (!i && !bflag)
-				putchar('\n');
-			switch (errno) {
-			case EOPNOTSUPP:
-				warnx("%s: value is not available%s",
-					string, line);
+	switch (kind & CTLTYPE) {
+	case CTLTYPE_STRING:
+		newval = newvalstr;
+		break;
+	default:
+		newsize = 0;
+		while ((cp = strsep(&newvalstr, " ,")) != NULL) {
+			if (*cp == '\0')
+				continue;
+			if (!parse_numeric(cp, fmt, kind, &newbuf, &newsize)) {
+				warnx("invalid %s '%s'%s",
+				    ctl_typename[kind & CTLTYPE], cp, line);
+				free(newbuf);
 				return (1);
-			case ENOTDIR:
-				warnx("%s: specification is incomplete%s",
-					string, line);
-				return (1);
-			case ENOMEM:
-				warnx("%s: type is unknown to this program%s",
-					string, line);
-				return (1);
-			default:
-				warn("%s%s", string, line);
-				return (1);
 			}
 		}
+		newval = newbuf;
+		break;
+	}
+
+	/*
+	 * Show the current value, then set and show the new value.
+	 */
+	i = show_var(mib, len, false);
+	if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
 		free(newbuf);
-		if (!bflag)
-			printf(" -> ");
-		i = nflag;
-		nflag = 1;
-		j = show_var(mib, len, false);
-		if (!j && !bflag)
+		if (!i && !bflag)
 			putchar('\n');
-		nflag = i;
+		switch (errno) {
+		case EOPNOTSUPP:
+			warnx("%s: value is not available%s",
+			    string, line);
+			return (1);
+		case ENOTDIR:
+			warnx("%s: specification is incomplete%s",
+			    string, line);
+			return (1);
+		case ENOMEM:
+			warnx("%s: type is unknown to this program%s",
+			    string, line);
+			return (1);
+		default:
+			warn("%s%s", string, line);
+			return (1);
+		}
 	}
+	free(newbuf);
+	if (!bflag)
+		printf(" -> ");
+	i = nflag;
+	nflag = 1;
+	j = show_var(mib, len, false);
+	if (!j && !bflag)
+		putchar('\n');
+	nflag = i;
 
 	return (0);
 }
@@ -898,8 +906,8 @@ name2oid(const char *name, int *oidp)
 	int i;
 	size_t j;
 
-	oid[0] = 0;
-	oid[1] = 3;
+	oid[0] = CTL_SYSCTL;
+	oid[1] = CTL_SYSCTL_NAME2OID;
 
 	j = CTL_MAXNAME * sizeof(int);
 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
@@ -917,8 +925,8 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
 	int i;
 	size_t j;
 
-	qoid[0] = 0;
-	qoid[1] = 4;
+	qoid[0] = CTL_SYSCTL;
+	qoid[1] = CTL_SYSCTL_OIDFMT;
 	memcpy(qoid + 2, oid, len * sizeof(int));
 
 	j = sizeof(buf);
@@ -964,10 +972,10 @@ show_var(int *oid, int nlen, bool honor_skip)
 	bzero(buf, BUFSIZ);
 	bzero(fmt, BUFSIZ);
 	bzero(name, BUFSIZ);
-	qoid[0] = 0;
+	qoid[0] = CTL_SYSCTL;
 	memcpy(qoid + 2, oid, nlen * sizeof(int));
 
-	qoid[1] = 1;
+	qoid[1] = CTL_SYSCTL_NAME;
 	j = sizeof(name);
 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
 	if (i || !j)
@@ -1006,7 +1014,7 @@ show_var(int *oid, int nlen, bool honor_skip)
 			printf("%s", prntype);
 			return (0);
 		}
-		qoid[1] = 5;
+		qoid[1] = CTL_SYSCTL_OIDDESCR;
 		j = sizeof(buf);
 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
 		printf("%s", buf);
@@ -1227,9 +1235,8 @@ sysctl_all(int *oid, int len)
 		if (len < 0 || l2 < (unsigned int)len)
 			return (0);
 
-		for (i = 0; i < len; i++)
-			if (name2[i] != oid[i])
-				return (0);
+		if (memcmp(name2, oid, len * sizeof(int)) != 0)
+			return (0);
 
 		i = show_var(name2, l2, honor_skip);
 		if (!i && !bflag)


More information about the svn-src-all mailing list