summaryrefslogtreecommitdiff
path: root/Presence/DNSCache.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2018-06-24 02:27:18 -0400
committerjoe <joe@jerkface.net>2018-06-24 03:10:43 -0400
commit55db1198b3da0c706f2b9f1ed9c8fd11fc4ae552 (patch)
treede035195ed188f8611da54e6e339d9124d2a5b3f /Presence/DNSCache.hs
parent3054de811f4ae7659dfc4dc338aab2c3d11b5c27 (diff)
XMPP: Type-checking on various uses of SockAddr.
Diffstat (limited to 'Presence/DNSCache.hs')
-rw-r--r--Presence/DNSCache.hs22
1 files changed, 21 insertions, 1 deletions
diff --git a/Presence/DNSCache.hs b/Presence/DNSCache.hs
index ce35752e..c5154e34 100644
--- a/Presence/DNSCache.hs
+++ b/Presence/DNSCache.hs
@@ -17,6 +17,7 @@ module DNSCache
17 , forwardResolve 17 , forwardResolve
18 , newDNSCache 18 , newDNSCache
19 , parseAddress 19 , parseAddress
20 , unsafeParseAddress
20 , strip_brackets 21 , strip_brackets
21 , withPort 22 , withPort
22 ) where 23 ) where
@@ -27,6 +28,7 @@ import Control.Concurrent.Lifted.Instrument
27import Control.Concurrent.Lifted 28import Control.Concurrent.Lifted
28import GHC.Conc (labelThread) 29import GHC.Conc (labelThread)
29#endif 30#endif
31import Control.Arrow
30import Control.Concurrent.STM 32import Control.Concurrent.STM
31import Data.Text ( Text ) 33import Data.Text ( Text )
32import Network.Socket ( SockAddr(..), AddrInfoFlag(..), defaultHints, getAddrInfo, AddrInfo(..) ) 34import Network.Socket ( SockAddr(..), AddrInfoFlag(..), defaultHints, getAddrInfo, AddrInfo(..) )
@@ -44,6 +46,7 @@ import Data.List
44import Data.Ord 46import Data.Ord
45import Data.Maybe 47import Data.Maybe
46import System.IO.Error 48import System.IO.Error
49import System.IO.Unsafe
47 50
48import SockAddr () 51import SockAddr ()
49import ControlMaybe ( handleIO_ ) 52import ControlMaybe ( handleIO_ )
@@ -144,7 +147,7 @@ rawForwardResolve dns onFail timeout addrtext = do
144 return () 147 return ()
145 148
146strip_brackets :: Text -> Text 149strip_brackets :: Text -> Text
147strip_brackets s = 150strip_brackets s =
148 case Text.uncons s of 151 case Text.uncons s of
149 Just ('[',t) -> Text.takeWhile (/=']') t 152 Just ('[',t) -> Text.takeWhile (/=']') t
150 _ -> s 153 _ -> s
@@ -265,6 +268,23 @@ parseAddress addr_str = do
265 return . listToMaybe $ map addrAddress info 268 return . listToMaybe $ map addrAddress info
266 269
267 270
271splitAtPort :: String -> (String,String)
272splitAtPort s = second sanitizePort $ case s of
273 ('[':t) -> break (==']') t
274 _ -> break (==':') s
275 where
276 sanitizePort (']':':':p) = p
277 sanitizePort (':':p) = p
278 sanitizePort _ = "0"
279
280unsafeParseAddress :: String -> Maybe SockAddr
281unsafeParseAddress addr_str = unsafePerformIO $ do
282 let (ipstr,portstr) = splitAtPort addr_str
283 info <- getAddrInfo (Just $ defaultHints { addrFlags = [ AI_NUMERICHOST ] })
284 (Just ipstr)
285 (Just portstr)
286 return . listToMaybe $ map addrAddress info
287
268withPort :: SockAddr -> Int -> SockAddr 288withPort :: SockAddr -> Int -> SockAddr
269withPort (SockAddrInet _ a) port = SockAddrInet (toEnum port) a 289withPort (SockAddrInet _ a) port = SockAddrInet (toEnum port) a
270withPort (SockAddrInet6 _ a b c) port = SockAddrInet6 (toEnum port) a b c 290withPort (SockAddrInet6 _ a b c) port = SockAddrInet6 (toEnum port) a b c