module Main
where
-import Control.Concurrent.ParallelIO.Global (
- parallel,
- stopGlobalPool )
+import Control.Concurrent.ParallelIO.Global ( stopGlobalPool )
import Control.Monad (unless, when)
import qualified Data.ByteString.Char8 as BS (intercalate, pack, unpack)
import Data.List ((\\), intercalate)
import Data.String.Utils (splitWs)
import System.Exit (ExitCode(..), exitSuccess, exitWith)
import System.IO (stderr, hPutStrLn)
+import Text.Read (readMaybe)
import Cidr (
Cidr(..),
- cidr_from_string,
combine_all,
enumerate,
max_octet1,
Mode(..),
parse_errors,
parse_mode )
-import DNS (Domain, lookup_ptrs)
+import DNS (Domain, PTRResult, lookup_ptrs)
import ExitCodes ( exit_args_parse_failed, exit_invalid_cidr )
import Octet ()
-- max values.
-- 4. Join the regexes from step 3 with regexes matching periods.
-- 5. Stick an address boundary on either side of the result.
+--
cidr_to_regex :: Cidr.Cidr -> String
cidr_to_regex cidr =
addr_barrier (intercalate "\\." [range1, range2, range3, range4])
input <- inputfunc
let cidr_strings = splitWs input
- let cidrs = map cidr_from_string cidr_strings
+ let cidrs = map readMaybe cidr_strings
when (any isNothing cidrs) $ do
putStrLn "Error: not valid CIDR notation."
let addr_bytestrings = map (BS.pack . show) addrs
ptrs <- lookup_ptrs addr_bytestrings
let pairs = zip addr_bytestrings ptrs
- _ <- parallel (map (putStrLn . show_pair) pairs)
- return ()
+ mapM_ (putStrLn . show_pair) pairs
stopGlobalPool
where
- show_pair :: (Domain, Maybe [Domain]) -> String
- show_pair (s, mds) =
+ show_pair :: (Domain, PTRResult) -> String
+ show_pair (s, eds) =
(BS.unpack s) ++ ": " ++ results
where
space = BS.pack " "
results =
- case mds of
- Nothing -> ""
- Just ds -> BS.unpack $ BS.intercalate space ds
+ case eds of
+ Left err -> "ERROR (" ++ (show err) ++ ")"
+ Right ds -> BS.unpack $ BS.intercalate space ds