Module Name: src
Committed By: dholland
Date: Sun Jul 31 23:30:28 UTC 2016
Modified Files:
src/sbin/sysctl: sysctl.c
Log Message:
Apply patch from PR 43587, mostly from martin and kre. When writing a
sysctl variable using ?= fails with EPERM, don't print an error
message.
Ideally setting a sysctl to the same value it already has should also
not fail regardless of permissions, but this would need to be done in
the kernel.
To generate a diff of this commit:
cvs rdiff -u -r1.157 -r1.158 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.157 src/sbin/sysctl/sysctl.c:1.158
--- src/sbin/sysctl/sysctl.c:1.157 Sun Dec 13 14:24:47 2015
+++ src/sbin/sysctl/sysctl.c Sun Jul 31 23:30:28 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: sysctl.c,v 1.157 2015/12/13 14:24:47 christos Exp $ */
+/* $NetBSD: sysctl.c,v 1.158 2016/07/31 23:30:28 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@ __COPYRIGHT("@(#) Copyright (c) 1993\
#if 0
static char sccsid[] = "@(#)sysctl.c 8.1 (Berkeley) 6/6/93";
#else
-__RCSID("$NetBSD: sysctl.c,v 1.157 2015/12/13 14:24:47 christos Exp $");
+__RCSID("$NetBSD: sysctl.c,v 1.158 2016/07/31 23:30:28 dholland Exp $");
#endif
#endif /* not lint */
@@ -128,8 +128,8 @@ static void canonicalize(const char *, c
static void purge_tree(struct sysctlnode *);
static void print_tree(int *, u_int, struct sysctlnode *, u_int, int, regex_t *,
size_t *);
-static void write_number(int *, u_int, struct sysctlnode *, char *);
-static void write_string(int *, u_int, struct sysctlnode *, char *);
+static void write_number(int *, u_int, struct sysctlnode *, char *, bool);
+static void write_string(int *, u_int, struct sysctlnode *, char *, bool);
static void display_number(const struct sysctlnode *, const char *,
const void *, size_t, int);
static void display_string(const struct sysctlnode *, const char *,
@@ -946,10 +946,10 @@ parse(char *l, regex_t *re, size_t *last
case CTLTYPE_INT:
case CTLTYPE_BOOL:
case CTLTYPE_QUAD:
- write_number(&name[0], namelen, node, value);
+ write_number(&name[0], namelen, node, value, optional);
break;
case CTLTYPE_STRING:
- write_string(&name[0], namelen, node, value);
+ write_string(&name[0], namelen, node, value, optional);
break;
case CTLTYPE_STRUCT:
/*
@@ -1754,7 +1754,8 @@ sysctlperror(const char *fmt, ...)
* ********************************************************************
*/
static void
-write_number(int *name, u_int namelen, struct sysctlnode *node, char *value)
+write_number(int *name, u_int namelen, struct sysctlnode *node, char *value,
+ bool optional)
{
u_int ii, io;
u_quad_t qi, qo;
@@ -1811,7 +1812,9 @@ write_number(int *name, u_int namelen, s
rc = prog_sysctl(name, namelen, o, &so, i, si);
if (rc == -1) {
- sysctlerror(0);
+ if (!optional || errno != EPERM) {
+ sysctlerror(0);
+ }
return;
}
@@ -1832,7 +1835,8 @@ write_number(int *name, u_int namelen, s
}
static void
-write_string(int *name, u_int namelen, struct sysctlnode *node, char *value)
+write_string(int *name, u_int namelen, struct sysctlnode *node, char *value,
+ bool optional)
{
char *i, *o;
size_t si, so;
@@ -1853,7 +1857,10 @@ write_string(int *name, u_int namelen, s
rc = prog_sysctl(name, namelen, o, &so, i, si);
if (rc == -1) {
- sysctlerror(0);
+ if (!optional || errno != EPERM) {
+ sysctlerror(0);
+ }
+ free(o);
return;
}