diff options
author | Joe Crayne <joe@jerkface.net> | 2018-12-01 13:46:39 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2018-12-16 14:08:26 -0500 |
commit | 04f629c7452d4db3400fc82793317cfec52b4680 (patch) | |
tree | 58ec039c2ffb81b34745b45b895b8a9d6d9f9d52 /src | |
parent | da35152c9a0da38f815798c5f6b6b9a0362fd330 (diff) |
StreamServer: Support for fall-back bind-addresses.
Diffstat (limited to 'src')
-rw-r--r-- | src/Data/Tox/Relay.hs | 2 | ||||
-rw-r--r-- | src/Network/StreamServer.hs | 30 |
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 | ||
54 | packetNumber :: RelayPacket -> Word8 | 54 | packetNumber :: 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 | ||
16 | import Data.Monoid | 17 | import Data.Monoid |
@@ -48,6 +49,8 @@ import DebugTag | |||
48 | 49 | ||
49 | data ServerHandle = ServerHandle Socket (Weak ThreadId) | 50 | data ServerHandle = ServerHandle Socket (Weak ThreadId) |
50 | 51 | ||
52 | listenSocket :: ServerHandle -> RestrictedSocket | ||
53 | listenSocket (ServerHandle sock _) = restrictSocket sock | ||
51 | 54 | ||
52 | -- | Create a useless do-nothing 'ServerHandle'. | 55 | -- | Create a useless do-nothing 'ServerHandle'. |
53 | dummyServerHandle :: IO ServerHandle | 56 | dummyServerHandle :: 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. |
100 | streamServer :: ServerConfig -> SockAddr -> IO ServerHandle | 103 | streamServer :: ServerConfig -> [SockAddr] -> IO ServerHandle |
101 | streamServer cfg addr = do | 104 | streamServer 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" |