Portability | ForeignFunctionInterface |
---|---|
Stability | provisional |
Maintainer | simons@cryp.to |
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 API for the Haskell world; this module contains mostly marshaling code.
- data OpaqueState
- type AdnsState = Ptr OpaqueState
- data 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
- 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
- newtype RRAddr = RRAddr HostAddress
- sQUERYDOMAINWRONG :: Status
- sQUERYDOMAININVALID :: Status
- sQUERYDOMAINTOOLONG :: Status
- sMAX_MISQUERY :: Status
- sNXDOMAIN :: Status
- sNODATA :: Status
- sMAX_PERMFAIL :: Status
- data RRHostAddr = RRHostAddr HostName Status [RRAddr]
- data RRIntHostAddr = RRIntHostAddr Int RRHostAddr
- data RRByteblock = RRByteblock Int (Ptr CChar)
- data RRSrvRaw = RRSrvRaw Int Int Int (Ptr CChar)
- data Answer = Answer {}
- data Response
- peekResp :: RRType -> Ptr b -> Int -> Int -> IO [Response]
- peekFQDNAndAdvance :: Ptr a -> Int -> IO (String, Ptr a)
- 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 Source
type AdnsState = Ptr OpaqueStateSource
data OpaqueQuery Source
type Query = Ptr OpaqueQuerySource
NoEnv | do not look at environment |
NoErrPrint | never print output to stderr ( |
NoServerWarn | do not warn to stderr about duff nameservers etc |
Debug | enable all output to stderr plus |
LogPid | include process id in diagnostic output |
NoAutoSys | do not make syscalls at every opportunity |
Eintr | |
NoSigPipe | application has SIGPIPE set to SIG_IGN, do not protect |
CheckC_EntEx | do consistency checks on entry/exit to adns functions |
CheckC_Freq | do consistency checks very frequently (slow!) |
Search | use the searchlist |
UseVC | use a virtual circuit (TCP connection) |
Owner | fill in the owner field in the answer |
QuoteOk_Query | allow special chars in query domain |
QuoteOk_CName | allow special chars in CNAME we go via (default) |
QuoteOk_AnsHost | allow special chars in things supposed to be hostnames |
QuoteFail_CName | refuse if quote-req chars in CNAME we go via |
CName_Loose | allow refs to CNAMEs - without, get _s_cname |
CName_Forbid | don't follow CNAMEs, instead give _s_cname |
The record types we support.
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.
data RRHostAddr Source
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.
data RRIntHostAddr Source
Original definition:
typedef struct { int i; adns_rr_hostaddr ha; } adns_rr_inthostaddr;
data RRByteblock Source
Original definition:
typedef struct { int len; unsigned char *data; } adns_rr_byteblock;
Original definition:
typedef struct { int priority, weight, port; char *host; } adns_rr_srvraw;
peekFQDNAndAdvance :: Ptr a -> Int -> IO (String, Ptr a)Source
This function parses a FQDN in uncompressed wire format and advances the pointer to the next byte after the parsed name.
ADNS Library Functions
adnsInit :: [InitFlag] -> (AdnsState -> IO a) -> IO aSource
Run the given IO
computation with an initialized
resolver. As of now, the diagnose stream is always set to
System.IO.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 aSource
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.
adns_wait :: AdnsState -> Ptr Query -> Ptr (Ptr Answer) -> Ptr (Ptr a) -> IO CIntSource
Wait for the next Query
to become available.
adnsQueries :: AdnsState -> IO [Query]Source
Return the list of all currently open queries.
adnsStrerror :: Status -> IO StringSource
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 StringSource
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 StringSource
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_finish :: AdnsState -> IO ()Source
adns_strerror :: CInt -> IO CStringSource
adns_errabbrev :: CInt -> IO CStringSource