hsdns 1.7.1 → 1.8
raw patch · 6 files changed
+27/−25 lines, 6 filesdep ~network
Dependency ranges changed: network
Files
- ADNS.hs +3/−4
- ADNS/Base.hsc +3/−4
- ADNS/Resolver.hs +3/−4
- example/adns-reverse-lookup.hs +10/−4
- example/adns-srv-test.hs +6/−7
- hsdns.cabal +2/−2
ADNS.hs view
@@ -22,16 +22,15 @@ ) where -import Network ( HostName, PortID )-import Network.Socket ( HostAddress )+import Network.Socket ( HostName, HostAddress, PortNumber ) import ADNS.Base import ADNS.Resolver queryA :: Resolver -> HostName -> IO (Maybe [HostAddress]) queryA = query resolveA --- | For quering SRV records. Result is the list of tuples (host, port).-querySRV :: Resolver -> HostName -> IO (Maybe [(HostName, PortID)])+-- | For querying SRV records. Result is the list of tuples (host, port).+querySRV :: Resolver -> HostName -> IO (Maybe [(HostName, PortNumber)]) querySRV = query resolveSRV queryPTR :: Resolver -> HostAddress -> IO (Maybe [HostName])
ADNS/Base.hsc view
@@ -20,8 +20,7 @@ module ADNS.Base where import Control.Exception ( assert, bracket )-import Network ( HostName )-import Network.Socket ( HostAddress, hostAddressToTuple )+import Network.Socket ( HostName, HostAddress, hostAddressToTuple ) import Foreign import Foreign.C @@ -342,7 +341,7 @@ , expires :: CTime -- ^ Only defined if status is 'sOK', 'sNXDOMAIN', or 'sNODATA'. , rrs :: [Response]- -- ^ The list will be empty if an error occured.+ -- ^ The list will be empty if an error occurred. } deriving (Show) @@ -612,7 +611,7 @@ -- * Helper Functions --- |Internel helper function to handle result passing from+-- |Internal helper function to handle result passing from -- ADNS via @Ptr (Ptr a)@, and to generate human-readable IO -- exceptions in case of an error.
ADNS/Resolver.hs view
@@ -28,8 +28,7 @@ import Data.List ( sortBy ) import Data.Map ( Map ) import qualified Data.Map as Map-import Network-import Network.Socket ( HostAddress, hostAddressToTuple )+import Network.Socket ( HostName, HostAddress, PortNumber, hostAddressToTuple ) import ADNS.Base -- |A 'Resolver' is an 'IO' computation which -- given the name@@ -58,7 +57,7 @@ -- |Resolve a hostname's 'SRV' records. -resolveSRV :: Resolver -> HostName -> IO (Either Status [(HostName, PortID)])+resolveSRV :: Resolver -> HostName -> IO (Either Status [(HostName, PortNumber)]) resolveSRV resolver x = do Answer rc _ _ _ rs <- resolver x SRV [] >>= takeMVar if rc /= sOK@@ -67,7 +66,7 @@ let cmp (RRSRV p1 _ _ _) (RRSRV p2 _ _ _) = compare p1 p2 cmp _ _ = error $ showString "unexpected record in SRV lookup: " (show rs) rs' = sortBy cmp rs- as = [ (host, PortNumber $ toEnum port) | (RRSRV _ _ port host) <- rs' ]+ as = [ (host, toEnum port) | (RRSRV _ _ port host) <- rs' ] return (Right as) -- |Get the 'PTR' records assigned to a host address. Note
example/adns-reverse-lookup.hs view
@@ -13,7 +13,7 @@ import Control.Concurrent ( forkIO ) import Control.Concurrent.Chan ( Chan, newChan, writeChan, readChan ) import System.Environment ( getArgs )-import Network.Socket ( inet_ntoa )+import Network.Socket ( getNameInfo, NameInfoFlag(..), SockAddr(..) ) import ADNS data CheckResult@@ -22,9 +22,9 @@ | DNSError String printResult :: CheckResult -> IO ()-printResult (OK h a) = do addr <- inet_ntoa a+printResult (OK h a) = do addr <- ntoa a putStrLn $ "OK: " ++ h ++ " <-> " ++ addr-printResult (NotOK h a h') = do addr <- inet_ntoa a+printResult (NotOK h a h') = do addr <- ntoa a putStrLn $ "FAIL: " ++ h ++ " -> " ++ addr ++ " -> " ++ show h' printResult (DNSError msg) = putStrLn $ "ERR: " ++ msg @@ -47,5 +47,11 @@ case ptr of Just names | host `elem` names -> writeChan chan (OK host addr) | otherwise -> writeChan chan (NotOK host addr names)- _ -> returnError "PTR"+ _ -> ntoa addr >>= \str -> returnError ("PTR for "++str) _ -> returnError "A"++ntoa :: HostAddress -> IO String+ntoa ha = do r <- getNameInfo [NI_NUMERICHOST] True False (SockAddrInet 0 ha)+ case r of+ (Just hname, _) -> return hname+ _ -> fail ("getNameInfo: unexpected failure printing address "++show ha)
example/adns-srv-test.hs view
@@ -2,13 +2,17 @@ Resolve a hostnames' SRV records, then show it. TODO: Add the ability to perform multiple requests.++ TODO: I am confused. This code does not appear to work. Running+ "adns-srv-test _sip._udp.cryp.to" prints no useful data even though a+ SRV record exists.+ -} module Main ( main ) where import Control.Monad ( when ) import System.Environment ( getArgs )-import Network ( PortID(..) ) import ADNS main :: IO ()@@ -18,10 +22,5 @@ initResolver [Debug] $ \resolver -> do a <- querySRV resolver (head names) case a of- Just addr -> putStrLn $ "RESULT:\n" ++ concatMap (\b -> fst b ++ ":" ++ showPortID (snd b)) addr+ Just addr -> putStrLn $ "RESULT:\n" ++ concatMap (\b -> fst b ++ ":" ++ show (snd b)) addr _ -> fail $ "Error in SRV " ++ show (head names)--showPortID :: PortID -> String-showPortID (PortNumber p) = show p-showPortID (UnixSocket str) = str-showPortID (Service str) = str
hsdns.cabal view
@@ -1,5 +1,5 @@ Name: hsdns-Version: 1.7.1+Version: 1.8 Copyright: Peter Simons License: LGPL-3 License-File: COPYING.LESSER@@ -33,7 +33,7 @@ Cabal-Version: >= 1.8 Build-Type: Simple tested-with: GHC == 7.0.4, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3- , GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1+ , GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.3 Source-Repository head Type: git