alfred: not only wait for the interface, but also a link-local address
This commit is contained in:
parent
0f928b08d5
commit
d432a0a214
@ -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
|
Loading…
Reference in New Issue
Block a user