diff options
author | dteske <dteske@FreeBSD.org> | 2012-09-18 22:28:42 +0000 |
---|---|---|
committer | dteske <dteske@FreeBSD.org> | 2012-09-18 22:28:42 +0000 |
commit | 282d6b7f2c0f1fb51d911f75ef9989f62e389985 (patch) | |
tree | 3ef909c692976c6a6b0854f8d722182e78ff8915 /usr.sbin/bsdconfig/networking/share/netmask.subr | |
parent | 969b25f00f504248a5c234274661472d753475ad (diff) | |
download | FreeBSD-src-282d6b7f2c0f1fb51d911f75ef9989f62e389985.zip FreeBSD-src-282d6b7f2c0f1fb51d911f75ef9989f62e389985.tar.gz |
Move major includes into /usr/share/bsdconfig for easy external access.
Reviewed by: adrian (co-mentor)
Approved by: adrian (co-mentor)
Diffstat (limited to 'usr.sbin/bsdconfig/networking/share/netmask.subr')
-rw-r--r-- | usr.sbin/bsdconfig/networking/share/netmask.subr | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/usr.sbin/bsdconfig/networking/share/netmask.subr b/usr.sbin/bsdconfig/networking/share/netmask.subr new file mode 100644 index 0000000..4fa5be3 --- /dev/null +++ b/usr.sbin/bsdconfig/networking/share/netmask.subr @@ -0,0 +1,215 @@ +if [ ! "$_NETWORKING_NETMASK_SUBR" ]; then _NETWORKING_NETMASK_SUBR=1 +# +# Copyright (c) 2006-2012 Devin Teske +# All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# +############################################################ INCLUDES + +BSDCFG_SHARE="/usr/share/bsdconfig" +. $BSDCFG_SHARE/common.subr || exit 1 +f_include $BSDCFG_SHARE/dialog.subr +f_include $BSDCFG_SHARE/strings.subr +f_include $BSDCFG_SHARE/networking/common.subr + +BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="120.networking" +f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr + +############################################################ FUNCTIONS + +# f_ifconfig_netmask $interface +# +# Returns the IPv4 subnet mask associated with $interface. +# +f_ifconfig_netmask() +{ + local interface="$1" octets + octets=$( ifconfig "$interface" 2> /dev/null | awk \ + ' + BEGIN { found = 0 } + ( $1 == "inet" ) \ + { + printf "%s %s %s %s\n", + substr($4,3,2), + substr($4,5,2), + substr($4,7,2), + substr($4,9,2) + found = 1 + exit + } + END { exit ! found } + ' ) || return $FAILURE + + local octet netmask= + for octet in $octets; do + netmask="$netmask${netmask:+.}$( printf "%u" "0x$octet" )" + done + echo $netmask +} + +# f_dialog_validate_netmask $netmask +# +# Returns zero if the given argument (a subnet mask) is of the proper format. +# +# The return status for invalid IP address is one of: +# 1 One or more individual fields within the subnet mask (separated +# by dots) contains one or more invalid characters. +# 2 One or more individual fields within the subnet mask are null +# and/or missing. +# 3 One or more individual fields within the subnet mask exceeds +# the maximum of 255 (a full 8-bit register). +# 4 The subnet mask has either too few or too many fields. +# 5 One or more individual fields within the subnet mask is an +# invalid integer (only 0,128,192,224,240,248,252,254,255 are +# valid integers). +# +# If the subnet mask is determined to be invalid, the appropriate error will be +# displayed using the f_dialog_msgbox function. +# +f_dialog_validate_netmask() +{ + local mask="$1" + + ( # Operate within a sub-shell to protect the parent environment + + # Track number of fields for error checking + nfields=0 + + IFS="." # Split on `dot' + for field in $mask; do + + # Return error if the field is null + [ "$field" ] || exit 2 + + # Return error if not a whole positive integer + f_isinteger "$field" || exit 1 + + # Return error if the field exceeds 255 + [ $field -gt 255 ] && exit 3 + + # Return error if the field is an invalid integer + case "$field" in + 0|128|192|224|240|248|252|254|255) :;; + *) exit 5;; + esac + + nfields=$(( $nfields + 1 )) + + done + + [ $nfields -eq 4 ] || exit 4 + ) + + # + # Produce an appropriate error message if necessary. + # + local retval=$? + case $retval in + 1) f_dialog_msgbox "$( printf \ + "$msg_ipv4_mask_field_contains_invalid_chars" "$mask" )";; + 2) f_dialog_msgbox "$( printf \ + "$msg_ipv4_mask_field_is_null" "$mask" )";; + 3) f_dialog_msgbox "$( printf \ + "$msg_ipv4_mask_field_exceeds_max_value" "$mask" )";; + 4) f_dialog_msgbox "$( printf \ + "$msg_ipv4_mask_field_missing_or_extra" "$mask" )";; + 5) f_dialog_msgbox "$( printf \ + "$msg_ipv4_mask_field_invalid_value" "$mask" )";; + esac + + return $retval +} + +# f_dialog_input_netmask $interface $netmask +# +# Edits the IP netmask of the given interface. +# +f_dialog_input_netmask() +{ + local interface="$1" _netmask="$2" _input + + # + # Return with-error when there are NFS-mounts currently active. If the + # subnet mask is changed while NFS-exported directories are mounted, + # the system may hang (if any NFS mounts are using that interface). + # + if f_nfs_mounted && ! f_jailed; then + local setting="$( printf "$msg_current_subnet" \ + "$interface" "$_netmask" )" + local message="$( printf "$msg_nfs_mounts_may_cause_hang" \ + "$setting" )" + f_dialog_msgbox "$message" + return $FAILURE + fi + + local msg="$( printf "$msg_please_enter_subnet_mask" "$interface" )" + local hline="$hline_num_punc_tab_enter" + local size="$( f_dialog_inputbox_size \ + "$DIALOG_TITLE" \ + "$DIALOG_BACKTITLE" \ + "$msg" \ + "$_netmask" \ + "$hline" )" + + # + # Loop until the user provides taint-free input. + # + while :; do + eval $DIALOG \ + --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --hline \"\$hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --inputbox \"\$msg\" $size \ + \"\$_netmask\" \ + 2> "$DIALOG_TMPDIR/dialog.inputbox.$$" + + local retval=$? + _input=$( f_dialog_inputstr ) + + # + # Return error status if: + # - User has not made any changes to the given value + # - User has either pressed ESC or chosen Cancel/No + # + [ "$_netmask" = "$_input" ] && return $FAILURE + [ $retval -eq $SUCCESS ] || return $retval + + # Return success if NULL value was entered + [ "$_input" ] || return $SUCCESS + + # Take only the first "word" of the user's input + _netmask="$_input" + _netmask="${_netmask%%[$IFS]*}" + + # Taint-check the user's input + f_dialog_validate_netmask "$_netmask" && break + done + + netmask="$_netmask" +} + +fi # ! $_NETWORKING_NETMASK_SUBR |