In order to react properly on incomplete calls like
$ route -h
$ route -n
two cases of protection on 'shift' are needed:
-shift
+test $# -gt 0 && shift
Without these Dash aborts with an error.
Best regards,
Mats Erik Andersson, DM
#!/bin/sh
#
# /sbin/route
#
# Wrapper script around /lib/freebsd/route
# crafted to catch the routing commands issued
# by /sbin/ifup and /sbin/ifdown, translating
# them into valid FreeBSD commands, at the same
# time preserving all BSD native routing input.
#
# Authors: Axel Beckert, Mats Erik Andersson
set -e
if [ $# = 0 ] ; then
# Issue usage info
/lib/freebsd/route
fi
args=""
# Capture all options first. Save them for later.
# One Debian endemic addition: -A family.
# Typically: -A inet6
#
opts=""
af=""
while [ $# -gt 0 ]; do
case "$1" in
-*)
# One Debian addition.
if [ "$1" = "-A" ] ; then
shift
if [ -n "$1" ] ; then
af="-$1"
shift
continue
fi
# Incorrect usage, call for help
/lib/freebsd/route
fi
# A native option remains
opts="${opts} $1"
shift
;;
*)
# Must be the beginning of a command mode line.
break ;;
esac
done
cmd="$1"
test $# -gt 0 && shift
# Commands originating from ifupdown can only be
# stated either for "add" or for "del".
#
# The commands from "ifupdown" are acceptable
# as long as they do not contain the keyword "gw".
# In case the command does so, then the very last
# command line argument is the name of the interface.
# We ignore it for now, since an interface specification
# do not carry the same connotation in FreeBSD as it
# does in GNU/Linux.
#
# The keyword "metric" seems unknown for FreeBSD,
# so it is filtered off.
if [ "$cmd" = "add" -o "$cmd" = "del" ] ; then
# Our simple state machine
HAVE_SEEN_GW=""
while [ $# -gt 0 ]; do
if [ -n "$HAVE_SEEN_GW" ] ; then
if [ $# -eq 1 ] ; then
# We have reached the end. An interface name
# appears as last argument, since we are in
# a state caused by a call from ifupdown.
# We simply discard the interface name.
break
fi
if [ "$1" = "metric" ] ; then
# Ignored, together with its argument
shift
else
args="${args} $1"
fi
else
# Ifup and ifdown use "gw" only in two forms.
if [ "$1" = "gw" -a \( $# -eq 3 -o \( $# -eq 5 -a "$3" = "metric" \) \) ]
then
# Change state and discard "gw",
# hoping that no administrator ever
# names a host or a network as "gw".
HAVE_SEEN_GW="YES"
else
# This ingredient is important. Add it.
args="${args} $1"
fi
fi
test $# -gt 0 && shift
done
else
# Must have a native command, whatever the content.
args="$@"
fi
exec /lib/freebsd/route ${opts} ${cmd} ${af} ${args}
Attachment:
signature.asc
Description: Digital signature