module DNS ( LookupResult, lookupMX', lookupNS', normalize ) where import Control.Monad (liftM) import qualified Data.ByteString.Char8 as BS ( append, last, map, pack ) import Data.Char (toLower) import Network.DNS ( Domain, Resolver, lookupMX, lookupNS ) type LookupResult = (Domain, Maybe [Domain]) lookupMX' :: Resolver -> Domain -> IO LookupResult lookupMX' resolver domain = liftM (pair_em . drop_priority) $ lookupMX resolver domain where drop_priority :: Maybe [(Domain, Int)] -> Maybe [Domain] drop_priority = fmap (map fst) pair_em :: a -> (Domain, a) pair_em = (,) domain -- This function keeps the domain matches with its NS records. lookupNS' :: Resolver -> Domain -> IO LookupResult lookupNS' resolver domain = liftM pair_em $ lookupNS resolver domain where pair_em :: a -> (Domain, a) pair_em = (,) domain -- | Normalize the given name by lowercasing and appending a trailing -- dot (the root) if necessary. normalize :: Domain -> Domain normalize = normalize_case . normalize_root normalize_root :: Domain -> Domain normalize_root d | BS.last d == '.' = d | otherwise = d `BS.append` trailing_dot where trailing_dot = BS.pack "." normalize_case :: Domain -> Domain normalize_case = BS.map toLower