[package] ppp:
[openwrt/svn-archive/archive.git] / package / ppp / files / ppp.sh
index c6440025be237fcbcf5865f5f82c57a313225e40..42daef92201527d832570bf9d83610a02d16cac9 100644 (file)
@@ -1,63 +1,41 @@
-scan_ppp() {
-       config_get ifname "$1" ifname
-       pppdev="${pppdev:-0}"
-       config_get devunit "$1" unit
-       {
-               unit=
-               pppif=
-               if [ ! -d /tmp/.ppp-counter ]; then
-                    mkdir -p /tmp/.ppp-counter
-               fi
-               local maxunit
-               maxunit="$(cat /tmp/.ppp-counter/max-unit 2>/dev/null)" 
-               if [ -z "$maxunit" ]; then
-                   maxunit=-1
-               fi
-               local i
-               i=0
-               while [ $i -le $maxunit ]; do
-                    local unitdev
-                    unitdev="$(cat /tmp/.ppp-counter/ppp${i} 2>/dev/null)"
-                    if [ "$unitdev" = "$1" ]; then
-                         unit="$i"
-                         pppif="ppp${i}"
-                         break
-                    fi
-                    i="$(($i + 1))"
-               done 
-               if [ -z "$unit" ] || [ -z "$pppif" ]; then
-                   maxunit="$(($maxunit + 1))"
-                   if [ -n "$devunit" ]; then
-                       unit="$devunit"
-                   elif [ "${ifname%%[0-9]*}" = ppp ]; then
-                        unit="${ifname##ppp}"
-                   else
-                        unit="$maxunit"
-                   fi 
-                   [ "$maxunit" -lt "$unit" ] && maxunit="$unit"
-                   pppif="ppp${unit}"
-                   echo "$1" >/tmp/.ppp-counter/$pppif 2>/dev/null
-                   echo "$maxunit" >/tmp/.ppp-counter/max-unit 2>/dev/null
-               fi
-               config_set "$1" ifname "ppp$unit"
-               config_set "$1" unit "$unit"
+stop_interface_ppp() {
+       local cfg="$1"
+
+       local proto
+       config_get proto "$cfg" proto
+
+       local ifname
+       config_get ifname "$cfg" ifname
+
+       local link="$proto-${ifname#$proto-}"
+       [ -f "/var/run/ppp-${link}.pid" ] && {
+               local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)"
+               local try=0
+               grep -qs pppd "/proc/$pid/cmdline" && kill -TERM $pid && \
+                       while grep -qs pppd "/proc/$pid/cmdline" && [ $((try++)) -lt 5 ]; do sleep 1; done
+               grep -qs pppd "/proc/$pid/cmdline" && kill -KILL $pid && \
+                       while grep -qs pppd "/proc/$pid/cmdline"; do sleep 1; done
+               rm -f "/var/run/ppp-${link}.pid"
        }
+
+       local lock="/var/lock/ppp-$link"
+       [ -f "$lock" ] && lock -u "$lock"
 }
 
 start_pppd() {
        local cfg="$1"; shift
-       local ifname
 
-       # make sure the network state references the correct ifname
-       scan_ppp "$cfg"
-       config_get ifname "$cfg" ifname
-       set_interface_ifname "$cfg" "$ifname"
+       local proto
+       config_get proto "$cfg" proto
+
+       # unique link identifier
+       local link="${proto:-ppp}-$cfg"
 
        # make sure only one pppd process is started
-       lock "/var/lock/ppp-${cfg}"
-       local pid="$(head -n1 /var/run/ppp-${cfg}.pid 2>/dev/null)"
+       lock "/var/lock/ppp-${link}"
+       local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)"
        [ -d "/proc/$pid" ] && grep pppd "/proc/$pid/cmdline" 2>/dev/null >/dev/null && {
-               lock -u "/var/lock/ppp-${cfg}"
+               lock -u "/var/lock/ppp-${link}"
                return 0
        }
 
@@ -68,9 +46,6 @@ start_pppd() {
        local device
        config_get device "$cfg" device
 
-       local unit
-       config_get unit "$cfg" unit
-
        local username
        config_get username "$cfg" username
 
@@ -91,7 +66,8 @@ start_pppd() {
 
        local defaultroute
        config_get_bool defaultroute "$cfg" defaultroute 1
-       [ "$defaultroute" -eq 1 ] && defaultroute="defaultroute replacedefaultroute" || defaultroute=""
+       [ "$defaultroute" -eq 1 ] && \
+               defaultroute="defaultroute replacedefaultroute" || defaultroute="nodefaultroute"
 
        local interval="${keepalive##*[, ]}"
        [ "$interval" != "$keepalive" ] || interval=5
@@ -109,7 +85,9 @@ start_pppd() {
        local peerdns
        config_get_bool peerdns "$cfg" peerdns $peer_default
 
-       echo -n "" > /tmp/resolv.conf.auto
+       if [ "$peerdns" -eq 1 ] || [ ! -e /tmp/resolv.conf.auto ]; then
+               echo -n "" > /tmp/resolv.conf.auto
+       fi
 
        [ "$peerdns" -eq 1 ] && {
                peerdns="usepeerdns"
@@ -136,21 +114,21 @@ start_pppd() {
        config_get_bool ipv6 "$cfg" ipv6 0
        [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6=""
 
-       /usr/sbin/pppd "$@" \
+       start-stop-daemon -S -b -x /usr/sbin/pppd -m -p /var/run/ppp-$link.pid -- "$@" \
                ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}} \
                $demandargs \
                $peerdns \
                $defaultroute \
                ${username:+user "$username" password "$password"} \
-               unit "$unit" \
-               linkname "$cfg" \
                ipparam "$cfg" \
+               ifname "$link" \
                ${connect:+connect "$connect"} \
                ${disconnect:+disconnect "$disconnect"} \
                ${ipv6} \
-               ${pppd_options}
+               ${pppd_options} \
+               nodetach
 
-       lock -u "/var/lock/ppp-${cfg}"
+       lock -u "/var/lock/ppp-${link}"
 }
 
 setup_interface_ppp() {