summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/sysrc/sysrc47
-rw-r--r--usr.sbin/sysrc/sysrc.810
2 files changed, 49 insertions, 8 deletions
diff --git a/usr.sbin/sysrc/sysrc b/usr.sbin/sysrc/sysrc
index 01ea31f..70676e2 100644
--- a/usr.sbin/sysrc/sysrc
+++ b/usr.sbin/sysrc/sysrc
@@ -45,6 +45,7 @@ SYSRC_VERSION="6.0 Nov-07,2013"
#
# Options
#
+CHECK_ONLY=
DELETE=
DESCRIBE=
IGNORE_UNKNOWNS=
@@ -100,6 +101,8 @@ help()
"Dump a list of all non-default configuration variables."
f_err "$optfmt" "-A" \
"Dump a list of all configuration variables (incl. defaults)."
+ f_err "$optfmt" "-c" \
+ "Check. Return success if no changes needed, else error."
f_err "$optfmt" "-d" \
"Print a description of the given variable."
f_err "$optfmt" "-D" \
@@ -222,10 +225,11 @@ jail_depend()
#
# Process command-line flags
#
-while getopts aAdDef:Fhij:nNqR:vxX flag; do
+while getopts aAcdDef:Fhij:nNqR:vxX flag; do
case "$flag" in
a) SHOW_ALL=${SHOW_ALL:-1};;
A) SHOW_ALL=2;;
+ c) CHECK_ONLY=1;;
d) DESCRIBE=1;;
D) RC_CONFS=;;
e) SHOW_EQUALS=1;;
@@ -287,6 +291,12 @@ if [ "$DELETE" -a "$SHOW_ALL" ]; then
fi
#
+# Pre-flight for `-c' command-line option
+#
+[ "$CHECK_ONLY" -a "$SHOW_ALL" ] &&
+ die "$pgm: \`-c' option incompatible with \`-a'/\`-A' options"
+
+#
# Process `-e', `-n', and `-N' command-line options
#
SEP=': '
@@ -312,6 +322,7 @@ if [ "$JAIL" -o "$ROOTDIR" ]; then
$( [ "$DELETE" = "2" ] && echo \ -X )
$( [ "$SHOW_ALL" = "1" ] && echo \ -a )
$( [ "$SHOW_ALL" = "2" ] && echo \ -A )
+ ${CHECK_ONLY:+-c}
${DESCRIBE:+-d}
${SHOW_EQUALS:+-e}
${IGNORE_UNKNOWNS:+-i}
@@ -422,7 +433,7 @@ if [ "$SHOW_ALL" ]; then
EXCEPT="IFS|EXCEPT|PATH|RC_DEFAULTS|OPTIND|DESCRIBE|SEP"
EXCEPT="$EXCEPT|DELETE|SHOW_ALL|SHOW_EQUALS|SHOW_NAME"
EXCEPT="$EXCEPT|SHOW_VALUE|SHOW_FILE|SYSRC_VERBOSE|RC_CONFS"
- EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE"
+ EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE|CHECK_ONLY"
EXCEPT="$EXCEPT|f_sysrc_desc_awk|f_sysrc_delete_awk"
#
@@ -515,6 +526,7 @@ fi
#
# Process command-line arguments
#
+costatus=$SUCCESS
while [ $# -gt 0 ]; do
NAME="${1%%=*}"
@@ -528,7 +540,7 @@ while [ $# -gt 0 ]; do
# first describe, then attempt to set
#
- if [ "$SYSRC_VERBOSE" ]; then
+ if [ "$SYSRC_VERBOSE" -a ! "$CHECK_ONLY" ]; then
file=$( f_sysrc_find "$NAME" )
[ "$file" = "$RC_DEFAULTS" -o ! "$file" ] && \
file=$( f_sysrc_get 'rc_conf_files%%[$IFS]*' )
@@ -546,6 +558,20 @@ while [ $# -gt 0 ]; do
fi
#
+ # If `-c' is passed, simply compare and move on
+ #
+ if [ "$CHECK_ONLY" ]; then
+ if ! IGNORED=$( f_sysrc_get "$NAME?" ); then
+ costatus=$FAILURE
+ else
+ value=$( f_sysrc_get "$NAME" )
+ [ "$value" = "${1#*=}" ] || costatus=$FAILURE
+ fi
+ shift 1
+ continue
+ fi
+
+ #
# If `-N' is passed, simplify the output
#
if [ ! "$SHOW_VALUE" ]; then
@@ -572,9 +598,16 @@ while [ $# -gt 0 ]; do
fi
;;
*)
- if ! IGNORED="$( f_sysrc_get "$NAME?" )"; then
- [ "$IGNORE_UNKNOWNS" ] \
- || echo "$pgm: unknown variable '$NAME'"
+ if ! IGNORED=$( f_sysrc_get "$NAME?" ); then
+ [ "$IGNORE_UNKNOWNS" ] ||
+ echo "$pgm: unknown variable '$NAME'"
+ shift 1
+ costatus=$FAILURE
+ continue
+ fi
+
+ # The above check told us what we needed for `-c'
+ if [ "$CHECK_ONLY" ]; then
shift 1
continue
fi
@@ -623,3 +656,5 @@ while [ $# -gt 0 ]; do
esac
shift 1
done
+
+[ ! "$CHECK_ONLY" ] || exit $costatus
diff --git a/usr.sbin/sysrc/sysrc.8 b/usr.sbin/sysrc/sysrc.8
index 0a4aace..6d53e19 100644
--- a/usr.sbin/sysrc/sysrc.8
+++ b/usr.sbin/sysrc/sysrc.8
@@ -32,13 +32,13 @@
.Nd safely edit system rc files
.Sh SYNOPSIS
.Nm
-.Op Fl dDeFhinNqvx
+.Op Fl cdDeFhinNqvx
.Op Fl f Ar file
.Op Fl j Ar jail | Fl R Ar dir
.Ar name Ns Op = Ns Ar value
.Ar ...
.Nm
-.Op Fl dDeFhinNqvx
+.Op Fl cdDeFhinNqvx
.Op Fl f Ar file
.Op Fl j Ar jail | Fl R Ar dir
.Fl a | A
@@ -57,6 +57,12 @@ Dump a list of all non-default configuration variables.
.It Fl A
Dump a list of all configuration variables
.Pq incl. defaults .
+.It Fl c
+Check if the value will change when assigning a new value.
+If verbose
+.Pq see Dq Fl v
+prints a message stating whether a change would occur.
+Exits with success if no change is necessary, else returns error status.
.It Fl d
Print a description of the given variable.
.It Fl D
OpenPOWER on IntegriCloud