#!/bin/sh
# Applies sysctl.d(5) with procps (sysctl --system: same file order and
# overrides as systemd-sysctl, then /etc/sysctl.conf). As in systemd, a key
# written with a leading "-" may fail; procps itself skips keys it may not
# write (EACCES).
if out=$(sysctl -q --system 2>&1 >/dev/null); then
	exit 0
fi

dirs="/etc/sysctl.d /run/sysctl.d /usr/local/lib/sysctl.d /usr/lib/sysctl.d /lib/sysctl.d"
optional=$(for f in $(for d in $dirs; do echo "$d"/*.conf; done) /etc/sysctl.conf; do
	[ -r "$f" ] && sed -n 's/^[[:space:]]*-\([^=[:space:]]*\)[[:space:]]*=.*/\1/p' "$f"
done)

set -f
r=0
while IFS= read -r l; do
	case $l in
	*'permission denied on key'*) continue ;;
	*'setting key "'*)
		k=${l#*setting key \"}
		k=${k%%\"*}
		;;
	*'cannot stat /proc/sys/'*)
		k=${l#*cannot stat /proc/sys/}
		k=$(echo "${k%%:*}" | tr / .)
		;;
	*)
		echo "$l" >&2
		r=1
		continue
		;;
	esac
	ok=
	for p in $optional; do
		# shellcheck disable=SC2254
		case $k in $p) ok=1 ;; esac
	done
	[ -n "$ok" ] && continue
	echo "$l" >&2
	r=1
done <<EOF
$out
EOF
exit $r
