summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-01-04 17:23:46 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-04 17:23:46 -0500
commit6047a311f270bbb0a176900d9b1fea5e6d9b96c1 (patch)
treef3e52431dad452118a7ebde5c383f4f5abef726c /server
parent5181c77ce7dd73d622ff3921b90bf2741bedb646 (diff)
TCP relay server now binds to UDP node port as fallback.
Diffstat (limited to 'server')
-rw-r--r--server/src/DNSCache.hs5
-rw-r--r--server/src/Network/StreamServer.hs24
2 files changed, 16 insertions, 13 deletions
diff --git a/server/src/DNSCache.hs b/server/src/DNSCache.hs
index f539c71f..225584e3 100644
--- a/server/src/DNSCache.hs
+++ b/server/src/DNSCache.hs
@@ -50,6 +50,7 @@ import GetHostByAddr ( getHostByAddr )
50import Control.Concurrent.Delay 50import Control.Concurrent.Delay
51import DPut 51import DPut
52import DebugTag 52import DebugTag
53import Network.Address (make6mapped4)
53 54
54type TimeStamp = UTCTime 55type TimeStamp = UTCTime
55 56
@@ -100,10 +101,6 @@ dnsObserve dns withScrub utc obs = do
100 updatef f (n,addrs) = Map.alter (updateCache withScrub utc addrs) n f 101 updatef f (n,addrs) = Map.alter (updateCache withScrub utc addrs) n f
101 updater r (a,ns) = Map.alter (updateCache withScrub utc ns) a r 102 updater r (a,ns) = Map.alter (updateCache withScrub utc ns) a r
102 103
103make6mapped4 :: SockAddr -> SockAddr
104make6mapped4 addr@(SockAddrInet6 {}) = addr
105make6mapped4 addr@(SockAddrInet port a) = SockAddrInet6 port 0 (0,0,0xFFFF,fromBE32 a) 0
106
107tryForkOS :: String -> IO () -> IO ThreadId 104tryForkOS :: String -> IO () -> IO ThreadId
108tryForkOS lbl action = catchIOError (forkOSLabeled lbl action) $ \e -> do 105tryForkOS lbl action = catchIOError (forkOSLabeled lbl action) $ \e -> do
109 dput XMisc $ "DNSCache: Link with -threaded to avoid excessively long time-out." 106 dput XMisc $ "DNSCache: Link with -threaded to avoid excessively long time-out."
diff --git a/server/src/Network/StreamServer.hs b/server/src/Network/StreamServer.hs
index 1da612ce..4fc477c5 100644
--- a/server/src/Network/StreamServer.hs
+++ b/server/src/Network/StreamServer.hs
@@ -46,6 +46,7 @@ import System.IO.Error
46import System.IO (Handle) 46import System.IO (Handle)
47import Control.Concurrent.MVar (newMVar) 47import Control.Concurrent.MVar (newMVar)
48 48
49import Network.Address (make6mapped4, canonize)
49import Network.SocketLike 50import Network.SocketLike
50import DPut 51import DPut
51import DebugTag 52import DebugTag
@@ -113,24 +114,29 @@ withSession session = ServerConfig warnStderr session
113-- thread and prevent any new sessions from starting. Currently active 114-- thread and prevent any new sessions from starting. Currently active
114-- session threads will not be terminated or signaled in any way. 115-- session threads will not be terminated or signaled in any way.
115streamServer :: ServerConfig -> [SockAddr] -> IO ServerHandle 116streamServer :: ServerConfig -> [SockAddr] -> IO ServerHandle
116streamServer cfg addrs = do 117streamServer cfg addrs0 = do
117 let warn = serverWarn cfg 118 let warn = serverWarn cfg
118 family = case addrs of 119 family = case addrs0 of
119 SockAddrInet {}:_ -> AF_INET 120 SockAddrInet {}:_ -> AF_INET
120 SockAddrInet6 {}:_ -> AF_INET6 121 SockAddrInet6 {}:_ -> AF_INET6
121 SockAddrUnix {}:_ -> AF_UNIX 122 SockAddrUnix {}:_ -> AF_UNIX
122 [] -> AF_INET6 123 [] -> AF_INET6
124 addrs = map (if family == AF_INET6 then make6mapped4 else canonize) addrs0
123 sock <- socket family Stream 0 125 sock <- socket family Stream 0
124 setSocketOption sock ReuseAddr 1 126 setSocketOption sock ReuseAddr 1
125 let tryBind addr next _ = do 127 let tryBind addr next = do
128 warn $ "Trying to bind to TCP " ++ show addr
126 tryIOError (removeSocketFile addr) 129 tryIOError (removeSocketFile addr)
127 bind sock addr 130 bind sock addr
128 `catchIOError` \e -> next (Just e) 131 return $ Just addr
129 fix $ \loop -> let again mbe = do 132 `catchIOError` \e -> do
130 forM_ mbe $ \e -> warn $ "bind-error: " <> bshow addrs <> " " <> bshow e 133 warn $ "bind-error: " <> bshow addr <> " " <> bshow e
131 threadDelay 5000000 134 next
132 loop 135 bound <- fix $ \loop -> do
133 in foldr tryBind again addrs Nothing 136 m <- foldr tryBind (return Nothing) addrs
137 case m of
138 Just a -> return a
139 Nothing -> threadDelay 5000000 >> loop
134 listen sock maxListenQueue 140 listen sock maxListenQueue
135 thread <- mkWeakThreadId <=< forkIO $ do 141 thread <- mkWeakThreadId <=< forkIO $ do
136 bindaddr <- Socket.getSocketName sock 142 bindaddr <- Socket.getSocketName sock