diff -rup busybox-1.01/.pc/udhcpscript.patch/examples/udhcp/simple.script busybox-1.01/examples/udhcp/simple.script --- busybox-1.01/examples/udhcp/simple.script 1970-01-01 00:00:00.000000000 +0000 +++ busybox-1.01/examples/udhcp/simple.script 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +1,129 @@ #!/bin/sh +# slugos UDHCP client script +# +. /etc/default/functions + +echodns(){ + local dns + if test $# -gt 0 + then + for dns in "$@" + do + echo "nameserver $dns #dhcp:$interface" + done + fi +} -# udhcpc script edited by Tim Riker +# Output the correct contents for resolv.conf based on +# the current one and any new information +mkresolv() { + local rmdomain + rmdomain= + # last search takes precedence, so a user + # specified search in resolv.conf is retained + test -n "$domain" && { + echo "search $domain #dhcp" + rmdomain='|search [^ ]* #dhcp' + } + # first nameserver takes precedence, use a user + # specified nameserver in preference then the + # new ones + egrep -v '^(nameserver [^ ]* #dhcp:.*'"$rmdomain"')$' "$1" + echodns $dns + egrep '^nameserver [^ ]* #dhcp:.*$' "$1" | egrep -v :"$interface"'$' +} + +# checksum of a file (or stdin if -) +md5strm() { + md5sum $1 2>/dev/null | sed -n 's/^\([0-9A-Za-z]*\).*$/\1/p' +} + +# update resolv.conf for $interface using $domain and $dns +updresolv() { + local md5old md5new resolv + md5old="$(md5strm /etc/resolv.conf)" + resolv="$(mkresolv /etc/resolv.conf)" + md5new="$(echo "$resolv" | md5strm -)" + test "$md5old" != "$md5new" && echo "$resolv" >/etc/resolv.conf +} + +unroute() { + # called to deconfig the interface + while route del default gw 0.0.0.0 dev $interface 2>/dev/null + do + : + done +} + +bind() { + local B N metric i olddomain resolv + B= + test -n "$broadcast" && B="broadcast $broadcast" + N= + test -n "$subnet" && N="netmask $subnet" + ifconfig "$interface" "$ip" $B $N up + + # If given router information delete the old information and + # enter new stuff, routers get metrics incremented by 1 + # between each (this is somewhat arbitrary) + if test -n "$router" + then + unroute + metric=0 + for i in $router + do + route add default gw "$i" dev "$interface" metric $((metric++)) + done + fi -[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 + olddomain= + test -r /etc/defaultdomain && olddomain="$(cat /etc/defaultdomain)" + if test -n "$domain" -a "$domain" != "$olddomain" + then + echo "$domain" >/etc/defaultdomain + # and update the kernel view too + echo "$domain" >/proc/sys/kernel/domainname + fi -RESOLV_CONF="/etc/resolv.conf" -[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" -[ -n "$subnet" ] && NETMASK="netmask $subnet" + updresolv +} case "$1" in - deconfig) - /sbin/ifconfig $interface 0.0.0.0 - ;; - - renew|bound) - /sbin/ifconfig $interface $ip $BROADCAST $NETMASK - - if [ -n "$router" ] ; then - echo "deleting routers" - while route del default gw 0.0.0.0 dev $interface ; do - : - done - - metric=0 - for i in $router ; do - route add default gw $i dev $interface metric $((metric++)) - done +deconfig) + # Bring the interface up (without inet at this point) + # Remove the resolver information because deconfig is called + # on leasefail and we need to remove this interface at that + # point to ensure the machine remains visible on another + # interface! + domain= + dns= + unroute + updresolv + ifconfig "$interface" up;; + +renew|bound) + bind;; + +leasefail) + # Pull the values from the config data if (only only if) this + # is the config interface + if test "$interface" = "$(config iface)" + then + ip="$(config ip)" + if test -n "$ip" + then + router="$(config gateway)" + subnet="$(config netmask)" + broadcast="$(config broadcast)" + domain="$(config domain)" + dns="$(config dns)" + + bind fi + fi;; - echo -n > $RESOLV_CONF - [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF - for i in $dns ; do - echo adding dns $i - echo nameserver $i >> $RESOLV_CONF - done - ;; +*) echo "udhcpc: $*: unknown command" >&2 + exit 1;; esac exit 0