4 import qualified Data.ByteString.Char8 as BS (pack)
5 import Data.List ((\\))
6 import Data.String.Utils (join, splitWs)
10 FileOrNumericHost(RCHostName),
11 ResolvConf(resolvInfo),
18 import System.IO (hGetContents, stdin)
20 import CommandLine (Args(..), Delegates(..), get_args)
22 report :: (Domain, Maybe [Domain]) -> IO ()
24 putStrLn $ "Domain " ++ (show d) ++ " not delegated."
25 report (d, Just leftovers) =
28 else putStrLn $ "Domain " ++
30 " delegates somewhere else: " ++
31 (join " " (map show leftovers))
33 clean :: Delegates -> (Domain, Maybe [Domain]) -> (Domain, Maybe [Domain])
34 clean _ p@(_, Nothing) = p
35 clean (Delegates ds') (d, Just targets) =
36 (d, Just $ targets \\ ds)
44 input <- hGetContents stdin
46 -- Split the input on any whitespace characters.
47 let domains' = splitWs input
49 -- Convert those Strings to ByteStrings
50 let domains = map BS.pack domains'
52 let rc = case (server cfg) of
53 Nothing -> defaultResolvConf
54 Just s -> defaultResolvConf { resolvInfo = RCHostName s }
56 rs <- makeResolvSeed rc
57 withResolver rs $ \resolver -> do
58 -- This function keeps the domain matches with its NS records.
59 let lookupNS' = \d -> (lookupNS resolver d) >>= (return . ((,) d))
60 domains_ns <- mapM lookupNS' domains
61 let cdns = map (clean (delegates cfg)) domains_ns
65 -- We're only checking NS records, so report what we found.