From d432a0a2143c660a4588a8efc0dacbbb34c12585 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sun, 9 Aug 2015 18:13:45 +0200
Subject: [PATCH] alfred: not only wait for the interface, but also a
 link-local address

---
 ...erface-but-also-a-link-local-address.patch | 62 +++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 patches/packages/routing/0004-alfred-not-only-wait-for-the-interface-but-also-a-link-local-address.patch

diff --git a/patches/packages/routing/0004-alfred-not-only-wait-for-the-interface-but-also-a-link-local-address.patch b/patches/packages/routing/0004-alfred-not-only-wait-for-the-interface-but-also-a-link-local-address.patch
new file mode 100644
index 000000000..e6873c7ba
--- /dev/null
+++ b/patches/packages/routing/0004-alfred-not-only-wait-for-the-interface-but-also-a-link-local-address.patch
@@ -0,0 +1,62 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 9 Aug 2015 18:03:28 +0200
+Subject: alfred: not only wait for the interface, but also a link-local address
+
+Changes between alfred 2015.0 and 2015.1 cause alfred to print an error
+and exit when the interface to bind to is not completely set up (has no
+non-tentative link-local address). As a workaround, wait for such an
+address by reading /proc/net/if_inet6 before alfred is started.
+
+In the long term, it would be nice to make alfred more robust against
+missing interfaces (allowing alfred to start without the interface
+existing, and keeping it working even when the interface is removed and
+re-added while alfred is running).
+
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
+
+diff --git a/alfred/files/alfred.init b/alfred/files/alfred.init
+index 5ce06c0..8e1f11d 100755
+--- a/alfred/files/alfred.init
++++ b/alfred/files/alfred.init
+@@ -37,6 +37,32 @@ wait_for_dir()
+ 	fi
+ }
+ 
++wait_for_ll_address()
++{
++	local iface="$1"
++	local timeout
++
++	timeout=30
++	echo "${initscript}: waiting $timeout secs for $iface address..."
++	for i in $(seq $timeout); do
++		# We look for
++		# - the link-local address (starts with fe80)
++		# - without tentative flag (bit 0x40 in the flags field; the first char of the flags field begins 38 columns after the fe80 prefix
++		# - on interface $iface
++		if awk '
++			BEGIN { RET=1 }
++			/^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
++			END { exit RET }
++		' /proc/net/if_inet6; then
++			return
++		fi
++		sleep 1
++	done
++
++	echo "${initscript}: $iface address not detected, alfred not starting."
++	exit 1
++}
++
+ alfred_start()
+ {
+ 	local args=""
+@@ -62,7 +88,7 @@ alfred_start()
+ 		wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
+ 	fi
+ 
+-	wait_for_dir "$interface" "/sys/class/net/$interface/"
++	wait_for_ll_address "$interface"
+ 
+ 	append alfred_args "$args"
+ 	enable=1
-- 
GitLab