From 52531f4eb639f4307a7963cc2ce4a432b7e6ee55 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 19 Sep 2010 15:13:06 +0000 Subject: [PATCH] base-files: kill possibly existing udhcpc instance when bringing up a dhcp iface, utilize service_kill() in dhcp shutdown. Based on patch by Stijn Tintel. Possibly related to #7314 SVN-Revision: 23092 --- .../base-files/files/lib/network/config.sh | 65 ++++++++----------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/package/base-files/files/lib/network/config.sh b/package/base-files/files/lib/network/config.sh index a5bc9ac6f2..c948c83a85 100755 --- a/package/base-files/files/lib/network/config.sh +++ b/package/base-files/files/lib/network/config.sh @@ -340,40 +340,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" @@ -401,12 +393,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" }