lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname,
lwres_getnamebyaddr − lightweight resolver utility functions

#include <lwres/lwres.h>

lwres_result_t lwres_string_parse(lwres_buffer_t *b, char
**c, lwres_uint16_t *len);

lwres_result_t lwres_addr_parse(lwres_buffer_t *b,
lwres_addr_t *addr);

lwres_result_t lwres_getaddrsbyname(lwres_context_t *ctx,
const char *name, lwres_uint32_t addrtypes,
lwres_gabnresponse_t **structp);

lwres_result_t lwres_getnamebyaddr(lwres_context_t *ctx,
lwres_uint32_t addrtype, lwres_uint16_t addrlen, const
unsigned char *addr, lwres_gnbaresponse_t **structp); .SH

     lwres_string_parse() retrieves a DNS‐encoded string
starting the current pointer of lightweight resolver buffer
b: i.e. b‐>current.  When the function returns, the address
of the first byte of the encoded string is returned via *c
and the length of that string is given by *len. The buffer’s
current pointer is advanced to point at the character
following the string length, the encoded string, and the
trailing NULL character.

     lwres_addr_parse() extracts an address from the buffer
b. The buffer’s current pointer b‐>current is presumed to
point at an encoded address: the address preceded by a
32‐bit protocol family identifier and a 16‐bit length field.
The encoded address is copied to addr‐>address and
addr‐>length indicates the size in bytes of the address that
was copied. b‐>current is advanced to point at the next byte
of available data in the buffer following the encoded

     lwres_getaddrsbyname() and lwres_getnamebyaddr() use
the lwres_gnbaresponse_t structure defined below:

typedef struct {
        lwres_uint32_t          flags;
        lwres_uint16_t          naliases;
        lwres_uint16_t          naddrs;
        char                   *realname;
        char                  **aliases;
        lwres_uint16_t          realnamelen;
        lwres_uint16_t         *aliaslen;
        lwres_addrlist_t        addrs;
        void                   *base;
        size_t                  baselen;
} lwres_gabnresponse_t;


The contents of this structure are not manipulated directly
but they are controlled through the lwres_gabn(3) functions.

     The lightweight resolver uses lwres_getaddrsbyname() to
perform foward lookups.  Hostname name is looked up using
the resolver context ctx for memory allocation.  addrtypes
is a bitmask indicating which type of addresses are to be
looked up. Current values for this bitmask are
for IPv6 addresses. Results of the lookup are returned in

     lwres_getnamebyaddr() performs reverse lookups.
Resolver context ctx is used for memory allocation. The
address type is indicated by addrtype: LWRES_ADDRTYPE_V4 or
LWRES_ADDRTYPE_V6. The address to be looked up is given by
addr and its length is addrlen bytes. The result of the
function call is made available through *structp.

     Successful calls to lwres_string_parse() and
lwres_addr_parse() return LWRES_R_SUCCESS.  Both functions
return LWRES_R_FAILURE if the buffer is corrupt or
LWRES_R_UNEXPECTEDEND if the buffer has less space than
expected for the components of the encoded string or

     lwres_getaddrsbyname() returns LWRES_R_SUCCESS on
success and it returns LWRES_R_NOTFOUND if the hostname name
could not be found.

     LWRES_R_SUCCESS is returned by a successful call to

     Both lwres_getaddrsbyname() and lwres_getnamebyaddr()
return LWRES_R_NOMEMORY when memory allocation requests fail
and LWRES_R_UNEXPECTEDEND if the buffers used for sending
queries and receiving replies are too small.

     lwres_buffer(3), lwres_gabn(3).