diff options
author | joe <joe@jerkface.net> | 2018-06-24 02:27:18 -0400 |
---|---|---|
committer | joe <joe@jerkface.net> | 2018-06-24 03:10:43 -0400 |
commit | 55db1198b3da0c706f2b9f1ed9c8fd11fc4ae552 (patch) | |
tree | de035195ed188f8611da54e6e339d9124d2a5b3f /Presence/DNSCache.hs | |
parent | 3054de811f4ae7659dfc4dc338aab2c3d11b5c27 (diff) |
XMPP: Type-checking on various uses of SockAddr.
Diffstat (limited to 'Presence/DNSCache.hs')
-rw-r--r-- | Presence/DNSCache.hs | 22 |
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 | |||
27 | import Control.Concurrent.Lifted | 28 | import Control.Concurrent.Lifted |
28 | import GHC.Conc (labelThread) | 29 | import GHC.Conc (labelThread) |
29 | #endif | 30 | #endif |
31 | import Control.Arrow | ||
30 | import Control.Concurrent.STM | 32 | import Control.Concurrent.STM |
31 | import Data.Text ( Text ) | 33 | import Data.Text ( Text ) |
32 | import Network.Socket ( SockAddr(..), AddrInfoFlag(..), defaultHints, getAddrInfo, AddrInfo(..) ) | 34 | import Network.Socket ( SockAddr(..), AddrInfoFlag(..), defaultHints, getAddrInfo, AddrInfo(..) ) |
@@ -44,6 +46,7 @@ import Data.List | |||
44 | import Data.Ord | 46 | import Data.Ord |
45 | import Data.Maybe | 47 | import Data.Maybe |
46 | import System.IO.Error | 48 | import System.IO.Error |
49 | import System.IO.Unsafe | ||
47 | 50 | ||
48 | import SockAddr () | 51 | import SockAddr () |
49 | import ControlMaybe ( handleIO_ ) | 52 | import ControlMaybe ( handleIO_ ) |
@@ -144,7 +147,7 @@ rawForwardResolve dns onFail timeout addrtext = do | |||
144 | return () | 147 | return () |
145 | 148 | ||
146 | strip_brackets :: Text -> Text | 149 | strip_brackets :: Text -> Text |
147 | strip_brackets s = | 150 | strip_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 | ||
271 | splitAtPort :: String -> (String,String) | ||
272 | splitAtPort 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 | |||
280 | unsafeParseAddress :: String -> Maybe SockAddr | ||
281 | unsafeParseAddress 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 | |||
268 | withPort :: SockAddr -> Int -> SockAddr | 288 | withPort :: SockAddr -> Int -> SockAddr |
269 | withPort (SockAddrInet _ a) port = SockAddrInet (toEnum port) a | 289 | withPort (SockAddrInet _ a) port = SockAddrInet (toEnum port) a |
270 | withPort (SockAddrInet6 _ a b c) port = SockAddrInet6 (toEnum port) a b c | 290 | withPort (SockAddrInet6 _ a b c) port = SockAddrInet6 (toEnum port) a b c |