From 5b37d9eba744dee55431a0426bafd09eef483fea Mon Sep 17 00:00:00 2001
From: mtm <mtm@FreeBSD.org>
Date: Mon, 23 Jun 2008 22:06:28 +0000
Subject: [PATCH] The sysctl(8) program exits on some errors and only emits
 warnings on others. In the case where it displayed warnings it would still
 return succesfully. Modify it so that it returns the number of sysctls that
 it was not able to set.

Make use of this in rc.d to display only *unsuccessfull* attempts to
set sysctls.
---
 etc/rc.d/auto_linklocal | 5 ++++-
 etc/rc.d/power_profile  | 6 +++++-
 etc/rc.d/sysctl         | 4 +++-
 sbin/sysctl/sysctl.c    | 7 +++++--
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/etc/rc.d/auto_linklocal b/etc/rc.d/auto_linklocal
index 8278696d741a..28d03c0cd6f0 100644
--- a/etc/rc.d/auto_linklocal
+++ b/etc/rc.d/auto_linklocal
@@ -18,7 +18,10 @@ stop_cmd=":"
 auto_linklocal_start()
 {
 	if ! checkyesno ipv6_enable && ${SYSCTL} net.inet6 > /dev/null 2>&1; then
-		${SYSCTL_W} net.inet6.ip6.auto_linklocal=0
+		if ! ${SYSCTL_W} net.inet6.ip6.auto_linklocal=0 >/dev/null 2>&1; then
+			warn "failed to set sysctl(8)"
+			return 1
+		fi
 		laddr=`network6_getladdr lo0`
 		if [ -z "${laddr}" ]; then
 			ifconfig lo0 inet6 fe80::1 prefixlen 64
diff --git a/etc/rc.d/power_profile b/etc/rc.d/power_profile
index 7f64b7229575..03d36be5b380 100644
--- a/etc/rc.d/power_profile
+++ b/etc/rc.d/power_profile
@@ -50,7 +50,11 @@ sysctl_set ()
 	esac
 
 	# Set the desired value
-	[ -n "${value}" ] && sysctl ${node}=${value}
+	if [ -n "${value}" ]; then
+		if ! sysctl ${node}=${value} > /dev/null 2>&1; then
+			warn "unable to set ${node}=${value}"
+		fi
+	fi
 }
 
 if [ $# -ne 1 ]; then
diff --git a/etc/rc.d/sysctl b/etc/rc.d/sysctl
index f83d7f8c83d2..c55cc846f46a 100644
--- a/etc/rc.d/sysctl
+++ b/etc/rc.d/sysctl
@@ -36,7 +36,9 @@ sysctl_start()
 					${val})
 						;;
 					*)
-						sysctl "${var}"
+						if ! sysctl "${var}" >/dev/null 2>&1; then
+							warn "unable to set ${var}"
+						fi
 						;;
 					esac
 				elif [ "$1" = "last" ]; then
diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c
index 9dcfcb06bfd9..bcb5a119b056 100644
--- a/sbin/sysctl/sysctl.c
+++ b/sbin/sysctl/sysctl.c
@@ -59,7 +59,7 @@ static const char rcsid[] =
 #include <unistd.h>
 
 static int	aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag;
-static int	qflag, xflag;
+static int	qflag, xflag, warncount;
 
 static int	oidfmt(int *, int, char *, u_int *);
 static void	parse(char *);
@@ -146,9 +146,11 @@ main(int argc, char **argv)
 		exit(sysctl_all(0, 0));
 	if (argc == 0)
 		usage();
+
+	warncount = 0;
 	while (argc-- > 0)
 		parse(*argv++);
-	exit(0);
+	exit(warncount);
 }
 
 /*
@@ -304,6 +306,7 @@ parse(char *string)
 					string);
 			default:
 				warn("%s", string);
+				warncount++;
 				return;
 			}
 		}