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 # # Loop until the user provides taint-free input. # local msg="$( printf "$msg_please_enter_subnet_mask" "$interface" )" while :; do # # Return error status if: # - User has either pressed ESC or chosen Cancel/No # - User has not made any changes to the given value # _input=$( f_dialog_input "$msg" "$_netmask" \ "$hline_num_punc_tab_enter" ) || return [ "$_netmask" = "$_input" ] && return $FAILURE # 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