summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2018-12-01 13:46:39 -0500
committerJoe Crayne <joe@jerkface.net>2018-12-16 14:08:26 -0500
commit04f629c7452d4db3400fc82793317cfec52b4680 (patch)
tree58ec039c2ffb81b34745b45b895b8a9d6d9f9d52 /src
parentda35152c9a0da38f815798c5f6b6b9a0362fd330 (diff)
StreamServer: Support for fall-back bind-addresses.
Diffstat (limited to 'src')
-rw-r--r--src/Data/Tox/Relay.hs2
-rw-r--r--src/Network/StreamServer.hs30
2 files changed, 20 insertions, 12 deletions
diff --git a/src/Data/Tox/Relay.hs b/src/Data/Tox/Relay.hs
index 82fef126..72a05660 100644
--- a/src/Data/Tox/Relay.hs
+++ b/src/Data/Tox/Relay.hs
@@ -48,7 +48,7 @@ data RelayPacket
48 | OnionPacket (OnionRequest N0) 48 | OnionPacket (OnionRequest N0)
49 | OnionPacketResponse (OnionResponse N1) 49 | OnionPacketResponse (OnionResponse N1)
50 -- 0x0A through 0x0F reserved for future use. 50 -- 0x0A through 0x0F reserved for future use.
51 | RelayData ByteString ConId -- Word8 is a connection id. Encoded as number 16 to 255. 51 | RelayData ByteString ConId
52 deriving (Eq,Ord,Show,Data) 52 deriving (Eq,Ord,Show,Data)
53 53
54packetNumber :: RelayPacket -> Word8 54packetNumber :: RelayPacket -> Word8
diff --git a/src/Network/StreamServer.hs b/src/Network/StreamServer.hs
index afa35675..80ed4ee2 100644
--- a/src/Network/StreamServer.hs
+++ b/src/Network/StreamServer.hs
@@ -11,6 +11,7 @@ module Network.StreamServer
11 , withSession 11 , withSession
12 , quitListening 12 , quitListening
13 , dummyServerHandle 13 , dummyServerHandle
14 , listenSocket
14 ) where 15 ) where
15 16
16import Data.Monoid 17import Data.Monoid
@@ -48,6 +49,8 @@ import DebugTag
48 49
49data ServerHandle = ServerHandle Socket (Weak ThreadId) 50data ServerHandle = ServerHandle Socket (Weak ThreadId)
50 51
52listenSocket :: ServerHandle -> RestrictedSocket
53listenSocket (ServerHandle sock _) = restrictSocket sock
51 54
52-- | Create a useless do-nothing 'ServerHandle'. 55-- | Create a useless do-nothing 'ServerHandle'.
53dummyServerHandle :: IO ServerHandle 56dummyServerHandle :: IO ServerHandle
@@ -97,20 +100,25 @@ withSession session = ServerConfig warnStderr session
97-- The returned handle can be used with 'quitListening' to terminate the 100-- The returned handle can be used with 'quitListening' to terminate the
98-- thread and prevent any new sessions from starting. Currently active 101-- thread and prevent any new sessions from starting. Currently active
99-- session threads will not be terminated or signaled in any way. 102-- session threads will not be terminated or signaled in any way.
100streamServer :: ServerConfig -> SockAddr -> IO ServerHandle 103streamServer :: ServerConfig -> [SockAddr] -> IO ServerHandle
101streamServer cfg addr = do 104streamServer cfg addrs = do
102 let warn = serverWarn cfg 105 let warn = serverWarn cfg
103 family = case addr of 106 family = case addrs of
104 SockAddrInet {} -> AF_INET 107 SockAddrInet {}:_ -> AF_INET
105 SockAddrInet6 {} -> AF_INET6 108 SockAddrInet6 {}:_ -> AF_INET6
106 SockAddrUnix {} -> AF_UNIX 109 SockAddrUnix {}:_ -> AF_UNIX
110 [] -> AF_INET6
107 sock <- socket family Stream 0 111 sock <- socket family Stream 0
108 setSocketOption sock ReuseAddr 1 112 setSocketOption sock ReuseAddr 1
109 fix $ \loop -> 113 let tryBind addr next _ = do
110 tryIOError (removeSocketFile addr) >> bind sock addr 114 tryIOError (removeSocketFile addr)
111 `catchIOError` \e -> do warn $ "bind-error: " <> bshow addr <> " " <> bshow e 115 bind sock addr
112 threadDelay 5000000 116 `catchIOError` \e -> next (Just e)
113 loop 117 fix $ \loop -> let again mbe = do
118 forM_ mbe $ \e -> warn $ "bind-error: " <> bshow addrs <> " " <> bshow e
119 threadDelay 5000000
120 loop
121 in foldr tryBind again addrs Nothing
114 listen sock maxListenQueue 122 listen sock maxListenQueue
115 thread <- mkWeakThreadId <=< forkIO $ do 123 thread <- mkWeakThreadId <=< forkIO $ do
116 myThreadId >>= flip labelThread "StreamServer.acceptLoop" 124 myThreadId >>= flip labelThread "StreamServer.acceptLoop"