"yahoo.com",
"verizon.net" ]
+
+-- | Check whether the given domain has a valid MX record.
validate_mx :: Resolver -> Domain -> IO Bool
validate_mx resolver domain
| domain `elem` common_domains = return True
return (address, False)
+-- | Append a ByteString to a file Handle, followed by a newline.
append_handle_with_newline :: Handle -> BS.ByteString -> IO ()
append_handle_with_newline h bs = do
BS.hPutStr h bs
main = do
Args{..} <- apply_args
+ -- Get the input from either stdin, or the file given on the command
+ -- line.
input <- case input_file of
Nothing -> BS.hGetContents stdin
Just path -> do
exitWith (ExitFailure exit_input_file_doesnt_exist)
BS.readFile path
+ -- Do the same for the output handle and stdout.
output_handle <- case output_file of
Nothing -> return stdout
Just path -> openFile path WriteMode
+ -- Split the input into lines.
let addresses = BSU.lines input
+
+ -- And remove the empty ones.
let nonempty_addresses = filter (not . BS.null) addresses
rs <- makeResolvSeed resolv_conf
withResolver rs $ \resolver -> do
+ -- Construst a list of [IO (Address, Bool)]
let actions = map (validate resolver) nonempty_addresses
+ -- And compute them in parallel.
results <- parallel actions
stopGlobalPool
+ -- Find the pairs with a True in the second position.
let good_pairs = filter snd results
+ -- And output the results.
mapM_ ((append_handle_with_newline output_handle) . fst) good_pairs
- hFlush output_handle
- hClose output_handle
+
+ -- Clean up. It's safe to try to close stdout.
+ hFlush output_handle
+ hClose output_handle