+-- | Perform a query, but take the result from the authority section
+-- of the response rather than the answer section. Code shamelessly
+-- stolen from Network.DNS.lookup.
+lookup_authority :: Resolver -> Domain -> TYPE -> IO (Maybe [RDATA])
+lookup_authority rlv dom typ = (>>= toRDATA) <$> lookupRaw rlv dom typ
+ where
+ correct r = rrtype r == typ
+ listToMaybe [] = Nothing
+ listToMaybe xs = Just xs
+ toRDATA = listToMaybe . map rdata . filter correct . authority
+
+-- | Like lookupNS, except we take the result from the authority
+-- section of the response (as opposed to the answer section).
+lookupNS_authority :: Resolver -> Domain -> IO (Maybe [Domain])
+lookupNS_authority rlv dom = toNS <$> DNS.lookup_authority rlv dom NS
+ where
+ toNS = fmap (map unTag)
+ unTag (RD_NS dm) = dm
+ unTag _ = error "lookupNS_authority"
+
+resolve_address :: String -> IO (Maybe IPv4)
+resolve_address s =
+ case read_result of
+ Just _ -> return read_result
+ Nothing -> do
+ default_rs <- makeResolvSeed defaultResolvConf
+ withResolver default_rs $ \resolver -> do
+ result <- lookupA resolver (BS.pack s)
+ return $ case result of
+ Just (x:_) -> Just x
+ _ -> Nothing
+ where
+ read_result :: Maybe IPv4
+ read_result = readMaybe s
+