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; }