summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsdconfig/networking/share/netmask.subr
diff options
context:
space:
mode:
authordteske <dteske@FreeBSD.org>2012-09-18 22:28:42 +0000
committerdteske <dteske@FreeBSD.org>2012-09-18 22:28:42 +0000
commit282d6b7f2c0f1fb51d911f75ef9989f62e389985 (patch)
tree3ef909c692976c6a6b0854f8d722182e78ff8915 /usr.sbin/bsdconfig/networking/share/netmask.subr
parent969b25f00f504248a5c234274661472d753475ad (diff)
downloadFreeBSD-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.subr215
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
OpenPOWER on IntegriCloud