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