hsdns-1.0: Asynchronous DNS ResolverContentsIndex
ADNS.Base
PortabilityForeignFunctionInterface
Stabilityprovisional
Maintainersimons@cryp.to
Contents
Marshaled ADNS Data Types
ADNS Library Functions
Unmarshaled Low-Level C Functions
Helper Functions
Description

This module provides bindings to GNU ADNS, a domain name resolver library written in C. ADNS is available from http://www.gnu.org/software/adns/.

You will most likely not need this module directly: ADNS provides a simpler for the Haskell world; this module contains mostly marshaling code.

Synopsis
data OpaqueState = OpaqueState
type AdnsState = Ptr OpaqueState
data OpaqueQuery = OpaqueQuery
type Query = Ptr OpaqueQuery
data InitFlag
= NoEnv
| NoErrPrint
| NoServerWarn
| Debug
| LogPid
| NoAutoSys
| Eintr
| NoSigPipe
| CheckC_EntEx
| CheckC_Freq
data QueryFlag
= Search
| UseVC
| Owner
| QuoteOk_Query
| QuoteOk_CName
| QuoteOk_AnsHost
| QuoteFail_CName
| CName_Loose
| CName_Forbid
data RRType
= A
| MX
| NS
| PTR
newtype Status = StatusCode Int
sOK :: Status
sNOMEMORY :: Status
sUNKNOWNRRTYPE :: Status
sSYSTEMFAIL :: Status
sMAX_LOCALFAIL :: Status
sTIMEOUT :: Status
sALLSERVFAIL :: Status
sNORECURSE :: Status
sINVALIDRESPONSE :: Status
sUNKNOWNFORMAT :: Status
sMAX_REMOTEFAIL :: Status
sRCODESERVFAIL :: Status
sRCODEFORMATERROR :: Status
sRCODENOTIMPLEMENTED :: Status
sRCODEREFUSED :: Status
sRCODEUNKNOWN :: Status
sMAX_TEMPFAIL :: Status
sINCONSISTENT :: Status
sPROHIBITEDCNAME :: Status
sANSWERDOMAININVALID :: Status
sANSWERDOMAINTOOLONG :: Status
sINVALIDDATA :: Status
sMAX_MISCONFIG :: Status
sQUERYDOMAINWRONG :: Status
sQUERYDOMAININVALID :: Status
sQUERYDOMAINTOOLONG :: Status
sMAX_MISQUERY :: Status
sNXDOMAIN :: Status
sNODATA :: Status
sMAX_PERMFAIL :: Status
newtype RRAddr = RRAddr HostAddress
data RRHostAddr = RRHostAddr HostName Status [RRAddr]
data RRIntHostAddr = RRIntHostAddr Int RRHostAddr
data Answer = Answer {
status :: Status
cname :: (Maybe String)
owner :: (Maybe String)
expires :: CTime
rrs :: [Response]
}
data Response
= RRA RRAddr
| RRMX Int RRHostAddr
| RRNS RRHostAddr
| RRPTR String
peekResp :: RRType -> Ptr b -> Int -> Int -> IO [Response]
adnsInit :: [InitFlag] -> (AdnsState -> IO a) -> IO a
adnsInitCfg :: [InitFlag] -> String -> (AdnsState -> IO a) -> IO a
adnsSynch :: AdnsState -> String -> RRType -> [QueryFlag] -> IO Answer
adnsSubmit :: AdnsState -> String -> RRType -> [QueryFlag] -> IO Query
adnsCheck :: AdnsState -> Query -> IO (Maybe Answer)
adnsWait :: AdnsState -> IO (Maybe (Query, Answer))
adnsCancel :: Query -> IO ()
adns_wait :: AdnsState -> Ptr Query -> Ptr (Ptr Answer) -> Ptr (Ptr a) -> IO CInt
adnsQueries :: AdnsState -> IO [Query]
adnsStrerror :: Status -> IO String
adnsErrAbbrev :: Status -> IO String
adnsErrTypeAbbrev :: Status -> IO String
adns_init :: Ptr AdnsState -> CInt -> Ptr CFile -> IO CInt
adns_init_strcfg :: Ptr AdnsState -> CInt -> Ptr CFile -> CString -> IO CInt
adns_finish :: AdnsState -> IO ()
adns_submit :: AdnsState -> CString -> CInt -> CInt -> Ptr a -> Ptr Query -> IO CInt
adns_check :: AdnsState -> Ptr Query -> Ptr (Ptr Answer) -> Ptr (Ptr a) -> IO CInt
adns_synchronous :: AdnsState -> CString -> CInt -> CInt -> Ptr (Ptr Answer) -> IO CInt
adns_forallqueries_begin :: AdnsState -> IO ()
adns_forallqueries_next :: AdnsState -> Ptr (Ptr a) -> IO Query
adns_strerror :: CInt -> IO CString
adns_errabbrev :: CInt -> IO CString
adns_errtypeabbrev :: CInt -> IO CString
wrapAdns :: (Ptr (Ptr b) -> IO CInt) -> (Ptr (Ptr b) -> IO a) -> IO a
mkFlags :: Enum a => [a] -> CInt
Marshaled ADNS Data Types
data OpaqueState
Constructors
OpaqueState
type AdnsState = Ptr OpaqueState
data OpaqueQuery
Constructors
OpaqueQuery
type Query = Ptr OpaqueQuery
data InitFlag
Constructors
NoEnvdo not look at environment
NoErrPrintnever print output to stderr (Debug overrides)
NoServerWarndo not warn to stderr about duff nameservers etc
Debugenable all output to stderr plus Debug msgs
LogPidinclude process id in diagnostic output
NoAutoSysdo not make syscalls at every opportunity
Eintrallow adnsSynch to return eINTR
NoSigPipeapplication has SIGPIPE set to SIG_IGN, do not protect
CheckC_EntExdo consistency checks on entry/exit to adns functions
CheckC_Freqdo consistency checks very frequently (slow!)
show/hide Instances
data QueryFlag
Constructors
Searchuse the searchlist
UseVCuse a virtual circuit (TCP connection)
Ownerfill in the owner field in the answer
QuoteOk_Queryallow special chars in query domain
QuoteOk_CNameallow special chars in CNAME we go via (default)
QuoteOk_AnsHostallow special chars in things supposed to be hostnames
QuoteFail_CNamerefuse if quote-req chars in CNAME we go via
CName_Looseallow refs to CNAMEs - without, get _s_cname
CName_Forbiddon't follow CNAMEs, instead give _s_cname
show/hide Instances
data RRType
The record types we support.
Constructors
A
MX
NS
PTR
show/hide Instances
newtype Status
The status codes recognized by ADNS vary in different versions of the library. So instead of providing an Enum, the Status type contains the numeric value as returned by ADNS itself. For common status codes, helper functions like sOK or sNXDOMAIN are provided. The functions adnsErrTypeAbbrev, adnsErrAbbrev, and adnsStrerror can also be used to map these codes into human readable strings.
Constructors
StatusCode Int
show/hide Instances
sOK :: Status
sNOMEMORY :: Status
sUNKNOWNRRTYPE :: Status
sSYSTEMFAIL :: Status
sMAX_LOCALFAIL :: Status
sTIMEOUT :: Status
sALLSERVFAIL :: Status
sNORECURSE :: Status
sINVALIDRESPONSE :: Status
sUNKNOWNFORMAT :: Status
sMAX_REMOTEFAIL :: Status
sRCODESERVFAIL :: Status
sRCODEFORMATERROR :: Status
sRCODENOTIMPLEMENTED :: Status
sRCODEREFUSED :: Status
sRCODEUNKNOWN :: Status
sMAX_TEMPFAIL :: Status
sINCONSISTENT :: Status
sPROHIBITEDCNAME :: Status
sANSWERDOMAININVALID :: Status
sANSWERDOMAINTOOLONG :: Status
sINVALIDDATA :: Status
sMAX_MISCONFIG :: Status
sQUERYDOMAINWRONG :: Status
sQUERYDOMAININVALID :: Status
sQUERYDOMAINTOOLONG :: Status
sMAX_MISQUERY :: Status
sNXDOMAIN :: Status
sNODATA :: Status
sMAX_PERMFAIL :: Status
newtype RRAddr

Original definition:

    typedef struct {
      int len;
      union {
        struct sockaddr sa;
        struct sockaddr_in inet;
      } addr;
    } adns_rr_addr;

Note: Anything but sockaddr_in will cause peek to call fail, when marshaling this structure. poke is not defined.

Constructors
RRAddr HostAddress
show/hide Instances
data RRHostAddr

Original definition:

    typedef struct {
      char *host;
      adns_status astatus;
      int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0
      adns_rr_addr *addrs;
    } adns_rr_hostaddr;

The naddrs field is not available in RRHostAddr because I couldn't see how that information wouldn't be available in the astatus field too. If I missed anything, please let me know.

Note: The data type should probably contain HostAddress rather than RRAddr. I'm using the former only because it has nicer output with show. poke is not defined.

Constructors
RRHostAddr HostName Status [RRAddr]
show/hide Instances
data RRIntHostAddr

Original definition:

    typedef struct {
      int i;
      adns_rr_hostaddr ha;
    } adns_rr_inthostaddr;
Constructors
RRIntHostAddr Int RRHostAddr
show/hide Instances
data Answer
Constructors
Answer
status :: StatusStatus code for this query.
cname :: (Maybe String)Always Nothing for CNAME queries (which are not supported yet anyway).
owner :: (Maybe String)Only set if Owner was requested for query.
expires :: CTimeOnly defined if status is sOK, sNXDOMAIN, or sNODATA.
rrs :: [Response]The list will be empty if an error occured.
show/hide Instances
data Response
Constructors
RRA RRAddr
RRMX Int RRHostAddr
RRNS RRHostAddr
RRPTR String
show/hide Instances
peekResp :: RRType -> Ptr b -> Int -> Int -> IO [Response]
This function parses the Response union found in Answer. It cannot be defined via Storable because it needs to know the type of the record to expect. This is, by the way, the function to look at, if you want to add support for additional RRType records.
ADNS Library Functions
adnsInit :: [InitFlag] -> (AdnsState -> IO a) -> IO a
Run the given IO computation with an initialized resolver. As of now, the diagnose stream is always set to stderr. Initialize the library with NoErrPrint if you don't wont to see any error output. All resources are freed when adnsInit returns.
adnsInitCfg :: [InitFlag] -> String -> (AdnsState -> IO a) -> IO a

Similar to adnsInit, but reads the resolver configuration from a string rather than from /etc/resolv.conf. Supported are the usual commands: nameserver, search, domain, sortlist, and options.

Additionally, these non-standard commands may be used:

  • clearnameservers: Clears the list of nameservers.
  • include filename: The specified file will be read.
adnsSynch :: AdnsState -> String -> RRType -> [QueryFlag] -> IO Answer
Perform a synchronous query for a record. In case of an I/O error, an IOException is thrown. If the query fails for other reasons, the Status code in the Answer will signify that.
adnsSubmit :: AdnsState -> String -> RRType -> [QueryFlag] -> IO Query
Submit an asynchronous query. The returned Query can be tested for completion with adnsCheck.
adnsCheck :: AdnsState -> Query -> IO (Maybe Answer)
Check the status of an asynchronous query. If the query is complete, the Answer will be returned. The Query becomes invalid after that.
adnsWait :: AdnsState -> IO (Maybe (Query, Answer))
Wait for a response to arrive. The returned Query is invalid and must not be passed to ADNS again. If Nothing is returned, the resolver is empty.
adnsCancel :: Query -> IO ()
Cancel an open Query.
adns_wait :: AdnsState -> Ptr Query -> Ptr (Ptr Answer) -> Ptr (Ptr a) -> IO CInt
Wait for the next Query to become available.
adnsQueries :: AdnsState -> IO [Query]
Return the list of all currently open queries.
adnsStrerror :: Status -> IO String

Map a Status code to a human-readable error description. For example:

    *ADNS> adnsStrerror sNXDOMAIN >>= print
    "No such domain"

Use this function with great care: It will crash the process when called with a status code that ADNS doesn't know about. So use it only to print values you got from the resolver!

adnsErrAbbrev :: Status -> IO String
Map a Status code to a short error name. Don't use this function to print a status code unless you've obtained it from the resolver!
adnsErrTypeAbbrev :: Status -> IO String
Map a Status code to a short description of the type of error. Don't use this function to print a status code unless you've obtained it from the resolver!
Unmarshaled Low-Level C Functions
adns_init :: Ptr AdnsState -> CInt -> Ptr CFile -> IO CInt
adns_init_strcfg :: Ptr AdnsState -> CInt -> Ptr CFile -> CString -> IO CInt
adns_finish :: AdnsState -> IO ()
adns_submit :: AdnsState -> CString -> CInt -> CInt -> Ptr a -> Ptr Query -> IO CInt
adns_check :: AdnsState -> Ptr Query -> Ptr (Ptr Answer) -> Ptr (Ptr a) -> IO CInt
adns_synchronous :: AdnsState -> CString -> CInt -> CInt -> Ptr (Ptr Answer) -> IO CInt
adns_forallqueries_begin :: AdnsState -> IO ()
adns_forallqueries_next :: AdnsState -> Ptr (Ptr a) -> IO Query
adns_strerror :: CInt -> IO CString
adns_errabbrev :: CInt -> IO CString
adns_errtypeabbrev :: CInt -> IO CString
Helper Functions
wrapAdns :: (Ptr (Ptr b) -> IO CInt) -> (Ptr (Ptr b) -> IO a) -> IO a
Internel helper function to handle result passing from ADNS via Ptr (Ptr a), and to generate human-readable IO exceptions in case of an error.
mkFlags :: Enum a => [a] -> CInt
Map a list of flags (Enum types) into a CInt suitable for adns calls.
Produced by Haddock version 0.8