summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-10-10 16:48:06 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-10-10 16:48:06 -0400
commit92ee44f4f8cac9b58e04d3b701c59274a839472e (patch)
treef274136e7bf46d60c2a3e7dc20ae601794f40d17
parent4d484681630200671c389ece0549ea3185ed2d0d (diff)
avoid pairlistener crash
I noticed this while offline (so that lack of solar power is good for something). Apparently it tries to bind multicast to lo, and that fails. If this happens, catch it, and retry until a real network interface becomes available. It may be that this should tie into the NetWatcher, and rebind whenever an interface comes up. Needs testing..
-rw-r--r--Assistant/Threads/PairListener.hs12
1 files changed, 9 insertions, 3 deletions
diff --git a/Assistant/Threads/PairListener.hs b/Assistant/Threads/PairListener.hs
index 9ce369032..9875dcb8a 100644
--- a/Assistant/Threads/PairListener.hs
+++ b/Assistant/Threads/PairListener.hs
@@ -17,6 +17,7 @@ import Assistant.DaemonStatus
import Assistant.WebApp
import Assistant.WebApp.Types
import Assistant.Alert
+import Utility.ThreadScheduler
import Network.Multicast
import Network.Socket
@@ -27,12 +28,17 @@ thisThread :: ThreadName
thisThread = "PairListener"
pairListenerThread :: ThreadState -> DaemonStatusHandle -> ScanRemoteMap -> UrlRenderer -> NamedThread
-pairListenerThread st dstatus scanremotes urlrenderer = thread $ withSocketsDo $ do
- sock <- multicastReceiver (multicastAddress $ IPv4Addr undefined) pairingPort
- go sock [] []
+pairListenerThread st dstatus scanremotes urlrenderer = thread $ withSocketsDo $
+ runEvery (Seconds 1) $ void $ tryIO $ do
+ sock <- getsock
+ go sock [] []
where
thread = NamedThread thisThread
+ {- Note this can crash if there's no network interface,
+ - or only one like lo that doesn't support multicast. -}
+ getsock = multicastReceiver (multicastAddress $ IPv4Addr undefined) pairingPort
+
go sock reqs cache = getmsg sock [] >>= \msg -> case readish msg of
Nothing -> go sock reqs cache
Just m -> do