summaryrefslogtreecommitdiff
path: root/Assistant/Threads/PairListener.hs
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 /Assistant/Threads/PairListener.hs
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..
Diffstat (limited to 'Assistant/Threads/PairListener.hs')
-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