From 7be42a71e1c3cb29890e9ff3bf5286575361e8b6 Mon Sep 17 00:00:00 2001
From: Jo-Philipp Wich <jow@openwrt.org>
Date: Sun, 8 Feb 2015 22:20:38 +0000
Subject: [PATCH] 6in4: fix update timeout

The recent rework of the 6in4 endpoint update broke the retry mechanism.
Rework the timeout handling and make the update status more verbose.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>

SVN-Revision: 44327
---
 package/network/ipv6/6in4/Makefile      |  2 +-
 package/network/ipv6/6in4/files/6in4.sh | 34 ++++++++++++++++++++-----
 2 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/package/network/ipv6/6in4/Makefile b/package/network/ipv6/6in4/Makefile
index 0dc1068b3f..ef9691227a 100644
--- a/package/network/ipv6/6in4/Makefile
+++ b/package/network/ipv6/6in4/Makefile
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=6in4
-PKG_VERSION:=19
+PKG_VERSION:=20
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0
 
diff --git a/package/network/ipv6/6in4/files/6in4.sh b/package/network/ipv6/6in4/files/6in4.sh
index 00b6e3550d..f8a43ce24b 100755
--- a/package/network/ipv6/6in4/files/6in4.sh
+++ b/package/network/ipv6/6in4/files/6in4.sh
@@ -9,6 +9,19 @@
 	init_proto "$@"
 }
 
+proto_6in4_update() {
+	sh -c '
+		local timeout=5
+
+		(while [ $((timeout--)) -gt 0 ]; do
+			sleep 1
+			kill -0 $$ || exit 0
+		done; kill -9 $$) 2>/dev/null &
+
+		exec "$@"
+	' "$1" "$@"
+}
+
 proto_6in4_setup() {
 	local cfg="$1"
 	local iface="$2"
@@ -97,13 +110,20 @@ proto_6in4_setup() {
 		local try=0
 		local max=3
 
-		while [ $((++try)) -le $max ]; do
-			( exec $urlget $urlget_opts "$url" | logger -t "$link" ) &
-			local pid=$!
-			( sleep 20; kill $pid 2>/dev/null ) &
-			wait $pid && break
-			sleep 20;
-		done
+		(
+			set -o pipefail
+			while [ $((++try)) -le $max ]; do
+				if proto_6in4_update $urlget $urlget_opts "$url" 2>&1 | \
+					sed -e 's,^Killed$,timeout,' -e "s,^,update $try/$max: ," | \
+					logger -t "$link";
+				then
+					logger -t "$link" "updated"
+					return 0
+				fi
+				sleep 5
+			done
+			logger -t "$link" "update failed"
+		)
 	}
 }
 
-- 
GitLab