git: 52c426327403 - main - sndctl(8): Allow read-only sysctls

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Wed, 21 May 2025 19:31:36 UTC
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=52c4263274031d599aebfaed2862ae85b482953a

commit 52c4263274031d599aebfaed2862ae85b482953a
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2025-05-21 19:31:23 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2025-05-21 19:31:23 +0000

    sndctl(8): Allow read-only sysctls
    
    Needed by follow-up patch.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 day
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D50398
---
 usr.sbin/sndctl/sndctl.c | 56 +++++++++++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 22 deletions(-)

diff --git a/usr.sbin/sndctl/sndctl.c b/usr.sbin/sndctl/sndctl.c
index 412ea33e5adf..4d3ae0cf526c 100644
--- a/usr.sbin/sndctl/sndctl.c
+++ b/usr.sbin/sndctl/sndctl.c
@@ -664,30 +664,37 @@ sysctl_int(const char *buf, const char *arg, int *var)
 	size_t size;
 	int n, prev;
 
-	n = strtol(arg, NULL, 10);
-	if (errno == EINVAL || errno == ERANGE) {
-		warn("strtol(%s)", arg);
-		return (-1);
-	}
-
 	size = sizeof(int);
 	/* Read current value. */
 	if (sysctlbyname(buf, &prev, &size, NULL, 0) < 0) {
 		warn("sysctlbyname(%s)", buf);
 		return (-1);
 	}
-	/* Apply new value. */
-	if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
-		warn("sysctlbyname(%s, %d)", buf, n);
-		return (-1);
+
+	/* Read-only. */
+	if (arg != NULL) {
+		errno = 0;
+		n = strtol(arg, NULL, 10);
+		if (errno == EINVAL || errno == ERANGE) {
+			warn("strtol(%s)", arg);
+			return (-1);
+		}
+
+		/* Apply new value. */
+		if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
+			warn("sysctlbyname(%s, %d)", buf, n);
+			return (-1);
+		}
 	}
+
 	/* Read back applied value for good measure. */
 	if (sysctlbyname(buf, &n, &size, NULL, 0) < 0) {
 		warn("sysctlbyname(%s)", buf);
 		return (-1);
 	}
 
-	printf("%s: %d -> %d\n", buf, prev, n);
+	if (arg != NULL)
+		printf("%s: %d -> %d\n", buf, prev, n);
 	if (var != NULL)
 		*var = n;
 
@@ -708,17 +715,21 @@ sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
 		return (-1);
 	}
 
-	size = strlen(arg);
-	/* Apply new value. */
-	if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
-		warn("sysctlbyname(%s, %s)", buf, arg);
-		return (-1);
-	}
-	/* Get size of new string. */
-	if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
-		warn("sysctlbyname(%s)", buf);
-		return (-1);
+	/* Read-only. */
+	if (arg != NULL) {
+		size = strlen(arg);
+		/* Apply new value. */
+		if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
+			warn("sysctlbyname(%s, %s)", buf, arg);
+			return (-1);
+		}
+		/* Get size of new string. */
+		if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
+			warn("sysctlbyname(%s)", buf);
+			return (-1);
+		}
 	}
+
 	if ((tmp = calloc(1, size)) == NULL)
 		err(1, "calloc");
 	/* Read back applied value for good measure. */
@@ -728,7 +739,8 @@ sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
 		return (-1);
 	}
 
-	printf("%s: %s -> %s\n", buf, prev, tmp);
+	if (arg != NULL)
+		printf("%s: %s -> %s\n", buf, prev, tmp);
 	if (var != NULL)
 		strlcpy(var, tmp, varsz);
 	free(tmp);