diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 18:37:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 18:37:14 +0000 |
commit | ea648e70a989cca190cd7403fe892fd2dcc290b4 (patch) | |
tree | e2b6b1c647da68b0d4d66082835e256eb30970e8 /lib/lwres/include | |
parent | Initial commit. (diff) | |
download | bind9-ea648e70a989cca190cd7403fe892fd2dcc290b4.tar.xz bind9-ea648e70a989cca190cd7403fe892fd2dcc290b4.zip |
Adding upstream version 1:9.11.5.P4+dfsg.upstream/1%9.11.5.P4+dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/lwres/include')
-rw-r--r-- | lib/lwres/include/Makefile.in | 19 | ||||
-rw-r--r-- | lib/lwres/include/lwres/Makefile.in | 46 | ||||
-rw-r--r-- | lib/lwres/include/lwres/context.h | 129 | ||||
-rw-r--r-- | lib/lwres/include/lwres/int.h | 28 | ||||
-rw-r--r-- | lib/lwres/include/lwres/ipv6.h | 119 | ||||
-rw-r--r-- | lib/lwres/include/lwres/lang.h | 27 | ||||
-rw-r--r-- | lib/lwres/include/lwres/list.h | 115 | ||||
-rw-r--r-- | lib/lwres/include/lwres/lwbuffer.h | 401 | ||||
-rw-r--r-- | lib/lwres/include/lwres/lwpacket.h | 155 | ||||
-rw-r--r-- | lib/lwres/include/lwres/lwres.h | 577 | ||||
-rw-r--r-- | lib/lwres/include/lwres/netdb.h.in | 516 | ||||
-rw-r--r-- | lib/lwres/include/lwres/platform.h.in | 114 | ||||
-rw-r--r-- | lib/lwres/include/lwres/result.h | 36 | ||||
-rw-r--r-- | lib/lwres/include/lwres/stdlib.h | 32 | ||||
-rw-r--r-- | lib/lwres/include/lwres/string.h | 32 | ||||
-rw-r--r-- | lib/lwres/include/lwres/version.h | 22 |
16 files changed, 2368 insertions, 0 deletions
diff --git a/lib/lwres/include/Makefile.in b/lib/lwres/include/Makefile.in new file mode 100644 index 0000000..51564a9 --- /dev/null +++ b/lib/lwres/include/Makefile.in @@ -0,0 +1,19 @@ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +# $Id: Makefile.in,v 1.8 2007/06/19 23:47:22 tbox Exp $ + +srcdir = @srcdir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ + +SUBDIRS = lwres +TARGETS = + +@BIND9_MAKE_RULES@ diff --git a/lib/lwres/include/lwres/Makefile.in b/lib/lwres/include/lwres/Makefile.in new file mode 100644 index 0000000..2a07df5 --- /dev/null +++ b/lib/lwres/include/lwres/Makefile.in @@ -0,0 +1,46 @@ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +srcdir = @srcdir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ + +# +# Only list headers that are to be installed and are not +# machine generated. The latter are handled specially in the +# install target below. +# +HEADERS = context.h int.h ipv6.h lang.h list.h \ + lwbuffer.h lwpacket.h lwres.h result.h \ + stdlib.h string.h version.h + +SUBDIRS = +TARGETS = + +@BIND9_MAKE_RULES@ + +installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}/lwres + +install:: installdirs + for i in ${HEADERS}; do \ + ${INSTALL_DATA} ${srcdir}/$$i ${DESTDIR}${includedir}/lwres || exit 1; \ + done + ${INSTALL_DATA} netdb.h ${DESTDIR}${includedir}/lwres + ${INSTALL_DATA} platform.h ${DESTDIR}${includedir}/lwres + +uninstall:: + rm -f ${DESTDIR}${includedir}/lwres/platform.h + rm -f ${DESTDIR}${includedir}/lwres/netdb.h + for i in ${HEADERS}; do \ + rm -f ${DESTDIR}${includedir}/lwres/$$i || exit 1; \ + done + +distclean:: + rm -f netdb.h platform.h diff --git a/lib/lwres/include/lwres/context.h b/lib/lwres/include/lwres/context.h new file mode 100644 index 0000000..2acc4a1 --- /dev/null +++ b/lib/lwres/include/lwres/context.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: context.h,v 1.23 2008/12/17 23:47:58 tbox Exp $ */ + +#ifndef LWRES_CONTEXT_H +#define LWRES_CONTEXT_H 1 + +/*! \file lwres/context.h */ + +#include <inttypes.h> +#include <stddef.h> + +#include <lwres/lang.h> +#include <lwres/result.h> + +/*! + * Used to set various options such as timeout, authentication, etc + */ +typedef struct lwres_context lwres_context_t; + +LWRES_LANG_BEGINDECLS + +typedef void *(*lwres_malloc_t)(void *arg, size_t length); +typedef void (*lwres_free_t)(void *arg, void *mem, size_t length); + +/* + * XXXMLG + * + * Make the server reload /etc/resolv.conf periodically. + * + * Make the server do sortlist/searchlist. + * + * Client side can disable the search/sortlist processing. + * + * Use an array of addresses/masks and searchlist for client-side, and + * if added to the client disable the processing on the server. + * + * Share /etc/resolv.conf data between contexts. + */ + +/*! + * _SERVERMODE + * Don't allocate and connect a socket to the server, since the + * caller _is_ a server. + * + * _USEIPV4, _USEIPV6 + * Use IPv4 and IPv6 transactions with remote servers, respectively. + * For backward compatibility, regard both flags as being set when both + * are cleared. + */ +#define LWRES_CONTEXT_SERVERMODE 0x00000001U +#define LWRES_CONTEXT_USEIPV4 0x00000002U +#define LWRES_CONTEXT_USEIPV6 0x00000004U + +lwres_result_t +lwres_context_create(lwres_context_t **contextp, void *arg, + lwres_malloc_t malloc_function, + lwres_free_t free_function, + unsigned int flags); +/**< + * Allocate a lwres context. This is used in all lwres calls. + * + * Memory management can be replaced here by passing in two functions. + * If one is non-NULL, they must both be non-NULL. "arg" is passed to + * these functions. + * + * Contexts are not thread safe. Document at the top of the file. + * XXXMLG + * + * If they are NULL, the standard malloc() and free() will be used. + * + *\pre contextp != NULL && contextp == NULL. + * + *\return Returns 0 on success, non-zero on failure. + */ + +void +lwres_context_destroy(lwres_context_t **contextp); +/**< + * Frees all memory associated with a lwres context. + * + *\pre contextp != NULL && contextp == NULL. + */ + +uint32_t +lwres_context_nextserial(lwres_context_t *ctx); +/**< + * XXXMLG Document + */ + +void +lwres_context_initserial(lwres_context_t *ctx, uint32_t serial); + +void +lwres_context_freemem(lwres_context_t *ctx, void *mem, size_t len); + +void * +lwres_context_allocmem(lwres_context_t *ctx, size_t len); + +int +lwres_context_getsocket(lwres_context_t *ctx); + +lwres_result_t +lwres_context_send(lwres_context_t *ctx, + void *sendbase, int sendlen); + +lwres_result_t +lwres_context_recv(lwres_context_t *ctx, + void *recvbase, int recvlen, + int *recvd_len); + +lwres_result_t +lwres_context_sendrecv(lwres_context_t *ctx, + void *sendbase, int sendlen, + void *recvbase, int recvlen, + int *recvd_len); + +LWRES_LANG_ENDDECLS + +#endif /* LWRES_CONTEXT_H */ diff --git a/lib/lwres/include/lwres/int.h b/lib/lwres/include/lwres/int.h new file mode 100644 index 0000000..8bc5ce8 --- /dev/null +++ b/lib/lwres/include/lwres/int.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +#ifndef LWRES_INT_H +#define LWRES_INT_H 1 + +#include <inttypes.h> + +/*! \file lwres/int.h */ + +typedef lwres_int8_t int8_t; +typedef lwres_uint8_t uint8_t; +typedef lwres_int16_t int16_t; +typedef lwres_uint16_t uint16_t; +typedef lwres_int32_t int32_t; +typedef lwres_uint32_t uint32_t; +typedef lwres_int64_t int64_t; +typedef lwres_uint64_t uint64_t; + +#endif /* LWRES_INT_H */ diff --git a/lib/lwres/include/lwres/ipv6.h b/lib/lwres/include/lwres/ipv6.h new file mode 100644 index 0000000..8747605 --- /dev/null +++ b/lib/lwres/include/lwres/ipv6.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: ipv6.h,v 1.16 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_IPV6_H +#define LWRES_IPV6_H 1 + +/***** + ***** Module Info + *****/ + +/*! \file lwres/ipv6.h + * IPv6 definitions for systems which do not support IPv6. + */ + +/*** + *** Imports. + ***/ + +#include <inttypes.h> + +#include <lwres/platform.h> + +/*** + *** Types. + ***/ + +/*% in6_addr structure */ +struct in6_addr { + union { + uint8_t _S6_u8[16]; + uint16_t _S6_u16[8]; + uint32_t _S6_u32[4]; + } _S6_un; +}; +/*@{*/ +/*% IP v6 types */ +#define s6_addr _S6_un._S6_u8 +#define s6_addr8 _S6_un._S6_u8 +#define s6_addr16 _S6_un._S6_u16 +#define s6_addr32 _S6_un._S6_u32 +/*@}*/ + +#define IN6ADDR_ANY_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}} +#define IN6ADDR_LOOPBACK_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}} + +LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_any; +LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback; + +/*% used in getaddrinfo.c and getnameinfo.c */ +struct sockaddr_in6 { +#ifdef LWRES_PLATFORM_HAVESALEN + uint8_t sin6_len; + uint8_t sin6_family; +#else + uint16_t sin6_family; +#endif + uint16_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + uint32_t sin6_scope_id; +}; + +#ifdef LWRES_PLATFORM_HAVESALEN +#define SIN6_LEN 1 +#endif + +/*% in6_pktinfo structure */ +struct in6_pktinfo { + struct in6_addr ipi6_addr; /*%< src/dst IPv6 address */ + unsigned int ipi6_ifindex; /*%< send/recv interface index */ +}; + +/*! + * Unspecified IPv6 address + */ +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + (((a)->s6_addr32[0] == 0) && \ + ((a)->s6_addr32[1] == 0) && \ + ((a)->s6_addr32[2] == 0) && \ + ((a)->s6_addr32[3] == 0)) + +/* + * Loopback + */ +#define IN6_IS_ADDR_LOOPBACK(a) \ + (((a)->s6_addr32[0] == 0) && \ + ((a)->s6_addr32[1] == 0) && \ + ((a)->s6_addr32[2] == 0) && \ + ((a)->s6_addr32[3] == htonl(1))) + +/* + * IPv4 compatible + */ +#define IN6_IS_ADDR_V4COMPAT(a) \ + (((a)->s6_addr32[0] == 0) && \ + ((a)->s6_addr32[1] == 0) && \ + ((a)->s6_addr32[2] == 0) && \ + ((a)->s6_addr32[3] != 0) && \ + ((a)->s6_addr32[3] != htonl(1))) + +/* + * Mapped + */ +#define IN6_IS_ADDR_V4MAPPED(a) \ + (((a)->s6_addr32[0] == 0) && \ + ((a)->s6_addr32[1] == 0) && \ + ((a)->s6_addr32[2] == htonl(0x0000ffff))) + +#endif /* LWRES_IPV6_H */ diff --git a/lib/lwres/include/lwres/lang.h b/lib/lwres/include/lwres/lang.h new file mode 100644 index 0000000..7396b9a --- /dev/null +++ b/lib/lwres/include/lwres/lang.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: lang.h,v 1.13 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_LANG_H +#define LWRES_LANG_H 1 + +/*! \file lwres/lang.h */ + +#ifdef __cplusplus +#define LWRES_LANG_BEGINDECLS extern "C" { +#define LWRES_LANG_ENDDECLS } +#else +#define LWRES_LANG_BEGINDECLS +#define LWRES_LANG_ENDDECLS +#endif + +#endif /* LWRES_LANG_H */ diff --git a/lib/lwres/include/lwres/list.h b/lib/lwres/include/lwres/list.h new file mode 100644 index 0000000..f235c18 --- /dev/null +++ b/lib/lwres/include/lwres/list.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: list.h,v 1.14 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_LIST_H +#define LWRES_LIST_H 1 + +/*! \file lwres/list.h */ + +#define LWRES_LIST(type) struct { type *head, *tail; } +#define LWRES_LIST_INIT(list) \ + do { (list).head = NULL; (list).tail = NULL; } while (0) + +#define LWRES_LINK(type) struct { type *prev, *next; } +#define LWRES_LINK_INIT(elt, link) \ + do { \ + (elt)->link.prev = (void *)(-1); \ + (elt)->link.next = (void *)(-1); \ + } while (0) +#define LWRES_LINK_LINKED(elt, link) \ + ((void *)((elt)->link.prev) != (void *)(-1)) + +#define LWRES_LIST_HEAD(list) ((list).head) +#define LWRES_LIST_TAIL(list) ((list).tail) +#define LWRES_LIST_EMPTY(list) LWRES_TF((list).head == NULL) + +#define LWRES_LIST_PREPEND(list, elt, link) \ + do { \ + if ((list).head != NULL) \ + (list).head->link.prev = (elt); \ + else \ + (list).tail = (elt); \ + (elt)->link.prev = NULL; \ + (elt)->link.next = (list).head; \ + (list).head = (elt); \ + } while (0) + +#define LWRES_LIST_APPEND(list, elt, link) \ + do { \ + if ((list).tail != NULL) \ + (list).tail->link.next = (elt); \ + else \ + (list).head = (elt); \ + (elt)->link.prev = (list).tail; \ + (elt)->link.next = NULL; \ + (list).tail = (elt); \ + } while (0) + +#define LWRES_LIST_UNLINK(list, elt, link) \ + do { \ + if ((elt)->link.next != NULL) \ + (elt)->link.next->link.prev = (elt)->link.prev; \ + else \ + (list).tail = (elt)->link.prev; \ + if ((elt)->link.prev != NULL) \ + (elt)->link.prev->link.next = (elt)->link.next; \ + else \ + (list).head = (elt)->link.next; \ + (elt)->link.prev = (void *)(-1); \ + (elt)->link.next = (void *)(-1); \ + } while (0) + +#define LWRES_LIST_PREV(elt, link) ((elt)->link.prev) +#define LWRES_LIST_NEXT(elt, link) ((elt)->link.next) + +#define LWRES_LIST_INSERTBEFORE(list, before, elt, link) \ + do { \ + if ((before)->link.prev == NULL) \ + LWRES_LIST_PREPEND(list, elt, link); \ + else { \ + (elt)->link.prev = (before)->link.prev; \ + (before)->link.prev = (elt); \ + (elt)->link.prev->link.next = (elt); \ + (elt)->link.next = (before); \ + } \ + } while (0) + +#define LWRES_LIST_INSERTAFTER(list, after, elt, link) \ + do { \ + if ((after)->link.next == NULL) \ + LWRES_LIST_APPEND(list, elt, link); \ + else { \ + (elt)->link.next = (after)->link.next; \ + (after)->link.next = (elt); \ + (elt)->link.next->link.prev = (elt); \ + (elt)->link.prev = (after); \ + } \ + } while (0) + +#define LWRES_LIST_APPENDLIST(list1, list2, link) \ + do { \ + if (LWRES_LIST_EMPTY(list1)) \ + (list1) = (list2); \ + else if (!LWRES_LIST_EMPTY(list2)) { \ + (list1).tail->link.next = (list2).head; \ + (list2).head->link.prev = (list1).tail; \ + (list1).tail = (list2).tail; \ + } \ + (list2).head = NULL; \ + (list2).tail = NULL; \ + } while (0) + +#define LWRES_LIST_ENQUEUE(list, elt, link) LWRES_LIST_APPEND(list, elt, link) +#define LWRES_LIST_DEQUEUE(list, elt, link) LWRES_LIST_UNLINK(list, elt, link) + +#endif /* LWRES_LIST_H */ diff --git a/lib/lwres/include/lwres/lwbuffer.h b/lib/lwres/include/lwres/lwbuffer.h new file mode 100644 index 0000000..056a813 --- /dev/null +++ b/lib/lwres/include/lwres/lwbuffer.h @@ -0,0 +1,401 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: lwbuffer.h,v 1.22 2007/06/19 23:47:23 tbox Exp $ */ + + +/*! \file lwres/lwbuffer.h + * + * A buffer is a region of memory, together with a set of related subregions. + * Buffers are used for parsing and I/O operations. + * + * The 'used region' and the 'available' region are disjoint, and their + * union is the buffer's region. The used region extends from the beginning + * of the buffer region to the last used byte. The available region + * extends from one byte greater than the last used byte to the end of the + * buffer's region. The size of the used region can be changed using various + * buffer commands. Initially, the used region is empty. + * + * The used region is further subdivided into two disjoint regions: the + * 'consumed region' and the 'remaining region'. The union of these two + * regions is the used region. The consumed region extends from the beginning + * of the used region to the byte before the 'current' offset (if any). The + * 'remaining' region the current pointer to the end of the used + * region. The size of the consumed region can be changed using various + * buffer commands. Initially, the consumed region is empty. + * + * The 'active region' is an (optional) subregion of the remaining region. + * It extends from the current offset to an offset in the remaining region + * that is selected with lwres_buffer_setactive(). Initially, the active + * region is empty. If the current offset advances beyond the chosen offset, + * the active region will also be empty. + * + * \verbatim + * /----- used region -----\/-- available --\ + * +----------------------------------------+ + * | consumed | remaining | | + * +----------------------------------------+ + * a b c d e + * + * a == base of buffer. + * b == current pointer. Can be anywhere between a and d. + * c == active pointer. Meaningful between b and d. + * d == used pointer. + * e == length of buffer. + * + * a-e == entire (length) of buffer. + * a-d == used region. + * a-b == consumed region. + * b-d == remaining region. + * b-c == optional active region. + * \endverbatim + * + * The following invariants are maintained by all routines: + * + *\verbatim + * length > 0 + * + * base is a valid pointer to length bytes of memory + * + * 0 <= used <= length + * + * 0 <= current <= used + * + * 0 <= active <= used + * (although active < current implies empty active region) + *\endverbatim + * + * \li MP: + * Buffers have no synchronization. Clients must ensure exclusive + * access. + * + * \li Reliability: + * No anticipated impact. + * + * \li Resources: + * Memory: 1 pointer + 6 unsigned integers per buffer. + * + * \li Security: + * No anticipated impact. + * + * \li Standards: + * None. + */ + +#ifndef LWRES_LWBUFFER_H +#define LWRES_LWBUFFER_H 1 + +/*** + *** Imports + ***/ + +#include <inttypes.h> + +#include <lwres/lang.h> + +LWRES_LANG_BEGINDECLS + +/*** + *** Magic numbers + ***/ +#define LWRES_BUFFER_MAGIC 0x4275663fU /* Buf?. */ + +#define LWRES_BUFFER_VALID(b) ((b) != NULL && \ + (b)->magic == LWRES_BUFFER_MAGIC) + +/*! + * The following macros MUST be used only on valid buffers. It is the + * caller's responsibility to ensure this by using the LWRES_BUFFER_VALID + * check above, or by calling another lwres_buffer_*() function (rather than + * another macro.) + */ + +/*! + * Get the length of the used region of buffer "b" + */ +#define LWRES_BUFFER_USEDCOUNT(b) ((b)->used) + +/*! + * Get the length of the available region of buffer "b" + */ +#define LWRES_BUFFER_AVAILABLECOUNT(b) ((b)->length - (b)->used) + +#define LWRES_BUFFER_REMAINING(b) ((b)->used - (b)->current) + +/*! + * Note that the buffer structure is public. This is principally so buffer + * operations can be implemented using macros. Applications are strongly + * discouraged from directly manipulating the structure. + */ + +typedef struct lwres_buffer lwres_buffer_t; +/*! + * Buffer data structure + */ +struct lwres_buffer { + unsigned int magic; + unsigned char *base; + /* The following integers are byte offsets from 'base'. */ + unsigned int length; + unsigned int used; + unsigned int current; + unsigned int active; +}; + +/*** + *** Functions + ***/ + +void +lwres_buffer_init(lwres_buffer_t *b, void *base, unsigned int length); +/**< + * Make 'b' refer to the 'length'-byte region starting at base. + * + * Requires: + * + * 'length' > 0 + * + * 'base' is a pointer to a sequence of 'length' bytes. + * + */ + +void +lwres_buffer_invalidate(lwres_buffer_t *b); +/**< + * Make 'b' an invalid buffer. + * + * Requires: + * 'b' is a valid buffer. + * + * Ensures: + * If assertion checking is enabled, future attempts to use 'b' without + * calling lwres_buffer_init() on it will cause an assertion failure. + */ + +void +lwres_buffer_add(lwres_buffer_t *b, unsigned int n); +/**< + * Increase the 'used' region of 'b' by 'n' bytes. + * + * Requires: + * + * 'b' is a valid buffer + * + * used + n <= length + * + */ + +void +lwres_buffer_subtract(lwres_buffer_t *b, unsigned int n); +/**< + * Decrease the 'used' region of 'b' by 'n' bytes. + * + * Requires: + * + * 'b' is a valid buffer + * + * used >= n + * + */ + +void +lwres_buffer_clear(lwres_buffer_t *b); +/**< + * Make the used region empty. + * + * Requires: + * + * 'b' is a valid buffer + * + * Ensures: + * + * used = 0 + * + */ + + +void +lwres_buffer_first(lwres_buffer_t *b); +/**< + * Make the consumed region empty. + * + * Requires: + * + * 'b' is a valid buffer + * + * Ensures: + * + * current == 0 + * + */ + +void +lwres_buffer_forward(lwres_buffer_t *b, unsigned int n); +/**< + * Increase the 'consumed' region of 'b' by 'n' bytes. + * + * Requires: + * + * 'b' is a valid buffer + * + * current + n <= used + * + */ + +void +lwres_buffer_back(lwres_buffer_t *b, unsigned int n); +/**< + * Decrease the 'consumed' region of 'b' by 'n' bytes. + * + * Requires: + * + * 'b' is a valid buffer + * + * n <= current + * + */ + +uint8_t +lwres_buffer_getuint8(lwres_buffer_t *b); +/**< + * Read an unsigned 8-bit integer from 'b' and return it. + * + * Requires: + * + * 'b' is a valid buffer. + * + * The length of the available region of 'b' is at least 1. + * + * Ensures: + * + * The current pointer in 'b' is advanced by 1. + * + * Returns: + * + * A 8-bit unsigned integer. + */ + +void +lwres_buffer_putuint8(lwres_buffer_t *b, uint8_t val); +/**< + * Store an unsigned 8-bit integer from 'val' into 'b'. + * + * Requires: + * 'b' is a valid buffer. + * + * The length of the unused region of 'b' is at least 1. + * + * Ensures: + * The used pointer in 'b' is advanced by 1. + */ + +uint16_t +lwres_buffer_getuint16(lwres_buffer_t *b); +/**< + * Read an unsigned 16-bit integer in network byte order from 'b', convert + * it to host byte order, and return it. + * + * Requires: + * + * 'b' is a valid buffer. + * + * The length of the available region of 'b' is at least 2. + * + * Ensures: + * + * The current pointer in 'b' is advanced by 2. + * + * Returns: + * + * A 16-bit unsigned integer. + */ + +void +lwres_buffer_putuint16(lwres_buffer_t *b, uint16_t val); +/**< + * Store an unsigned 16-bit integer in host byte order from 'val' + * into 'b' in network byte order. + * + * Requires: + * 'b' is a valid buffer. + * + * The length of the unused region of 'b' is at least 2. + * + * Ensures: + * The used pointer in 'b' is advanced by 2. + */ + +uint32_t +lwres_buffer_getuint32(lwres_buffer_t *b); +/**< + * Read an unsigned 32-bit integer in network byte order from 'b', convert + * it to host byte order, and return it. + * + * Requires: + * + * 'b' is a valid buffer. + * + * The length of the available region of 'b' is at least 2. + * + * Ensures: + * + * The current pointer in 'b' is advanced by 2. + * + * Returns: + * + * A 32-bit unsigned integer. + */ + +void +lwres_buffer_putuint32(lwres_buffer_t *b, uint32_t val); +/**< + * Store an unsigned 32-bit integer in host byte order from 'val' + * into 'b' in network byte order. + * + * Requires: + * 'b' is a valid buffer. + * + * The length of the unused region of 'b' is at least 4. + * + * Ensures: + * The used pointer in 'b' is advanced by 4. + */ + +void +lwres_buffer_putmem(lwres_buffer_t *b, const unsigned char *base, + unsigned int length); +/**< + * Copy 'length' bytes of memory at 'base' into 'b'. + * + * Requires: + * 'b' is a valid buffer. + * + * 'base' points to 'length' bytes of valid memory. + * + */ + +void +lwres_buffer_getmem(lwres_buffer_t *b, unsigned char *base, + unsigned int length); +/**< + * Copy 'length' bytes of memory from 'b' into 'base'. + * + * Requires: + * 'b' is a valid buffer. + * + * 'base' points to at least 'length' bytes of valid memory. + * + * 'b' have at least 'length' bytes remaining. + */ + +LWRES_LANG_ENDDECLS + +#endif /* LWRES_LWBUFFER_H */ diff --git a/lib/lwres/include/lwres/lwpacket.h b/lib/lwres/include/lwres/lwpacket.h new file mode 100644 index 0000000..656a5cb --- /dev/null +++ b/lib/lwres/include/lwres/lwpacket.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: lwpacket.h,v 1.24 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_LWPACKET_H +#define LWRES_LWPACKET_H 1 + +#include <inttypes.h> + +#include <lwres/lang.h> +#include <lwres/lwbuffer.h> +#include <lwres/result.h> + +/*% lwres_lwpacket_t */ +typedef struct lwres_lwpacket lwres_lwpacket_t; + +/*% lwres_lwpacket structure */ +struct lwres_lwpacket { + /*! The overall packet length, including the + * entire packet header. + * This field is filled in by the + * \link lwres_gabn.c lwres_gabn_*()\endlink + * and \link lwres_gnba.c lwres_gnba_*()\endlink calls. + */ + uint32_t length; + /*! Specifies the header format. Currently, + * there is only one format, #LWRES_LWPACKETVERSION_0. + * This field is filled in by the + * \link lwres_gabn.c lwres_gabn_*()\endlink + * and \link lwres_gnba.c lwres_gnba_*()\endlink calls. + */ + uint16_t version; + /*! Specifies library-defined flags for this packet, such as + * whether the packet is a request or a reply. None of + * these are definable by the caller, but library-defined values + * can be set by the caller. For example, one bit in this field + * indicates if the packet is a request or a response. + * This field is filled in by + * the application wits the exception of the + * #LWRES_LWPACKETFLAG_RESPONSE bit, which is set by the library + * in the + * \link lwres_gabn.c lwres_gabn_*()\endlink + * and \link lwres_gnba.c lwres_gnba_*()\endlink calls. + */ + uint16_t pktflags; + /*! Set by the requestor and is returned in all replies. + * If two packets from the same source have the same serial + * number and are from the same source, they are assumed to + * be duplicates and the latter ones may be dropped. + * (The library does not do this by default on replies, but + * does so on requests.) + */ + uint32_t serial; + /*! Opcodes between 0x04000000 and 0xffffffff + * are application defined. Opcodes between + * 0x00000000 and 0x03ffffff are + * reserved for library use. + * This field is filled in by the + * \link lwres_gabn.c lwres_gabn_*()\endlink + * and \link lwres_gnba.c lwres_gnba_*()\endlink calls. + */ + uint32_t opcode; + /*! Only valid for results. + * Results between 0x04000000 and 0xffffffff are application + * defined. + * Results between 0x00000000 and 0x03ffffff are reserved for + * library use. + * (This is the same reserved range defined in <isc/resultclass.h>, + * so it + * would be trivial to map ISC_R_* result codes into packet result + * codes when appropriate.) + * This field is filled in by the + * \link lwres_gabn.c lwres_gabn_*()\endlink + * and \link lwres_gnba.c lwres_gnba_*()\endlink calls. + */ + uint32_t result; + /*! Set to the maximum buffer size that the receiver can + * handle on requests, and the size of the buffer needed to + * satisfy a request + * when the buffer is too large for replies. + * This field is supplied by the application. + */ + uint32_t recvlength; + /*! The packet level auth type used. + * Authtypes between 0x1000 and 0xffff are application defined. + * Authtypes + * between 0x0000 and 0x0fff are reserved for library use. + * This is currently + * unused and MUST be set to zero. + */ + uint16_t authtype; + /*! The length of the authentication data. + * See the specific + * authtypes for more information on what is contained + * in this field. This is currently unused, and + * MUST be set to zero. + */ + uint16_t authlength; +}; + +#define LWRES_LWPACKET_LENGTH (4 * 5 + 2 * 4) /*%< Overall length. */ + +#define LWRES_LWPACKETFLAG_RESPONSE 0x0001U /*%< If set, pkt is a response. */ + + +#define LWRES_LWPACKETVERSION_0 0 /*%< Header format. */ + +/*! \file lwres/lwpacket.h + * + * + * The remainder of the packet consists of two regions, one described by + * "authlen" and one of "length - authlen - sizeof(lwres_lwpacket_t)". + * + * That is: + * + * \code + * pkt header + * authlen bytes of auth information + * data bytes + * \endcode + * + * Currently defined opcodes: + * + *\li #LWRES_OPCODE_NOOP. Success is always returned, with the packet contents echoed. + * + *\li #LWRES_OPCODE_GETADDRSBYNAME. Return all known addresses for a given name. + * This may return NIS or /etc/hosts info as well as DNS + * information. Flags will be provided to indicate ip4/ip6 + * addresses are desired. + * + *\li #LWRES_OPCODE_GETNAMEBYADDR. Return the hostname for the given address. Once + * again, it will return data from multiple sources. + */ + +LWRES_LANG_BEGINDECLS + +/* XXXMLG document */ +lwres_result_t +lwres_lwpacket_renderheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt); + +lwres_result_t +lwres_lwpacket_parseheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt); + +LWRES_LANG_ENDDECLS + +#endif /* LWRES_LWPACKET_H */ diff --git a/lib/lwres/include/lwres/lwres.h b/lib/lwres/include/lwres/lwres.h new file mode 100644 index 0000000..81a0e02 --- /dev/null +++ b/lib/lwres/include/lwres/lwres.h @@ -0,0 +1,577 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: lwres.h,v 1.57 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_LWRES_H +#define LWRES_LWRES_H 1 + +#include <inttypes.h> +#include <stdio.h> + +#include <lwres/context.h> +#include <lwres/lang.h> +#include <lwres/list.h> +#include <lwres/lwpacket.h> +#include <lwres/platform.h> + +/*! \file lwres/lwres.h */ + +/*! + * Design notes: + * + * Each opcode has two structures and three functions which operate on each + * structure. For example, using the "no operation/ping" opcode as an + * example: + * + * <ul><li>lwres_nooprequest_t: + * + * lwres_nooprequest_render() takes a lwres_nooprequest_t and + * and renders it into wire format, storing the allocated + * buffer information in a passed-in buffer. When this buffer + * is no longer needed, it must be freed by + * lwres_context_freemem(). All other memory used by the + * caller must be freed manually, including the + * lwres_nooprequest_t passed in.<br /><br /> + * + * lwres_nooprequest_parse() takes a wire format message and + * breaks it out into a lwres_nooprequest_t. The structure + * must be freed via lwres_nooprequest_free() when it is no longer + * needed.<br /><br /> + * + * lwres_nooprequest_free() releases into the lwres_context_t + * any space allocated during parsing.</li> + * + * <li>lwres_noopresponse_t: + * + * The functions used are similar to the three used for + * requests, just with different names.</li></ul> + * + * Typically, the client will use request_render, response_parse, and + * response_free, while the daemon will use request_parse, response_render, + * and request_free. + * + * The basic flow of a typical client is: + * + * \li fill in a request_t, and call the render function. + * + * \li Transmit the buffer returned to the daemon. + * + * \li Wait for a response. + * + * \li When a response is received, parse it into a response_t. + * + * \li free the request buffer using lwres_context_freemem(). + * + * \li free the response structure and its associated buffer using + * response_free(). + */ + +#define LWRES_UDP_PORT 921 /*%< UDP Port Number */ +#define LWRES_RECVLENGTH 16384 /*%< Maximum Packet Length */ +#define LWRES_ADDR_MAXLEN 16 /*%< changing this breaks ABI */ +#define LWRES_RESOLV_CONF "/etc/resolv.conf" /*%< Location of resolv.conf */ + +/*% DNSSEC is not required (input). Only relevant to rrset queries. */ +#define LWRES_FLAG_TRUSTNOTREQUIRED 0x00000001U +/*% The data was crypto-verified with DNSSEC (output). */ +#define LWRES_FLAG_SECUREDATA 0x00000002U + +/*% no-op */ +#define LWRES_OPCODE_NOOP 0x00000000U + +/*% lwres_nooprequest_t */ +typedef struct { + /* public */ + uint16_t datalength; + unsigned char *data; +} lwres_nooprequest_t; + +/*% lwres_noopresponse_t */ +typedef struct { + /* public */ + uint16_t datalength; + unsigned char *data; +} lwres_noopresponse_t; + +/*% get addresses by name */ +#define LWRES_OPCODE_GETADDRSBYNAME 0x00010001U + +/*% lwres_addr_t */ +typedef struct lwres_addr lwres_addr_t; + +/*% LWRES_LIST */ +typedef LWRES_LIST(lwres_addr_t) lwres_addrlist_t; + +/*% lwres_addr */ +struct lwres_addr { + uint32_t family; + uint16_t length; + unsigned char address[LWRES_ADDR_MAXLEN]; + uint32_t zone; + LWRES_LINK(lwres_addr_t) link; +}; + +/*% lwres_gabnrequest_t */ +typedef struct { + /* public */ + uint32_t flags; + uint32_t addrtypes; + uint16_t namelen; + char *name; +} lwres_gabnrequest_t; + +/*% lwres_gabnresponse_t */ +typedef struct { + /* public */ + uint32_t flags; + uint16_t naliases; + uint16_t naddrs; + char *realname; + char **aliases; + uint16_t realnamelen; + uint16_t *aliaslen; + lwres_addrlist_t addrs; + /*! if base != NULL, it will be freed when this structure is freed. */ + void *base; + size_t baselen; +} lwres_gabnresponse_t; + +/*% get name by address */ +#define LWRES_OPCODE_GETNAMEBYADDR 0x00010002U + +/*% lwres_gnbarequest_t */ +typedef struct { + /* public */ + uint32_t flags; + lwres_addr_t addr; +} lwres_gnbarequest_t; + +/*% lwres_gnbaresponse_t */ +typedef struct { + /* public */ + uint32_t flags; + uint16_t naliases; + char *realname; + char **aliases; + uint16_t realnamelen; + uint16_t *aliaslen; + /*! if base != NULL, it will be freed when this structure is freed. */ + void *base; + size_t baselen; +} lwres_gnbaresponse_t; + +/*% get rdata by name */ +#define LWRES_OPCODE_GETRDATABYNAME 0x00010003U + +/*% lwres_grbnrequest_t */ +typedef struct { + /* public */ + uint32_t flags; + uint16_t rdclass; + uint16_t rdtype; + uint16_t namelen; + char *name; +} lwres_grbnrequest_t; + +/*% lwres_grbnresponse_t */ +typedef struct { + /* public */ + uint32_t flags; + uint16_t rdclass; + uint16_t rdtype; + uint32_t ttl; + uint16_t nrdatas; + uint16_t nsigs; + char *realname; + uint16_t realnamelen; + unsigned char **rdatas; + uint16_t *rdatalen; + unsigned char **sigs; + uint16_t *siglen; + /*% if base != NULL, it will be freed when this structure is freed. */ + void *base; + size_t baselen; +} lwres_grbnresponse_t; + +/*% Used by lwres_getrrsetbyname() */ +#define LWRDATA_VALIDATED 0x00000001 + +/*! + * resolv.conf data + */ + +#define LWRES_CONFMAXNAMESERVERS 3 /*%< max 3 "nameserver" entries */ +#define LWRES_CONFMAXLWSERVERS 1 /*%< max 1 "lwserver" entry */ +#define LWRES_CONFMAXSEARCH 8 /*%< max 8 domains in "search" entry */ +#define LWRES_CONFMAXLINELEN 256 /*%< max size of a line */ +#define LWRES_CONFMAXSORTLIST 10 /*%< max 10 */ + +/*% lwres_conf_t */ +typedef struct { + lwres_context_t *lwctx; + lwres_addr_t nameservers[LWRES_CONFMAXNAMESERVERS]; + uint8_t nsnext; /*%< index for next free slot */ + + lwres_addr_t lwservers[LWRES_CONFMAXLWSERVERS]; + uint8_t lwnext; /*%< index for next free slot */ + + char *domainname; + + char *search[LWRES_CONFMAXSEARCH]; + uint8_t searchnxt; /*%< index for next free slot */ + + struct { + lwres_addr_t addr; + /*% mask has a non-zero 'family' and 'length' if set */ + lwres_addr_t mask; + } sortlist[LWRES_CONFMAXSORTLIST]; + uint8_t sortlistnxt; + + uint8_t resdebug; /*%< non-zero if 'options debug' set */ + uint8_t ndots; /*%< set to n in 'options ndots:n' */ + uint8_t no_tld_query; /*%< non-zero if 'options no_tld_query' */ + int32_t attempts; /*%< set to n in 'options attempts:n' */ + int32_t timeout; /*%< set to n in 'options timeout:n' */ +} lwres_conf_t; + +#define LWRES_ADDRTYPE_V4 0x00000001U /*%< ipv4 */ +#define LWRES_ADDRTYPE_V6 0x00000002U /*%< ipv6 */ + +#define LWRES_MAX_ALIASES 16 /*%< max # of aliases */ +#define LWRES_MAX_ADDRS 64 /*%< max # of addrs */ + +LWRES_LANG_BEGINDECLS + +/*% This is in host byte order. */ +LIBLWRES_EXTERNAL_DATA extern uint16_t lwres_udp_port; + +LIBLWRES_EXTERNAL_DATA extern const char *lwres_resolv_conf; + +lwres_result_t +lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, lwres_gabnrequest_t **structp); + +lwres_result_t +lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, + lwres_gabnresponse_t **structp); + +void +lwres_gabnrequest_free(lwres_context_t *ctx, lwres_gabnrequest_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +void +lwres_gabnresponse_free(lwres_context_t *ctx, lwres_gabnresponse_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + + +lwres_result_t +lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, lwres_gnbarequest_t **structp); + +lwres_result_t +lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, + lwres_gnbaresponse_t **structp); + +void +lwres_gnbarequest_free(lwres_context_t *ctx, lwres_gnbarequest_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +void +lwres_gnbaresponse_free(lwres_context_t *ctx, lwres_gnbaresponse_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +lwres_result_t +lwres_grbnrequest_render(lwres_context_t *ctx, lwres_grbnrequest_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_grbnresponse_render(lwres_context_t *ctx, lwres_grbnresponse_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_grbnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, lwres_grbnrequest_t **structp); + +lwres_result_t +lwres_grbnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, + lwres_grbnresponse_t **structp); + +void +lwres_grbnrequest_free(lwres_context_t *ctx, lwres_grbnrequest_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +void +lwres_grbnresponse_free(lwres_context_t *ctx, lwres_grbnresponse_t **structp); +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +lwres_result_t +lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); +/**< + * Allocate space and render into wire format a noop request packet. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * b != NULL, and points to a lwres_buffer_t. The contents of the + * buffer structure will be initialized to contain the wire-format + * noop request packet. + * + * Caller needs to fill in parts of "pkt" before calling: + * serial, maxrecv, result. + * + * Returns: + * + * Returns 0 on success, non-zero on failure. + * + * On successful return, *b will contain data about the wire-format + * packet. It can be transmitted in any way, including lwres_sendblock(). + */ + +lwres_result_t +lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req, + lwres_lwpacket_t *pkt, lwres_buffer_t *b); + +lwres_result_t +lwres_nooprequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, lwres_nooprequest_t **structp); +/**< + * Parse a noop request. Note that to get here, the lwpacket must have + * already been parsed and removed by the caller, otherwise it would be + * pretty hard for it to know this is the right function to call. + * + * The function verifies bits of the header, but does not modify it. + */ + +lwres_result_t +lwres_noopresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, + lwres_lwpacket_t *pkt, + lwres_noopresponse_t **structp); + +void +lwres_nooprequest_free(lwres_context_t *ctx, lwres_nooprequest_t **structp); + +void +lwres_noopresponse_free(lwres_context_t *ctx, lwres_noopresponse_t **structp); + +/**< + * Frees any dynamically allocated memory for this structure. + * + * Requires: + * + * ctx != NULL, and be a context returned via lwres_context_create(). + * + * structp != NULL && *structp != NULL. + * + * Ensures: + * + * *structp == NULL. + * + * All memory allocated by this structure will be returned to the + * system via the context's free function. + */ + +lwres_result_t +lwres_conf_parse(lwres_context_t *ctx, const char *filename); +/**< + * parses a resolv.conf-format file and stores the results in the structure + * pointed to by *ctx. + * + * Requires: + * ctx != NULL + * filename != NULL && strlen(filename) > 0 + * + * Returns: + * LWRES_R_SUCCESS on a successful parse. + * Anything else on error, although the structure may be partially filled + * in. + */ + +lwres_result_t +lwres_conf_print(lwres_context_t *ctx, FILE *fp); +/**< + * Prints a resolv.conf-format of confdata output to fp. + * + * Requires: + * ctx != NULL + */ + +void +lwres_conf_init(lwres_context_t *ctx); +/**< + * sets all internal fields to a default state. Used to initialize a new + * lwres_conf_t structure (not reset a used on). + * + * Requires: + * ctx != NULL + */ + +void +lwres_conf_clear(lwres_context_t *ctx); +/**< + * frees all internally allocated memory in confdata. Uses the memory + * routines supplied by ctx. + * + * Requires: + * ctx != NULL + */ + +lwres_conf_t * +lwres_conf_get(lwres_context_t *ctx); +/**< + * Be extremely cautions in modifying the contents of this structure; it + * needs an API to return the various bits of data, walk lists, etc. + * + * Requires: + * ctx != NULL + */ + +/* + * Helper functions + */ + +lwres_result_t +lwres_data_parse(lwres_buffer_t *b, unsigned char **p, uint16_t *len); + +lwres_result_t +lwres_string_parse(lwres_buffer_t *b, char **c, 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, + uint32_t addrtypes, lwres_gabnresponse_t **structp); + +lwres_result_t +lwres_getnamebyaddr(lwres_context_t *ctx, uint32_t addrtype, + uint16_t addrlen, const unsigned char *addr, + lwres_gnbaresponse_t **structp); + +lwres_result_t +lwres_getrdatabyname(lwres_context_t *ctx, const char *name, + uint16_t rdclass, uint16_t rdtype, + uint32_t flags, lwres_grbnresponse_t **structp); + +LWRES_LANG_ENDDECLS + +#endif /* LWRES_LWRES_H */ diff --git a/lib/lwres/include/lwres/netdb.h.in b/lib/lwres/include/lwres/netdb.h.in new file mode 100644 index 0000000..8e65bc8 --- /dev/null +++ b/lib/lwres/include/lwres/netdb.h.in @@ -0,0 +1,516 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: netdb.h.in,v 1.41 2009/01/18 23:48:14 tbox Exp $ */ + +/*! \file */ + +#ifndef LWRES_NETDB_H +#define LWRES_NETDB_H 1 + +#include <stddef.h> /* Required on FreeBSD (and others?) for size_t. */ +#include <netdb.h> /* Contractual provision. */ + +#include <lwres/lang.h> + +/* + * Define if <netdb.h> does not declare struct addrinfo. + */ +@ISC_LWRES_NEEDADDRINFO@ + +#ifdef ISC_LWRES_NEEDADDRINFO +struct addrinfo { + int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ + int ai_family; /* PF_xxx */ + int ai_socktype; /* SOCK_xxx */ + int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ + size_t ai_addrlen; /* Length of ai_addr */ + char *ai_canonname; /* Canonical name for hostname */ + struct sockaddr *ai_addr; /* Binary address */ + struct addrinfo *ai_next; /* Next structure in linked list */ +}; +#endif + +/* + * Undefine all #defines we are interested in as <netdb.h> may or may not have + * defined them. + */ + +/* + * Error return codes from gethostbyname() and gethostbyaddr() + * (left in extern int h_errno). + */ + +#undef NETDB_INTERNAL +#undef NETDB_SUCCESS +#undef HOST_NOT_FOUND +#undef TRY_AGAIN +#undef NO_RECOVERY +#undef NO_DATA +#undef NO_ADDRESS + +#define NETDB_INTERNAL -1 /* see errno */ +#define NETDB_SUCCESS 0 /* no problem */ +#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ +#define TRY_AGAIN 2 /* Non-Authoritative Host not found, or SERVERFAIL */ +#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ +#define NO_DATA 4 /* Valid name, no data record of requested type */ +#define NO_ADDRESS NO_DATA /* no address, look for MX record */ + +/* + * Error return codes from getaddrinfo() + */ + +#undef EAI_ADDRFAMILY +#undef EAI_AGAIN +#undef EAI_BADFLAGS +#undef EAI_FAIL +#undef EAI_FAMILY +#undef EAI_MEMORY +#undef EAI_NODATA +#undef EAI_NONAME +#undef EAI_SERVICE +#undef EAI_SOCKTYPE +#undef EAI_SYSTEM +#undef EAI_BADHINTS +#undef EAI_PROTOCOL +#undef EAI_OVERFLOW +#undef EAI_MAX + +#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ +#define EAI_AGAIN 2 /* temporary failure in name resolution */ +#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ +#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ +#define EAI_FAMILY 5 /* ai_family not supported */ +#define EAI_MEMORY 6 /* memory allocation failure */ +#define EAI_NODATA 7 /* no address associated with hostname */ +#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ +#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ +#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ +#define EAI_SYSTEM 11 /* system error returned in errno */ +#define EAI_BADHINTS 12 +#define EAI_PROTOCOL 13 +#define EAI_OVERFLOW 14 +#define EAI_MAX 15 + +/* + * Flag values for getaddrinfo() + */ +#undef AI_PASSIVE +#undef AI_CANONNAME +#undef AI_NUMERICHOST + +#define AI_PASSIVE 0x00000001 +#define AI_CANONNAME 0x00000002 +#define AI_NUMERICHOST 0x00000004 + +/* + * Flag values for getipnodebyname() + */ +#undef AI_V4MAPPED +#undef AI_ALL +#undef AI_ADDRCONFIG +#undef AI_DEFAULT + +#define AI_V4MAPPED 0x00000008 +#define AI_ALL 0x00000010 +#define AI_ADDRCONFIG 0x00000020 +#define AI_DEFAULT (AI_V4MAPPED|AI_ADDRCONFIG) + +/* + * Constants for lwres_getnameinfo() + */ +#undef NI_MAXHOST +#undef NI_MAXSERV + +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 + +/* + * Flag values for lwres_getnameinfo() + */ +#undef NI_NOFQDN +#undef NI_NUMERICHOST +#undef NI_NAMEREQD +#undef NI_NUMERICSERV +#undef NI_DGRAM +#undef NI_NUMERICSCOPE + +#define NI_NOFQDN 0x00000001 +#define NI_NUMERICHOST 0x00000002 +#define NI_NAMEREQD 0x00000004 +#define NI_NUMERICSERV 0x00000008 +#define NI_DGRAM 0x00000010 +#define NI_NUMERICSCOPE 0x00000020 /*2553bis-00*/ + +/* + * Define if <netdb.h> does not declare struct rrsetinfo. + */ +@ISC_LWRES_NEEDRRSETINFO@ + +#ifdef ISC_LWRES_NEEDRRSETINFO +/* + * Structures for getrrsetbyname() + */ +struct rdatainfo { + unsigned int rdi_length; + unsigned char *rdi_data; +}; + +struct rrsetinfo { + unsigned int rri_flags; + int rri_rdclass; + int rri_rdtype; + unsigned int rri_ttl; + unsigned int rri_nrdatas; + unsigned int rri_nsigs; + char *rri_name; + struct rdatainfo *rri_rdatas; + struct rdatainfo *rri_sigs; +}; + +/* + * Flags for getrrsetbyname() + */ +#define RRSET_VALIDATED 0x00000001 + /* Set was dnssec validated */ + +/* + * Return codes for getrrsetbyname() + */ +#define ERRSET_SUCCESS 0 +#define ERRSET_NOMEMORY 1 +#define ERRSET_FAIL 2 +#define ERRSET_INVAL 3 +#define ERRSET_NONAME 4 +#define ERRSET_NODATA 5 +#endif + +/* + * Define to map into lwres_ namespace. + */ + +#define LWRES_NAMESPACE + +#ifdef LWRES_NAMESPACE + +/* + * Use our versions not the ones from the C library. + */ + +#ifdef getnameinfo +#undef getnameinfo +#endif +#define getnameinfo lwres_getnameinfo + +#ifdef getaddrinfo +#undef getaddrinfo +#endif +#define getaddrinfo lwres_getaddrinfo + +#ifdef freeaddrinfo +#undef freeaddrinfo +#endif +#define freeaddrinfo lwres_freeaddrinfo + +#ifdef gai_strerror +#undef gai_strerror +#endif +#define gai_strerror lwres_gai_strerror + +#ifdef herror +#undef herror +#endif +#define herror lwres_herror + +#ifdef hstrerror +#undef hstrerror +#endif +#define hstrerror lwres_hstrerror + +#ifdef getipnodebyname +#undef getipnodebyname +#endif +#define getipnodebyname lwres_getipnodebyname + +#ifdef getipnodebyaddr +#undef getipnodebyaddr +#endif +#define getipnodebyaddr lwres_getipnodebyaddr + +#ifdef freehostent +#undef freehostent +#endif +#define freehostent lwres_freehostent + +#ifdef gethostbyname +#undef gethostbyname +#endif +#define gethostbyname lwres_gethostbyname + +#ifdef gethostbyname2 +#undef gethostbyname2 +#endif +#define gethostbyname2 lwres_gethostbyname2 + +#ifdef gethostbyaddr +#undef gethostbyaddr +#endif +#define gethostbyaddr lwres_gethostbyaddr + +#ifdef gethostent +#undef gethostent +#endif +#define gethostent lwres_gethostent + +#ifdef sethostent +#undef sethostent +#endif +#define sethostent lwres_sethostent + +#ifdef endhostent +#undef endhostent +#endif +#define endhostent lwres_endhostent + +/* #define sethostfile lwres_sethostfile */ + +#ifdef gethostbyname_r +#undef gethostbyname_r +#endif +#define gethostbyname_r lwres_gethostbyname_r + +#ifdef gethostbyaddr_r +#undef gethostbyaddr_r +#endif +#define gethostbyaddr_r lwres_gethostbyaddr_r + +#ifdef gethostent_r +#undef gethostent_r +#endif +#define gethostent_r lwres_gethostent_r + +#ifdef sethostent_r +#undef sethostent_r +#endif +#define sethostent_r lwres_sethostent_r + +#ifdef endhostent_r +#undef endhostent_r +#endif +#define endhostent_r lwres_endhostent_r + +#ifdef getrrsetbyname +#undef getrrsetbyname +#endif +#define getrrsetbyname lwres_getrrsetbyname + +#ifdef freerrset +#undef freerrset +#endif +#define freerrset lwres_freerrset + +#ifdef notyet +#define getservbyname lwres_getservbyname +#define getservbyport lwres_getservbyport +#define getservent lwres_getservent +#define setservent lwres_setservent +#define endservent lwres_endservent + +#define getservbyname_r lwres_getservbyname_r +#define getservbyport_r lwres_getservbyport_r +#define getservent_r lwres_getservent_r +#define setservent_r lwres_setservent_r +#define endservent_r lwres_endservent_r + +#define getprotobyname lwres_getprotobyname +#define getprotobynumber lwres_getprotobynumber +#define getprotoent lwres_getprotoent +#define setprotoent lwres_setprotoent +#define endprotoent lwres_endprotoent + +#define getprotobyname_r lwres_getprotobyname_r +#define getprotobynumber_r lwres_getprotobynumber_r +#define getprotoent_r lwres_getprotoent_r +#define setprotoent_r lwres_setprotoent_r +#define endprotoent_r lwres_endprotoent_r + +#ifdef getnetbyname +#undef getnetbyname +#endif +#define getnetbyname lwres_getnetbyname + +#ifdef getnetbyaddr +#undef getnetbyaddr +#endif +#define getnetbyaddr lwres_getnetbyaddr + +#ifdef getnetent +#undef getnetent +#endif +#define getnetent lwres_getnetent + +#ifdef setnetent +#undef setnetent +#endif +#define setnetent lwres_setnetent + +#ifdef endnetent +#undef endnetent +#endif +#define endnetent lwres_endnetent + + +#ifdef getnetbyname_r +#undef getnetbyname_r +#endif +#define getnetbyname_r lwres_getnetbyname_r + +#ifdef getnetbyaddr_r +#undef getnetbyaddr_r +#endif +#define getnetbyaddr_r lwres_getnetbyaddr_r + +#ifdef getnetent_r +#undef getnetent_r +#endif +#define getnetent_r lwres_getnetent_r + +#ifdef setnetent_r +#undef setnetent_r +#endif +#define setnetent_r lwres_setnetent_r + +#ifdef endnetent_r +#undef endnetent_r +#endif +#define endnetent_r lwres_endnetent_r +#endif /* notyet */ + +#ifdef h_errno +#undef h_errno +#endif +#define h_errno lwres_h_errno + +#endif /* LWRES_NAMESPACE */ + +LWRES_LANG_BEGINDECLS + +extern int lwres_h_errno; + +int lwres_getaddrinfo(const char *, const char *, + const struct addrinfo *, struct addrinfo **); +int lwres_getnameinfo(const struct sockaddr *, size_t, char *, + size_t, char *, size_t, int); +void lwres_freeaddrinfo(struct addrinfo *); +char *lwres_gai_strerror(int); + +struct hostent *lwres_gethostbyaddr(const char *, int, int); +struct hostent *lwres_gethostbyname(const char *); +struct hostent *lwres_gethostbyname2(const char *, int); +struct hostent *lwres_gethostent(void); +struct hostent *lwres_getipnodebyname(const char *, int, int, int *); +struct hostent *lwres_getipnodebyaddr(const void *, size_t, int, int *); +void lwres_endhostent(void); +void lwres_sethostent(int); +/* void lwres_sethostfile(const char *); */ +void lwres_freehostent(struct hostent *); + +int lwres_getrrsetbyname(const char *, unsigned int, unsigned int, + unsigned int, struct rrsetinfo **); +void lwres_freerrset(struct rrsetinfo *); + +#ifdef notyet +struct netent *lwres_getnetbyaddr(unsigned long, int); +struct netent *lwres_getnetbyname(const char *); +struct netent *lwres_getnetent(void); +void lwres_endnetent(void); +void lwres_setnetent(int); + +struct protoent *lwres_getprotobyname(const char *); +struct protoent *lwres_getprotobynumber(int); +struct protoent *lwres_getprotoent(void); +void lwres_endprotoent(void); +void lwres_setprotoent(int); + +struct servent *lwres_getservbyname(const char *, const char *); +struct servent *lwres_getservbyport(int, const char *); +struct servent *lwres_getservent(void); +void lwres_endservent(void); +void lwres_setservent(int); +#endif /* notyet */ + +void lwres_herror(const char *); +const char *lwres_hstrerror(int); + + +struct hostent *lwres_gethostbyaddr_r(const char *, int, int, struct hostent *, + char *, int, int *); +struct hostent *lwres_gethostbyname_r(const char *, struct hostent *, + char *, int, int *); +struct hostent *lwres_gethostent_r(struct hostent *, char *, int, int *); +void lwres_sethostent_r(int); +void lwres_endhostent_r(void); + +#ifdef notyet +struct netent *lwres_getnetbyname_r(const char *, struct netent *, + char *, int); +struct netent *lwres_getnetbyaddr_r(long, int, struct netent *, + char *, int); +struct netent *lwres_getnetent_r(struct netent *, char *, int); +void lwres_setnetent_r(int); +void lwres_endnetent_r(void); + +struct protoent *lwres_getprotobyname_r(const char *, + struct protoent *, char *, int); +struct protoent *lwres_getprotobynumber_r(int, + struct protoent *, char *, int); +struct protoent *lwres_getprotoent_r(struct protoent *, char *, int); +void lwres_setprotoent_r(int); +void lwres_endprotoent_r(void); + +struct servent *lwres_getservbyname_r(const char *name, const char *, + struct servent *, char *, int); +struct servent *lwres_getservbyport_r(int port, const char *, + struct servent *, char *, int); +struct servent *lwres_getservent_r(struct servent *, char *, int); +void lwres_setservent_r(int); +void lwres_endservent_r(void); +#endif /* notyet */ + +LWRES_LANG_ENDDECLS + +#ifdef notyet +/* This is nec'y to make this include file properly replace the sun version. */ +#ifdef sun +#ifdef __GNU_LIBRARY__ +#include <rpc/netdb.h> /* Required. */ +#else /* !__GNU_LIBRARY__ */ +struct rpcent { + char *r_name; /* name of server for this rpc program */ + char **r_aliases; /* alias list */ + int r_number; /* rpc program number */ +}; +struct rpcent *lwres_getrpcbyname(); +struct rpcent *lwres_getrpcbynumber(), +struct rpcent *lwres_getrpcent(); +#endif /* __GNU_LIBRARY__ */ +#endif /* sun */ +#endif /* notyet */ + +/* + * Tell Emacs to use C mode on this file. + * Local variables: + * mode: c + * End: + */ + +#endif /* LWRES_NETDB_H */ diff --git a/lib/lwres/include/lwres/platform.h.in b/lib/lwres/include/lwres/platform.h.in new file mode 100644 index 0000000..52c7192 --- /dev/null +++ b/lib/lwres/include/lwres/platform.h.in @@ -0,0 +1,114 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: platform.h.in,v 1.21 2007/06/19 23:47:23 tbox Exp $ */ + +/*! \file */ + +#ifndef LWRES_PLATFORM_H +#define LWRES_PLATFORM_H 1 + +/***** + ***** Platform-dependent defines. + *****/ + +/*** + *** Network. + ***/ + +/* + * Define if this system needs the <netinet/in6.h> header file for IPv6. + */ +@LWRES_PLATFORM_NEEDNETINETIN6H@ + +/* + * Define if this system needs the <netinet6/in6.h> header file for IPv6. + */ +@LWRES_PLATFORM_NEEDNETINET6IN6H@ + +/* + * If sockaddrs on this system have an sa_len field, LWRES_PLATFORM_HAVESALEN + * will be defined. + */ +@LWRES_PLATFORM_HAVESALEN@ + +/* + * If this system has the IPv6 structure definitions, LWRES_PLATFORM_HAVEIPV6 + * will be defined. + */ +@LWRES_PLATFORM_HAVEIPV6@ + +/* + * If this system is missing in6addr_any, LWRES_PLATFORM_NEEDIN6ADDRANY will + * be defined. + */ +@LWRES_PLATFORM_NEEDIN6ADDRANY@ + +/* + * If this system is missing in6addr_loopback, + * LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK will be defined. + */ +@LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK@ + +/* + * If this system has in_addr6, rather than in6_addr, + * LWRES_PLATFORM_HAVEINADDR6 will be defined. + */ +@LWRES_PLATFORM_HAVEINADDR6@ + +/* + * Defined if unistd.h does not cause fd_set to be delared. + */ +@LWRES_PLATFORM_NEEDSYSSELECTH@ + +/* + * Used to control how extern data is linked; needed for Win32 platforms. + */ +@LWRES_PLATFORM_USEDECLSPEC@ + +/* + * Defined this system needs vsnprintf() and snprintf(). + */ +@LWRES_PLATFORM_NEEDVSNPRINTF@ + +/* + * If this system need a modern sprintf() that returns (int) not (char*). + */ +@LWRES_PLATFORM_NEEDSPRINTF@ + +/*! \brief + * Define if this system needs strtoul. + */ +@LWRES_PLATFORM_NEEDSTRTOUL@ + +/*! \brief + * Define if this system needs strlcpy. + */ +@LWRES_PLATFORM_NEEDSTRLCPY@ + +#ifndef LWRES_PLATFORM_USEDECLSPEC +#define LIBLWRES_EXTERNAL_DATA +#else +#ifdef LIBLWRES_EXPORTS +#define LIBLWRES_EXTERNAL_DATA __declspec(dllexport) +#else +#define LIBLWRES_EXTERNAL_DATA __declspec(dllimport) +#endif +#endif + +/* + * Tell Emacs to use C mode on this file. + * Local Variables: + * mode: c + * End: + */ + +#endif /* LWRES_PLATFORM_H */ diff --git a/lib/lwres/include/lwres/result.h b/lib/lwres/include/lwres/result.h new file mode 100644 index 0000000..7397a93 --- /dev/null +++ b/lib/lwres/include/lwres/result.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: result.h,v 1.21 2007/06/19 23:47:23 tbox Exp $ */ + +#ifndef LWRES_RESULT_H +#define LWRES_RESULT_H 1 + +/*! \file lwres/result.h */ + +typedef unsigned int lwres_result_t; + +#define LWRES_R_SUCCESS 0 +#define LWRES_R_NOMEMORY 1 +#define LWRES_R_TIMEOUT 2 +#define LWRES_R_NOTFOUND 3 +#define LWRES_R_UNEXPECTEDEND 4 /* unexpected end of input */ +#define LWRES_R_FAILURE 5 /* generic failure */ +#define LWRES_R_IOERROR 6 +#define LWRES_R_NOTIMPLEMENTED 7 +#define LWRES_R_UNEXPECTED 8 +#define LWRES_R_TRAILINGDATA 9 +#define LWRES_R_INCOMPLETE 10 +#define LWRES_R_RETRY 11 +#define LWRES_R_TYPENOTFOUND 12 +#define LWRES_R_TOOLARGE 13 + +#endif /* LWRES_RESULT_H */ diff --git a/lib/lwres/include/lwres/stdlib.h b/lib/lwres/include/lwres/stdlib.h new file mode 100644 index 0000000..856f954 --- /dev/null +++ b/lib/lwres/include/lwres/stdlib.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +#ifndef LWRES_STDLIB_H +#define LWRES_STDLIB_H 1 + +/*! \file lwres/stdlib.h */ + +#include <stdlib.h> + +#include <lwres/lang.h> +#include <lwres/platform.h> + +#ifdef LWRES_PLATFORM_NEEDSTRTOUL +#define strtoul lwres_strtoul +#endif + +LWRES_LANG_BEGINDECLS + +unsigned long lwres_strtoul(const char *, char **, int); + +LWRES_LANG_ENDDECLS + +#endif diff --git a/lib/lwres/include/lwres/string.h b/lib/lwres/include/lwres/string.h new file mode 100644 index 0000000..76d0747 --- /dev/null +++ b/lib/lwres/include/lwres/string.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +#ifndef LWRES_STRING_H +#define LWRES_STRING_H 1 + +/*! \file lwres/string.h */ + +#include <stdlib.h> + +#include <lwres/lang.h> +#include <lwres/platform.h> + +#ifdef LWRES_PLATFORM_NEEDSTRLCPY +#define strlcpy lwres_strlcpy +#endif + +LWRES_LANG_BEGINDECLS + +size_t lwres_strlcpy(char *dst, const char *src, size_t size); + +LWRES_LANG_ENDDECLS + +#endif diff --git a/lib/lwres/include/lwres/version.h b/lib/lwres/include/lwres/version.h new file mode 100644 index 0000000..802f403 --- /dev/null +++ b/lib/lwres/include/lwres/version.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/* $Id: version.h,v 1.9 2007/06/19 23:47:23 tbox Exp $ */ + +/*! \file lwres/version.h */ + +#include <lwres/platform.h> + +LIBLWRES_EXTERNAL_DATA extern const char lwres_version[]; + +LIBLWRES_EXTERNAL_DATA extern const unsigned int lwres_libinterface; +LIBLWRES_EXTERNAL_DATA extern const unsigned int lwres_librevision; +LIBLWRES_EXTERNAL_DATA extern const unsigned int lwres_libage; |