hsdns-1.4.1: Asynchronous DNS Resolver




This module implements a Haskell DNS Resolver on top of the ADNS library. GHC users should compile their code using the -threaded runtime system.



type Resolver = String -> RRType -> [QueryFlag] -> IO (MVar Answer)Source

A Resolver is an IO computation which -- given the name and type of the record to query -- returns an MVar that will eventually contain the Answer from the Domain Name System.

initResolver :: [InitFlag] -> (Resolver -> IO a) -> IO aSource

Run the given IO computation with an Initialized Resolver. Note that resolver functions can be shared, and should be shared between any number of IO threads. You may use multiple resolvers, of course, but doing so defeats the purpose of an asynchronous resolver.

toPTR :: HostAddress -> StringSource

Print an IP host address as a string suitable for PTR lookups.

resolveA :: Resolver -> HostName -> IO (Either Status [HostAddress])Source

Resolve a hostname's A records.

resolvePTR :: Resolver -> HostAddress -> IO (Either Status [HostName])Source

Get the PTR records assigned to a host address. Note that although the API allows for a record to have more than one PTR entry, this will actually not happen because the GNU adns library can't handle this case and will return sINCONSISTENT.

resolveMX :: Resolver -> HostName -> IO (Either Status [(HostName, HostAddress)])Source

Resolve the mail exchangers for a hostname. The returned list may contain more than one entry per hostname, in case the host has several A records. The records are returned in the order you should try to contact them as determined by the priority in the RRMX response.

resolveSRV :: Resolver -> HostName -> IO (Either Status [(HostName, PortID)])Source

Resolve a hostname's SRV records.

query :: (Resolver -> a -> IO (Either Status [b])) -> Resolver -> a -> IO (Maybe [b])Source

Convenience wrapper that will modify any of the revolveXXX functions above to return Maybe rather than Either. The idea is that Nothing signifies any sort of failure: Just [] signifies sNXDOMAIN or sNODATA, and everything else signifies sOK.

So if you aren't interested in getting accurate Status codes in case of failures. Wrap your DNS queries as follows:

 queryA :: Resolver -> HostName -> IO (Maybe [HostAddress])
 queryA = query resolveA

dummyDNS :: ResolverSource

Use this function to disable DNS resolving. It will always return (Answer sSYSTEMFAIL Nothing (Just host) (-1) []).