+dnslookup :: Resolver -> UserDomain -> Host -> IO (Either DNSError [IPv4])
+dnslookup rlv rbl host = lookupA rlv dom
+ where
+ suffix = pack $ "." ++ (pretty_show rbl)
+ dom = (reverse_labels host) `append` suffix
+
+
+-- | See 'lookup_single'. The \"prime\" version here takes an
+-- additional @resolver@ argument for performance reasons.
+--
+lookup_single' :: Resolver
+ -> Host
+ -> Site
+ -> IO (Maybe ListingDetails)
+lookup_single' resolver host site@(Site d p (Weight w)) = do
+ response <- dnslookup resolver d host
+ case response of
+ Left _ -> return Nothing -- Not listed, no error to report
+ Right ipv4s ->
+ case p of
+ -- No pattern given, but we got a hit.
+ Nothing -> return $ Just (ListingDetails site ipv4s)
+ Just pat -> do
+ let ipv4_strings = map show ipv4s
+ let codes = addresses pat
+ let hits = map (`elem` codes) ipv4_strings
+ if or hits -- if any of the returned addresses match the pattern
+ then return $ Just (ListingDetails site ipv4s)
+ else return Nothing
+
+
+-- | Look up a single...
+lookup_single :: Host
+ -> Site
+ -> IO (Maybe ListingDetails)
+lookup_single host site = do
+ rs <- makeResolvSeed defaultResolvConf
+ withResolver rs $ \resolver -> lookup_single' resolver host site
+
+
+lookup :: Host -> [Site] -> IO [ListingDetails]
+lookup host sites = do
+ rs <- makeResolvSeed defaultResolvConf
+ withResolver rs $ \resolver -> do
+ results <- mapM (lookup_single' resolver host) sites
+ return $ catMaybes results
+
+