[backfire] merge r23087, r23091 and r23092
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 19 Sep 2010 15:18:07 +0000 (15:18 +0000)
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 19 Sep 2010 15:18:07 +0000 (15:18 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@23094 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/base-files/Makefile
package/base-files/files/etc/functions.sh
package/base-files/files/lib/network/config.sh
package/base-files/files/usr/share/udhcpc/default.script

index ade72195d354f00796af134c202e6769694c5fad..6c57afda169c201df58c41528d8af839ff8e62ea 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=43.3
+PKG_RELEASE:=43.4
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
index fa0ba0427bea8b5ebd9c0d59907c58722a640515..d58f92ce04005d2a3ab119268e6e4e5c433ba686 100755 (executable)
@@ -274,4 +274,21 @@ uci_apply_defaults() {
        uci commit
 }
 
+service_kill() {
+       local name="${1}"
+       local pid="${2:-$(pidof "$name")}"
+       local grace="${3:-5}"
+
+       [ -f "$pid" ] && pid="$(head -n1 "$pid" 2>/dev/null)"
+
+       for pid in $pid; do
+               [ -d "/proc/$pid" ] || continue
+               local try=0
+               kill -TERM $pid 2>/dev/null && \
+                       while grep -qs "$name" "/proc/$pid/cmdline" && [ $((try++)) -lt $grace ]; do sleep 1; done
+               kill -KILL $pid 2>/dev/null && \
+                       while grep -qs "$name" "/proc/$pid/cmdline"; do sleep 1; done
+       done
+}
+
 [ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh
index 8321b191bf7dd4b0b575bf1524370875ca1980ad..674e7216b92bd6c7e6cf130de4d118191e61aed6 100755 (executable)
@@ -339,40 +339,32 @@ setup_interface() {
                        setup_interface_static "$iface" "$config"
                ;;
                dhcp)
-                       local lockfile="/var/lock/dhcp-$iface"
-                       lock "$lockfile"
-
-                       # prevent udhcpc from starting more than once
+                       # kill running udhcpc instance
                        local pidfile="/var/run/dhcp-${iface}.pid"
-                       local pid="$(cat "$pidfile" 2>/dev/null)"
-                       if [ -d "/proc/$pid" ] && grep -qs udhcpc "/proc/${pid}/cmdline"; then
-                               lock -u "$lockfile"
-                       else
-                               local ipaddr netmask hostname proto1 clientid broadcast
-                               config_get ipaddr "$config" ipaddr
-                               config_get netmask "$config" netmask
-                               config_get hostname "$config" hostname
-                               config_get proto1 "$config" proto
-                               config_get clientid "$config" clientid
-                               config_get_bool broadcast "$config" broadcast 0
-
-                               [ -z "$ipaddr" ] || \
-                                       $DEBUG ifconfig "$iface" "$ipaddr" ${netmask:+netmask "$netmask"}
-
-                               # don't stay running in background if dhcp is not the main proto on the interface (e.g. when using pptp)
-                               local dhcpopts
-                               [ ."$proto1" != ."$proto" ] && dhcpopts="-n -q"
-                               [ "$broadcast" = 1 ] && broadcast="-O broadcast" || broadcast=
-
-                               $DEBUG eval udhcpc -t 0 -i "$iface" \
-                                       ${ipaddr:+-r $ipaddr} \
-                                       ${hostname:+-H $hostname} \
-                                       ${clientid:+-c $clientid} \
-                                       -b -p "$pidfile" $broadcast \
-                                       ${dhcpopts:- -O rootpath -R &}
-
-                               lock -u "$lockfile"
-                       fi
+                       service_kill udhcpc "$pidfile"
+
+                       local ipaddr netmask hostname proto1 clientid broadcast
+                       config_get ipaddr "$config" ipaddr
+                       config_get netmask "$config" netmask
+                       config_get hostname "$config" hostname
+                       config_get proto1 "$config" proto
+                       config_get clientid "$config" clientid
+                       config_get_bool broadcast "$config" broadcast 0
+
+                       [ -z "$ipaddr" ] || \
+                               $DEBUG ifconfig "$iface" "$ipaddr" ${netmask:+netmask "$netmask"}
+
+                       # don't stay running in background if dhcp is not the main proto on the interface (e.g. when using pptp)
+                       local dhcpopts
+                       [ ."$proto1" != ."$proto" ] && dhcpopts="-n -q"
+                       [ "$broadcast" = 1 ] && broadcast="-O broadcast" || broadcast=
+
+                       $DEBUG eval udhcpc -t 0 -i "$iface" \
+                               ${ipaddr:+-r $ipaddr} \
+                               ${hostname:+-H $hostname} \
+                               ${clientid:+-c $clientid} \
+                               -b -p "$pidfile" $broadcast \
+                               ${dhcpopts:- -O rootpath -R &}
                ;;
                none)
                        setup_interface_none "$iface" "$config"
@@ -400,12 +392,7 @@ stop_interface_dhcp() {
        remove_dns "$config"
 
        local pidfile="/var/run/dhcp-${ifname}.pid"
-       local pid="$(cat "$pidfile" 2>/dev/null)"
-       [ -d "/proc/$pid" ] && {
-               grep -qs udhcpc "/proc/$pid/cmdline" && kill -TERM $pid && \
-                       while grep -qs udhcpc "/proc/$pid/cmdline"; do sleep 1; done
-               rm -f "$pidfile"
-       }
+       service_kill udhcpc "$pidfile"
 
        uci -P /var/state revert "network.$config"
 }
index 39527778ad1973cd1206ead85fd8e404bcf2f268..92e3474bddc7878b1935e4a3cba45d62e85593da 100755 (executable)
@@ -21,9 +21,9 @@ setup_interface () {
        local user_router
 
        [ -n "$ifc" ] && {
-               config_get old_ip        "$ifc" ipaddr
-               config_get old_broadcast "$ifc" broadcast
-               config_get old_subnet    "$ifc" netmask
+               old_ip="$(uci_get_state network "$ifc" ipaddr)"
+               old_broadcast="$(uci_get_state network "$ifc" broadcast)"
+               old_subnet="$(uci_get_state network "$ifc" netmask)"
        }
 
        [ "$ip" != "$old_ip" ] \