From 27b2f93fe5c9d558c0745b7896a56c1117e891c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Thu, 19 Mar 2026 20:10:02 +0100 Subject: Fix bracket usage for server socket --- src/Erebos/Network.hs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) (limited to 'src/Erebos') diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index 7c8c1e1..dfcb88f 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -294,22 +294,7 @@ startServer serverOptions serverOrigHead logd' serverServices = do either (atomically . logd . showErebosError) return =<< runExceptT =<< atomically (readTQueue serverIOActions) - let open addr = do - sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) - putMVar serverSocket sock - setSocketOption sock Broadcast 1 - withFdSocket sock setCloseOnExecIfNeeded - bind sock (addrAddress addr) `catchIOError` \e -> if - | isAlreadyInUseError e && serverRetryUnspecifiedPort serverOptions - , SockAddrInet6 _ f h s <- addrAddress addr - -> do atomically $ logd $ if serverPort serverOptions == discoveryPort - then "Failed to bind default discovery port, will not receive discovery packets on local network." - else "Failed to bind port " <> show (serverPort serverOptions) <> ", retrying with ephemeral one." - bind sock (SockAddrInet6 0 f h s) - | otherwise -> ioError e - return sock - - loop sock = do + let loop sock = do when (serverLocalDiscovery serverOptions) $ forkServerThread server "discovery" $ do announceAddreses <- fmap concat $ sequence $ [ map (SockAddrInet6 discoveryPort 0 discoveryMulticastGroup) <$> joinMulticast sock @@ -433,7 +418,20 @@ startServer serverOptions serverOrigHead logd' serverServices = do , addrSocketType = Datagram } addr:_ <- getAddrInfo (Just hints) Nothing (Just $ show $ serverPort serverOptions) - bracket (open addr) close loop + let open = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) + bracket open close $ \sock -> do + withFdSocket sock setCloseOnExecIfNeeded + setSocketOption sock Broadcast 1 + bind sock (addrAddress addr) `catchIOError` \e -> if + | isAlreadyInUseError e && serverRetryUnspecifiedPort serverOptions + , SockAddrInet6 _ f h s <- addrAddress addr + -> do atomically $ logd $ if serverPort serverOptions == discoveryPort + then "Failed to bind default discovery port, will not receive discovery packets on local network." + else "Failed to bind port " <> show (serverPort serverOptions) <> ", retrying with ephemeral one." + bind sock (SockAddrInet6 0 f h s) + | otherwise -> ioError e + putMVar serverSocket sock + loop sock forkServerThread server "service-handler" $ forever $ do ( peer, paddr, svc, ref, streams ) <- atomically $ readTQueue chanSvc -- cgit v1.2.3