busybox: fix udhcpc with multiple ports on slugos in 1.01
authorJohn Bowler <jbowler@nslu2-linux.org>
Fri, 3 Feb 2006 02:28:21 +0000 (02:28 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Fri, 3 Feb 2006 02:28:21 +0000 (02:28 +0000)
 - a new 'simple.script' patch ensures that resolve.conf is
   maintained correctly when multiple ethernet ports are present
   in the system, fixes slug bug 347

packages/busybox/busybox-1.01/slugos/udhcpscript.patch
packages/busybox/busybox_1.01.bb

index 2f58632..277a22c 100644 (file)
@@ -1,30 +1,41 @@
---- busybox-1.00/.pc/udhcpscript.patch/examples/udhcp/simple.script    2004-10-13 00:18:05.000000000 -0700
-+++ busybox-1.00/examples/udhcp/simple.script  2005-06-05 15:08:28.432605118 -0700
-@@ -1,40 +1,101 @@
+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
-+# this must set the HW address (MAC) on the interface
 +#
 +. /etc/default/functions
--# udhcpc script edited by Tim Riker <Tim@Rikers.org>
--[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
++
 +echodns(){
 +      local dns
 +      if test $# -gt 0
 +      then
 +              for dns in "$@"
 +              do
-+                      echo "nameserver $dns"
++                      echo "nameserver $dns #dhcp:$interface"
 +              done
 +      fi
 +}
-+
-+# Output the correct contents for resolv.conf
+-# udhcpc script edited by Tim Riker <Tim@Rikers.org>
++# Output the correct contents for resolv.conf based on
++# the current one and any new information
 +mkresolv() {
-+      test -n "$domain" && echo "search $domain"
++      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 -)
 +      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
++      local B N metric i olddomain resolv
 +      B=
 +      test -n "$broadcast" && B="broadcast $broadcast"
 +      N=
 +      # between each (this is somewhat arbitrary)
 +      if test -n "$router"
 +      then
-+              while route del default gw 0.0.0.0 dev $interface 2>/dev/null
-+              do
-+                      :
-+              done
--RESOLV_CONF="/etc/resolv.conf"
--[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
--[ -n "$subnet" ] && NETMASK="netmask $subnet"
++              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"
 +              # and update the kernel view too
 +              echo "$domain" >/proc/sys/kernel/domainname
 +      fi
-+
-+      # Update /etc/resolv.conf to reflect domain and dns information,
-+      # this always clears resolv.conf if none is given
-+      md5old="$(md5strm /etc/resolv.conf)"
-+      md5new="$(mkresolv | md5strm -)"
-+      test "$md5old" != "$md5new" && mkresolv >/etc/resolv.conf
+-RESOLV_CONF="/etc/resolv.conf"
+-[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
+-[ -n "$subnet" ] && NETMASK="netmask $subnet"
++      updresolv
 +}
  
  case "$1" in
 -                      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)
index 859f4ae..4b6101b 100644 (file)
@@ -10,7 +10,7 @@ HOMEPAGE = "http://www.busybox.net"
 LICENSE = "GPL"
 SECTION = "base"
 PRIORITY = "required"
-PR = "r5"
+PR = "r6"
 
 SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \
           file://udhcppidfile.patch;patch=1 \