X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FDNS.hs;h=a535de59adeb17a75b3c52333504bc65303e4bee;hb=02a793ab4325e5d04eb3ae3450aa33d01b4b4d1c;hp=e1c4e51e5fa029e1bd367d6fb0e381143333057f;hpb=942b8ef3bc5830ca0defa62342d55550aea59934;p=hath.git diff --git a/src/DNS.hs b/src/DNS.hs index e1c4e51..a535de5 100644 --- a/src/DNS.hs +++ b/src/DNS.hs @@ -1,35 +1,24 @@ -- | Helpers to perform DNS queries. module DNS ( Domain, - lookup_ptrs - ) + PTRResult, + lookup_ptrs ) where -import qualified Data.ByteString.Char8 as BS ( - append, - intercalate, - pack, - split ) +import Control.Concurrent.ParallelIO.Global ( parallel ) import Network.DNS ( Domain, + DNSError, ResolvConf(..), defaultResolvConf, - lookupPTR, + lookupRDNS, makeResolvSeed, - withResolver - ) + withResolver ) --- | Convert the given IP address (as a ByteString) to the format --- required for a PTR lookup. For example, "192.168.0.0" should be --- converted to "0.0.168.192.in-addr.arpa". -ip_to_in_addr_arpa :: Domain -> Domain -ip_to_in_addr_arpa ip = - rev_ip `BS.append` suffix - where - dot = BS.pack "." - suffix = BS.pack ".in-addr.arpa" - rev_ip = BS.intercalate dot (reverse (BS.split '.' ip)) +-- The return type of lookupRDNS. +type PTRResult = Either DNSError [Domain] + -- | Take the default ResolvConf and increase the timeout to 15 -- seconds. @@ -40,10 +29,10 @@ our_resolv_conf = -- | Takes a list of IP addresses (as ByteStrings) and performs -- reverse (PTR) lookups on each of them. -lookup_ptrs :: [Domain] -> IO [Maybe [Domain]] +lookup_ptrs :: [Domain] -> IO [PTRResult] lookup_ptrs ips = do rs <- makeResolvSeed our_resolv_conf - withResolver rs $ \resolver -> - mapM (lookupPTR resolver) in_addrs - where - in_addrs = map ip_to_in_addr_arpa ips + let lookup' addr = withResolver rs $ \resolver -> + lookupRDNS resolver addr + + parallel $ map lookup' ips