sysrc revision 241565
1241149Sdteske#!/bin/sh 2241149Sdteske#- 3241149Sdteske# Copyright (c) 2010-2012 Devin Teske 4241149Sdteske# All rights reserved. 5241149Sdteske# 6241149Sdteske# Redistribution and use in source and binary forms, with or without 7241149Sdteske# modification, are permitted provided that the following conditions 8241149Sdteske# are met: 9241149Sdteske# 1. Redistributions of source code must retain the above copyright 10241149Sdteske# notice, this list of conditions and the following disclaimer. 11241149Sdteske# 2. Redistributions in binary form must reproduce the above copyright 12241149Sdteske# notice, this list of conditions and the following disclaimer in the 13241149Sdteske# documentation and/or other materials provided with the distribution. 14241149Sdteske# 15241149Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16241149Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE 17241149Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18241149Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19241149Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20241149Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21241149Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22241149Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23241149Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24241149Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25241149Sdteske# SUCH DAMAGE. 26241149Sdteske# 27241149Sdteske# $FreeBSD: head/usr.sbin/sysrc/sysrc 241565 2012-10-14 23:45:56Z dteske $ 28241149Sdteske# 29241149Sdteske############################################################ INCLUDES 30241149Sdteske 31241149SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 32241149Sdteske[ "$_COMMON_SUBR" ] || . $BSDCFG_SHARE/common.subr || exit 1 33241149Sdteske[ "$_SYSRC_SUBR" ] || f_include $BSDCFG_SHARE/sysrc.subr 34241149Sdteske 35241149Sdteske############################################################ CONFIGURATION 36241149Sdteske 37241149Sdteske# 38241149Sdteske# Default verbosity. 39241149Sdteske# 40241149Sdteske: ${SYSRC_VERBOSE:=} 41241149Sdteske 42241149Sdteske############################################################ GLOBALS 43241149Sdteske 44241149Sdteske# 45241149Sdteske# Options 46241149Sdteske# 47241149SdteskeDELETE= 48241149SdteskeDESCRIBE= 49241149SdteskeIGNORE_UNKNOWNS= 50241149SdteskeJAIL= 51241149SdteskeQUIET= 52241149SdteskeROOTDIR= 53241149SdteskeSHOW_ALL= 54241149SdteskeSHOW_EQUALS= 55241149SdteskeSHOW_FILE= 56241149SdteskeSHOW_NAME=1 57241149SdteskeSHOW_VALUE=1 58241149Sdteske 59241149Sdteske############################################################ FUNCTIONS 60241149Sdteske 61241149Sdteske# die [ $fmt [ $opts ... ]] 62241149Sdteske# 63241149Sdteske# Optionally print a message to stderr before exiting with failure status. 64241149Sdteske# 65241149Sdteskedie() 66241149Sdteske{ 67241149Sdteske local fmt="$1" 68241149Sdteske [ $# -gt 0 ] && shift 1 69241149Sdteske [ "$fmt" ] && f_err "$fmt\n" "$@" 70241149Sdteske 71241149Sdteske exit $FAILURE 72241149Sdteske} 73241149Sdteske 74241149Sdteske# usage 75241149Sdteske# 76241149Sdteske# Prints a short syntax statement and exits. 77241149Sdteske# 78241149Sdteskeusage() 79241149Sdteske{ 80241149Sdteske f_err "Usage: %s [OPTIONS] name[=value] ...\n" "$pgm" 81241149Sdteske f_err "Try \`%s --help' for more information.\n" "$pgm" 82241149Sdteske die 83241149Sdteske} 84241149Sdteske 85241149Sdteske# help 86241149Sdteske# 87241149Sdteske# Prints a full syntax statement and exits. 88241149Sdteske# 89241149Sdteskehelp() 90241149Sdteske{ 91241149Sdteske local optfmt="\t%-11s%s\n" 92241149Sdteske local envfmt="\t%-17s%s\n" 93241149Sdteske 94241149Sdteske f_err "Usage: %s [OPTIONS] name[=value] ...\n" "$pgm" 95241149Sdteske 96241149Sdteske f_err "OPTIONS:\n" 97241149Sdteske f_err "$optfmt" "-a" \ 98241149Sdteske "Dump a list of all non-default configuration variables." 99241149Sdteske f_err "$optfmt" "-A" \ 100241149Sdteske "Dump a list of all configuration variables (incl. defaults)." 101241149Sdteske f_err "$optfmt" "-d" \ 102241149Sdteske "Print a description of the given variable." 103241149Sdteske f_err "$optfmt" "-D" \ 104241149Sdteske "Show default value(s) only (this is the same as setting" 105241149Sdteske f_err "$optfmt" "" \ 106241149Sdteske "RC_CONFS to NULL or passing \`-f' with a NULL file-argument)." 107241149Sdteske f_err "$optfmt" "-e" \ 108241149Sdteske "Print query results as \`var=value' (useful for producing" 109241149Sdteske f_err "$optfmt" "" \ 110241149Sdteske "output to be fed back in). Ignored if \`-n' is specified." 111241149Sdteske f_err "$optfmt" "-f file" \ 112241149Sdteske "Operate on the specified file(s) instead of rc_conf_files." 113241149Sdteske f_err "$optfmt" "" \ 114241149Sdteske "Can be specified multiple times for additional files." 115241149Sdteske f_err "$optfmt" "-F" \ 116241149Sdteske "Show only the last rc.conf(5) file each directive is in." 117241149Sdteske f_err "$optfmt" "-h" \ 118241149Sdteske "Print a short usage statement to stderr and exit." 119241149Sdteske f_err "$optfmt" "--help" \ 120241149Sdteske "Print this message to stderr and exit." 121241149Sdteske f_err "$optfmt" "-i" \ 122241149Sdteske "Ignore unknown variables." 123241149Sdteske f_err "$optfmt" "-j jail" \ 124241149Sdteske "The jid or name of the jail to operate within (overrides" 125241149Sdteske f_err "$optfmt" "" \ 126241149Sdteske "\`-R dir'; requires jexec(8))." 127241149Sdteske f_err "$optfmt" "-n" \ 128241149Sdteske "Show only variable values, not their names." 129241149Sdteske f_err "$optfmt" "-N" \ 130241149Sdteske "Show only variable names, not their values." 131241149Sdteske f_err "$optfmt" "-q" \ 132241149Sdteske "Quiet. Ignore previous \`-v' and/or SYSRC_VERBOSE." 133241149Sdteske f_err "$optfmt" "-R dir" \ 134241149Sdteske "Operate within the root directory \`dir' rather than \`/'." 135241149Sdteske f_err "$optfmt" "-v" \ 136241149Sdteske "Verbose. Print the pathname of the specific rc.conf(5)" 137241149Sdteske f_err "$optfmt" "" \ 138241149Sdteske "file where the directive was found." 139241149Sdteske f_err "$optfmt" "-x" \ 140241149Sdteske "Remove variable(s) from specified file(s)." 141241149Sdteske f_err "\n" 142241149Sdteske 143241149Sdteske f_err "ENVIRONMENT:\n" 144241149Sdteske f_err "$envfmt" "RC_CONFS" \ 145241149Sdteske "Override default rc_conf_files (even if set to NULL)." 146241149Sdteske f_err "$envfmt" "RC_DEFAULTS" \ 147241149Sdteske "Location of \`/etc/defaults/rc.conf' file." 148241149Sdteske f_err "$envfmt" "SYSRC_VERBOSE" \ 149241149Sdteske "Default verbosity. Set to non-NULL to enable." 150241149Sdteske 151241149Sdteske die 152241149Sdteske} 153241149Sdteske 154241149Sdteske# jail_depend 155241149Sdteske# 156241149Sdteske# Dump dependencies such as language-file variables and include files to stdout 157241149Sdteske# to be piped-into sh(1) running via jexec(8)/chroot(8). As a security measure, 158241149Sdteske# this prevents existing language files and library files from being loaded in 159241149Sdteske# the jail. This also relaxes the requirement to have these files in every jail 160241149Sdteske# before sysrc can be used on said jail. 161241149Sdteske# 162241149Sdteskejail_depend() 163241149Sdteske{ 164241149Sdteske # 165241149Sdteske # Indicate that we are jailed 166241149Sdteske # 167241149Sdteske echo export _SYSRC_JAILED=1 168241149Sdteske 169241149Sdteske # 170241149Sdteske # Print i18n language variables (their current values are sanitized 171241149Sdteske # and re-printed for interpretation so that the i18n language files 172241149Sdteske # do not need to exist within the jail). 173241149Sdteske # 174241149Sdteske local var val 175241149Sdteske for var in \ 176241149Sdteske msg_cannot_create_permission_denied \ 177241149Sdteske msg_permission_denied \ 178241149Sdteske msg_previous_syntax_errors \ 179241149Sdteske ; do 180241149Sdteske val=$( eval echo \"\$$var\" | 181241149Sdteske awk '{ gsub(/'\''/, "'\''\\'\'\''"); print }' ) 182241149Sdteske echo $var="'$val'" 183241149Sdteske done 184241149Sdteske 185241149Sdteske # 186241149Sdteske # Print include dependencies 187241149Sdteske # 188241149Sdteske cat $BSDCFG_SHARE/common.subr 189241149Sdteske cat $BSDCFG_SHARE/sysrc.subr 190241149Sdteske} 191241149Sdteske 192241149Sdteske############################################################ MAIN SOURCE 193241149Sdteske 194241149Sdteske# 195241149Sdteske# Perform sanity checks 196241149Sdteske# 197241149Sdteske[ $# -gt 0 ] || usage 198241149Sdteske 199241149Sdteske# 200241149Sdteske# Check for `--help' command-line option 201241149Sdteske# 202241149Sdteske( # Operate in sub-shell to protect $@ in parent 203241149Sdteske while [ $# -gt 0 ]; do 204241149Sdteske case "$1" in 205241149Sdteske --help) exit 1;; 206241149Sdteske -[fRj]) # These flags take an argument 207241149Sdteske shift 1;; 208241149Sdteske esac 209241149Sdteske shift 1 210241149Sdteske done 211241149Sdteske exit 0 212241149Sdteske) || help 213241149Sdteske 214241149Sdteske# 215241149Sdteske# Process command-line flags 216241149Sdteske# 217241149Sdteskewhile getopts aAdDef:Fhij:nNqR:vxX flag; do 218241149Sdteske case "$flag" in 219241149Sdteske a) SHOW_ALL=${SHOW_ALL:-1};; 220241149Sdteske A) SHOW_ALL=2;; 221241149Sdteske d) DESCRIBE=1;; 222241149Sdteske D) RC_CONFS=;; 223241149Sdteske e) SHOW_EQUALS=1;; 224241149Sdteske f) RC_CONFS="$RC_CONFS${RC_CONFS:+ }$OPTARG";; 225241149Sdteske F) SHOW_FILE=1;; 226241149Sdteske h) usage;; 227241149Sdteske i) IGNORE_UNKNOWNS=1;; 228241149Sdteske j) [ "$OPTARG" ] || die \ 229241149Sdteske "%s: Missing or null argument to \`-j' flag" "$pgm" 230241149Sdteske JAIL="$OPTARG";; 231241149Sdteske n) SHOW_NAME=;; 232241149Sdteske N) SHOW_VALUE=;; 233241149Sdteske q) QUIET=1 SYSRC_VERBOSE=;; 234241149Sdteske R) [ "$OPTARG" ] || die \ 235241149Sdteske "%s: Missing or null argument to \`-R' flag" "$pgm" 236241149Sdteske ROOTDIR="$OPTARG";; 237241149Sdteske v) SYSRC_VERBOSE=1 QUIET=;; 238241149Sdteske x) DELETE=${DELETE:-1};; 239241149Sdteske X) DELETE=2;; 240241149Sdteske \?) usage;; 241241149Sdteske esac 242241149Sdteskedone 243241149Sdteskeshift $(( $OPTIND - 1 )) 244241149Sdteske 245241149Sdteske# 246241149Sdteske# [More] Sanity checks (e.g., "sysrc --") 247241149Sdteske# 248241149Sdteske[ $# -eq 0 -a ! "$SHOW_ALL" ] && usage 249241149Sdteske 250241149Sdteske# 251241149Sdteske# Taint-check all rc.conf(5) files 252241149Sdteske# 253241149Sdteskeerrmsg="$pgm: Exiting due to previous syntax errors" 254241565Sdteskeif [ "${RC_CONFS+set}" ]; then 255241149Sdteske ( for i in $RC_CONFS; do 256241149Sdteske [ -e "$i" ] || continue 257241149Sdteske /bin/sh -n "$i" || exit $FAILURE 258241149Sdteske done 259241149Sdteske exit $SUCCESS 260241149Sdteske ) || die "$errmsg" 261241149Sdteskeelse 262241149Sdteske /bin/sh -n "$RC_DEFAULTS" || die "$errmsg" 263241149Sdteske ( . "$RC_DEFAULTS" 264241149Sdteske for i in $rc_conf_files; do 265241149Sdteske [ -e "$i" ] || continue 266241149Sdteske /bin/sh -n "$i" || exit $FAILURE 267241149Sdteske done 268241149Sdteske exit $SUCCESS 269241149Sdteske ) || die "$errmsg" 270241149Sdteskefi 271241149Sdteske 272241149Sdteske# 273241149Sdteske# Process `-x' (and secret `-X') command-line options 274241149Sdteske# 275241149Sdteskeerrmsg="$pgm: \`-x' option incompatible with \`-a'/\`-A' options" 276241149Sdteskeerrmsg="$errmsg (use \`-X' to override)" 277241149Sdteskeif [ "$DELETE" -a "$SHOW_ALL" ]; then 278241149Sdteske [ "$DELETE" = "2" ] || die "$errmsg" 279241149Sdteskefi 280241149Sdteske 281241149Sdteske# 282241149Sdteske# Process `-e', `-n', and `-N' command-line options 283241149Sdteske# 284241149SdteskeSEP=': ' 285241149Sdteske[ "$SHOW_EQUALS" ] && SEP='="' 286241149Sdteske[ "$SHOW_NAME" ] || SHOW_EQUALS= 287241149Sdteske[ "$SYSRC_VERBOSE" = "0" ] && SYSRC_VERBOSE= 288241149Sdteskeif [ ! "$SHOW_VALUE" ]; then 289241149Sdteske SHOW_NAME=1 290241149Sdteske SHOW_EQUALS= 291241149Sdteskefi 292241149Sdteske 293241149Sdteske# 294241149Sdteske# Process `-j jail' and `-R dir' command-line options 295241149Sdteske# 296241149Sdteskeif [ "$JAIL" -o "$ROOTDIR" ]; then 297241149Sdteske # 298241149Sdteske # Reconstruct the arguments that we want to carry-over 299241149Sdteske # 300241149Sdteske args=" 301241149Sdteske ${SYSRC_VERBOSE:+-v} 302241149Sdteske ${QUIET:+-q} 303241149Sdteske $( [ "$DELETE" = "1" ] && echo \ -x ) 304241149Sdteske $( [ "$DELETE" = "2" ] && echo \ -X ) 305241149Sdteske $( [ "$SHOW_ALL" = "1" ] && echo \ -a ) 306241149Sdteske $( [ "$SHOW_ALL" = "2" ] && echo \ -A ) 307241149Sdteske ${DESCRIBE:+-d} 308241149Sdteske ${SHOW_EQUALS:+-e} 309241149Sdteske ${IGNORE_UNKNOWNS:+-i} 310241149Sdteske $( [ "$SHOW_NAME" ] || echo \ -n ) 311241149Sdteske $( [ "$SHOW_VALUE" ] || echo \ -N ) 312241149Sdteske $( [ "$SHOW_FILE" ] && echo \ -F ) 313241149Sdteske " 314241565Sdteske if [ "${RC_CONFS+set}" ]; then 315241149Sdteske args="$args -f '$RC_CONFS'" 316241149Sdteske fi 317241149Sdteske for arg in "$@"; do 318241149Sdteske args="$args '$arg'" 319241149Sdteske done 320241149Sdteske 321241149Sdteske # 322241149Sdteske # If both are supplied, `-j jail' supercedes `-R dir' 323241149Sdteske # 324241149Sdteske if [ "$JAIL" ]; then 325241149Sdteske # 326241149Sdteske # Re-execute ourselves with sh(1) via jexec(8) 327241149Sdteske # 328241149Sdteske ( echo set -- $args 329241149Sdteske jail_depend 330241149Sdteske cat $0 331241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 332241149Sdteske /usr/sbin/jexec "$JAIL" /bin/sh 333241149Sdteske exit $? 334241149Sdteske elif [ "$ROOTDIR" ]; then 335241149Sdteske # 336241149Sdteske # Make sure that the root directory specified is not to any 337241149Sdteske # running jails. 338241149Sdteske # 339241149Sdteske # NOTE: To maintain backward compatibility with older jails on 340241149Sdteske # older systems, we will not perform this check if either the 341241149Sdteske # jls(1) or jexec(8) utilities are missing. 342241149Sdteske # 343241149Sdteske if f_have jexec && f_have jls; then 344241149Sdteske jid="`jls jid path | \ 345241149Sdteske ( 346241149Sdteske while read JID JROOT; do 347241149Sdteske [ "$JROOT" = "$ROOTDIR" ] || continue 348241149Sdteske echo $JID 349241149Sdteske done 350241149Sdteske )`" 351241149Sdteske 352241149Sdteske # 353241149Sdteske # If multiple running jails match the specified root 354241149Sdteske # directory, exit with error. 355241149Sdteske # 356241149Sdteske if [ "$jid" -a "${jid%[$IFS]*}" != "$jid" ]; then 357241149Sdteske die "%s: %s: %s" "$pgm" "$ROOTDIR" \ 358241149Sdteske "$( echo "Multiple jails claim this" \ 359241149Sdteske "directory as their root." \ 360241149Sdteske "(use \`-j jail' instead)" )" 361241149Sdteske fi 362241149Sdteske 363241149Sdteske # 364241149Sdteske # If only a single running jail matches the specified 365241149Sdteske # root directory, implicitly use `-j jail'. 366241149Sdteske # 367241149Sdteske if [ "$jid" ]; then 368241149Sdteske # 369241149Sdteske # Re-execute outselves with sh(1) via jexec(8) 370241149Sdteske # 371241149Sdteske ( echo set -- $args 372241149Sdteske jail_depend 373241149Sdteske cat $0 374241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 375241149Sdteske /usr/sbin/jexec "$jid" /bin/sh 376241149Sdteske exit $? 377241149Sdteske fi 378241149Sdteske 379241149Sdteske # Otherwise, fall through and allow chroot(8) 380241149Sdteske fi 381241149Sdteske 382241149Sdteske # 383241149Sdteske # Re-execute ourselves with sh(1) via chroot(8) 384241149Sdteske # 385241149Sdteske ( echo set -- $args 386241149Sdteske jail_depend 387241149Sdteske cat $0 388241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 389241149Sdteske /usr/sbin/chroot "$ROOTDIR" /bin/sh 390241149Sdteske exit $? 391241149Sdteske fi 392241149Sdteskefi 393241149Sdteske 394241149Sdteske# 395241149Sdteske# Process `-a' or `-A' command-line options 396241149Sdteske# 397241149Sdteskeif [ "$SHOW_ALL" ]; then 398241149Sdteske # 399241149Sdteske # Get a list of variables that are currently set in the rc.conf(5) 400241149Sdteske # files (included `/etc/defaults/rc.conf') by performing a call to 401241149Sdteske # source_rc_confs() in a clean environment. 402241149Sdteske # 403241149Sdteske ( # Operate in a sub-shell to protect the parent environment 404241149Sdteske # 405241149Sdteske # Set which variables we want to preserve in the environment. 406241149Sdteske # Append the pipe-character (|) to the list of internal field 407241149Sdteske # separation (IFS) characters, allowing us to use the below 408241149Sdteske # list both as an extended grep (-E) pattern and argument list 409241149Sdteske # (required to first get f_clean_env() to preserve these in the 410241149Sdteske # environment and then later to prune them from the list of 411241149Sdteske # variables produced by set(1)). 412241149Sdteske # 413241149Sdteske IFS="$IFS|" 414241149Sdteske EXCEPT="IFS|EXCEPT|PATH|RC_DEFAULTS|OPTIND|DESCRIBE|SEP" 415241149Sdteske EXCEPT="$EXCEPT|DELETE|SHOW_ALL|SHOW_EQUALS|SHOW_NAME" 416241149Sdteske EXCEPT="$EXCEPT|SHOW_VALUE|SHOW_FILE|SYSRC_VERBOSE|RC_CONFS" 417241149Sdteske EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE" 418241149Sdteske EXCEPT="$EXCEPT|f_sysrc_desc_awk|f_sysrc_delete_awk" 419241149Sdteske 420241149Sdteske # 421241149Sdteske # Clean the environment (except for our required variables) 422241149Sdteske # and then source the required files. 423241149Sdteske # 424241149Sdteske f_clean_env --except $EXCEPT 425241149Sdteske if [ -f "$RC_DEFAULTS" -a -r "$RC_DEFAULTS" ]; then 426241149Sdteske . "$RC_DEFAULTS" 427241149Sdteske 428241149Sdteske # 429241149Sdteske # If passed `-a' (rather than `-A'), re-purge the 430241149Sdteske # environment, removing the rc.conf(5) defaults. 431241149Sdteske # 432241149Sdteske [ "$SHOW_ALL" = "1" ] \ 433241149Sdteske && f_clean_env --except rc_conf_files $EXCEPT 434241149Sdteske 435241149Sdteske # 436241149Sdteske # If `-f file' was passed, set $rc_conf_files to an 437241149Sdteske # explicit value, modifying the default behavior of 438241149Sdteske # source_rc_confs(). 439241149Sdteske # 440241565Sdteske [ "${RC_CONFS+set}" ] && rc_conf_files="$RC_CONFS" 441241149Sdteske 442241149Sdteske source_rc_confs 443241149Sdteske 444241149Sdteske # 445241149Sdteske # If passed `-a' (rather than `-A'), remove 446241149Sdteske # `rc_conf_files' unless it was defined somewhere 447241149Sdteske # other than rc.conf(5) defaults. 448241149Sdteske # 449241149Sdteske [ "$SHOW_ALL" = "1" -a \ 450241149Sdteske "$( f_sysrc_find rc_conf_files )" = "$RC_DEFAULTS" \ 451241149Sdteske ] \ 452241149Sdteske && unset rc_conf_files 453241149Sdteske fi 454241149Sdteske 455241149Sdteske for NAME in $( set | 456241149Sdteske awk -F= '/^[[:alpha:]_][[:alnum:]_]*=/ {print $1}' | 457241149Sdteske grep -Ev "^($EXCEPT)$" 458241149Sdteske ); do 459241149Sdteske # 460241149Sdteske # If enabled, describe rather than expand value 461241149Sdteske # 462241149Sdteske if [ "$DESCRIBE" ]; then 463241149Sdteske echo "$NAME: $( f_sysrc_desc "$NAME" )" 464241149Sdteske continue 465241149Sdteske fi 466241149Sdteske 467241149Sdteske # 468241149Sdteske # If `-F' is passed, find it and move on 469241149Sdteske # 470241149Sdteske if [ "$SHOW_FILE" ]; then 471241149Sdteske [ "$SHOW_NAME" ] && echo -n "$NAME: " 472241149Sdteske f_sysrc_find "$NAME" 473241149Sdteske continue 474241149Sdteske fi 475241149Sdteske 476241149Sdteske # 477241149Sdteske # If `-X' is passed, delete the variables 478241149Sdteske # 479241149Sdteske if [ "$DELETE" = "2" ]; then 480241149Sdteske f_sysrc_delete "$NAME" 481241149Sdteske continue 482241149Sdteske fi 483241149Sdteske 484241149Sdteske [ "$SYSRC_VERBOSE" ] && \ 485241149Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 486241149Sdteske 487241149Sdteske # 488241149Sdteske # If `-N' is passed, simplify the output 489241149Sdteske # 490241149Sdteske if [ ! "$SHOW_VALUE" ]; then 491241149Sdteske echo "$NAME" 492241149Sdteske continue 493241149Sdteske fi 494241149Sdteske 495241149Sdteske echo "${SHOW_NAME:+$NAME$SEP}$( 496241149Sdteske f_sysrc_get "$NAME" )${SHOW_EQUALS:+\"}" 497241149Sdteske 498241149Sdteske done 499241149Sdteske ) 500241149Sdteske 501241149Sdteske # 502241149Sdteske # Ignore the remainder of positional arguments. 503241149Sdteske # 504241149Sdteske exit $SUCCESS 505241149Sdteskefi 506241149Sdteske 507241149Sdteske# 508241149Sdteske# Process command-line arguments 509241149Sdteske# 510241149Sdteskewhile [ $# -gt 0 ]; do 511241149Sdteske NAME="${1%%=*}" 512241149Sdteske 513241149Sdteske [ "$DESCRIBE" ] && \ 514241149Sdteske echo "$NAME: $( f_sysrc_desc "$NAME" )" 515241149Sdteske 516241149Sdteske case "$1" in 517241149Sdteske *=*) 518241149Sdteske # 519241149Sdteske # Like sysctl(8), if both `-d' AND "name=value" is passed, 520241149Sdteske # first describe, then attempt to set 521241149Sdteske # 522241149Sdteske 523241149Sdteske if [ "$SYSRC_VERBOSE" ]; then 524241149Sdteske file=$( f_sysrc_find "$NAME" ) 525241149Sdteske [ "$file" = "$RC_DEFAULTS" -o ! "$file" ] && \ 526241149Sdteske file=$( f_sysrc_get 'rc_conf_files%%[$IFS]*' ) 527241149Sdteske echo -n "$file: " 528241149Sdteske fi 529241149Sdteske 530241149Sdteske # 531241149Sdteske # If `-x' or `-X' is passed, delete the variable and ignore the 532241149Sdteske # desire to set some value 533241149Sdteske # 534241149Sdteske if [ "$DELETE" ]; then 535241149Sdteske f_sysrc_delete "$NAME" 536241149Sdteske shift 1 537241149Sdteske continue 538241149Sdteske fi 539241149Sdteske 540241149Sdteske # 541241149Sdteske # If `-N' is passed, simplify the output 542241149Sdteske # 543241149Sdteske if [ ! "$SHOW_VALUE" ]; then 544241149Sdteske echo "$NAME" 545241149Sdteske f_sysrc_set "$NAME" "${1#*}" 546241149Sdteske else 547241149Sdteske if [ "$SHOW_FILE" ]; then 548241149Sdteske before=$( f_sysrc_find "$NAME" ) 549241149Sdteske else 550241149Sdteske before=$( f_sysrc_get "$NAME" ) 551241149Sdteske fi 552241149Sdteske if f_sysrc_set "$NAME" "${1#*=}"; then 553241149Sdteske if [ "$SHOW_FILE" ]; then 554241149Sdteske after=$( f_sysrc_find "$NAME" ) 555241149Sdteske echo -n "${SHOW_NAME:+$NAME$SEP}" 556241149Sdteske echo -n "$before${SHOW_EQUALS:+\"}" 557241149Sdteske echo " -> $after" 558241149Sdteske else 559241149Sdteske after=$( f_sysrc_get "$NAME" ) 560241149Sdteske echo -n "${SHOW_NAME:+$NAME$SEP}" 561241149Sdteske echo "$before -> $after" 562241149Sdteske fi 563241149Sdteske fi 564241149Sdteske fi 565241149Sdteske ;; 566241149Sdteske *) 567241149Sdteske if ! IGNORED="$( f_sysrc_get "$NAME?" )"; then 568241149Sdteske [ "$IGNORE_UNKNOWNS" ] \ 569241149Sdteske || echo "$pgm: unknown variable '$NAME'" 570241149Sdteske shift 1 571241149Sdteske continue 572241149Sdteske fi 573241149Sdteske 574241149Sdteske # 575241149Sdteske # Like sysctl(8), when `-d' is passed, 576241149Sdteske # desribe it rather than expanding it 577241149Sdteske # 578241149Sdteske 579241149Sdteske if [ "$DESCRIBE" ]; then 580241149Sdteske shift 1 581241149Sdteske continue 582241149Sdteske fi 583241149Sdteske 584241149Sdteske # 585241149Sdteske # If `-x' or `-X' is passed, delete the variable 586241149Sdteske # 587241149Sdteske if [ "$DELETE" ]; then 588241149Sdteske f_sysrc_delete "$NAME" 589241149Sdteske shift 1 590241149Sdteske continue 591241149Sdteske fi 592241149Sdteske 593241149Sdteske # 594241149Sdteske # If `-F' is passed, find it and move on 595241149Sdteske # 596241149Sdteske if [ "$SHOW_FILE" ]; then 597241149Sdteske [ "$SHOW_NAME" ] && echo -n "$NAME: " 598241149Sdteske f_sysrc_find "$NAME" 599241149Sdteske shift 1 600241149Sdteske continue 601241149Sdteske fi 602241149Sdteske 603241149Sdteske [ "$SYSRC_VERBOSE" ] && \ 604241149Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 605241149Sdteske 606241149Sdteske # 607241149Sdteske # If `-N' is passed, simplify the output 608241149Sdteske # 609241149Sdteske if [ ! "$SHOW_VALUE" ]; then 610241149Sdteske echo "$NAME" 611241149Sdteske else 612241149Sdteske echo "${SHOW_NAME:+$NAME$SEP}$( 613241149Sdteske f_sysrc_get "$NAME" )${SHOW_EQUALS:+\"}" 614241149Sdteske fi 615241149Sdteske esac 616241149Sdteske shift 1 617241149Sdteskedone 618