import Network.DNS (
Domain,
FileOrNumericHost(RCHostName),
- ResolvConf(resolvInfo),
+ ResolvConf(resolvInfo, resolvTimeout),
defaultResolvConf,
makeResolvSeed,
withResolver )
normalize_case,
resolve_address )
import ExitCodes (exit_bad_server)
+import Timeout (Timeout(..))
-report :: (Domain, Maybe [Domain]) -> IO ()
+
+-- | Report results for this LookupResult. If there's a Nothing in the
+-- second component, there were no query results, so we report that
+-- the domain was not delegated. If there were some results and
+-- there are leftovers (after "cleaning"), we report those as well.
+report :: LookupResult -> IO ()
report (d, Nothing) =
putStrLn $ "Domain " ++ (show d) ++ " not delegated."
report (d, Just leftovers) =
" delegates somewhere else: " ++
(join " " (map show leftovers))
+
+-- | "Clean" a lookup result by subtracting out the list of delegates.
+-- There shouldn't be anything left over. If there were no lookup
+-- results, we leave the Nothing in place so that 'report' can
+-- pattern match on it.
clean :: [Domain] -- ^ List of delegates, @ds@
-> LookupResult
-> LookupResult
let nrml_domains = map normalize_function raw_domains
let nrml_delegates = map normalize_function raw_delegates
- rc <- case (server cfg) of
- Nothing -> return defaultResolvConf
- Just s -> do
- s' <- resolve_address s
- case s' of
- Nothing -> do
- hPutStrLn stderr ("Bad DNS server or lookup error: " ++ s)
- exitWith (ExitFailure exit_bad_server)
- Just s'' ->
- return $ defaultResolvConf { resolvInfo =
- RCHostName (show s'') }
-
+ rc' <- case (server cfg) of
+ Nothing -> return defaultResolvConf
+ Just s -> do
+ s' <- resolve_address s
+ case s' of
+ Nothing -> do
+ hPutStrLn stderr ("Bad DNS server or lookup error: " ++ s)
+ exitWith (ExitFailure exit_bad_server)
+ Just s'' ->
+ return $ defaultResolvConf { resolvInfo =
+ RCHostName (show s'') }
+
+ -- Set the timeout from the command line. The resolvTimeout field is
+ -- in microseconds, so we multiply by one million.
+ let rc = rc' { resolvTimeout = 1000 * 1000 * (seconds $ timeout cfg) }
rs <- makeResolvSeed rc
let lookup_function = case cfg of
- (NS _ _ _) -> lookupNS'
- (MX _ _ _) -> lookupMX'
+ NS{} -> lookupNS'
+ MX{} -> lookupMX'
_ <- withResolver rs $ \resolver -> do
-- Bad stuff happens if we try to run these lookups in parallel