#ifndef CONFIG_H
#define CONFIG_H

#cmakedefine PACKAGE            "@PACKAGE@"
#cmakedefine PACKAGE_NAME       "@PACKAGE_NAME@"
#cmakedefine PACKAGE_VERSION    "@PACKAGE_VERSION@"
#cmakedefine PACKAGE_URL        "@PACKAGE_URL@"
#cmakedefine PACKAGE_BUGREPORT  "@PACKAGE_BUGREPORT@"

#cmakedefine PACKAGE_STRING     "@PACKAGE_STRING@"
#cmakedefine PACKAGE_TARNAME    "@PACKAGE_TARNAME@"

#cmakedefine HAVE_ASSERT_H      1
#cmakedefine HAVE_INTTYPES_H    1
#cmakedefine HAVE_LIMITS_H      1
#cmakedefine HAVE_SYS_LIMITS_H  1
#cmakedefine HAVE_STDARG_H      1
#cmakedefine HAVE_STDINT_H      1
#cmakedefine HAVE_STDIO_H       1
#cmakedefine HAVE_STDLIB_H      1
#cmakedefine HAVE_STRING_H      1
#cmakedefine HAVE_TIME_H        1
#cmakedefine HAVE_UNISTD_H	1

#cmakedefine HAVE_FCNTL_H	1

#cmakedefine HAVE_SIGNAL_H      1
#cmakedefine HAVE_SYS_POLL_H    1
#cmakedefine HAVE_POLL_H        1
#cmakedefine HAVE_RESOURCE_H    1
#cmakedefine HAVE_SYS_TYPES_H   1
#cmakedefine HAVE_SYS_STAT_H    1

#cmakedefine HAVE_ENDIAN_H      1
#cmakedefine HAVE_NETDB_H       1
#cmakedefine HAVE_ARPA_INET_H   1
#cmakedefine HAVE_NETINET_IN_H  1
#cmakedefine HAVE_NETINET_TCP_H 1
#cmakedefine HAVE_SYS_SELECT_H  1
#cmakedefine HAVE_SYS_SOCKET_H  1
#cmakedefine HAVE_SYS_SYSCTL_H  1
#cmakedefine HAVE_SYS_TIME_H    1
#cmakedefine HAVE_SYS_WAIT_H    1

#cmakedefine HAVE_WINDOWS_H     1
#cmakedefine HAVE_WINSOCK_H     1
#cmakedefine HAVE_WINSOCK2_H    1
#cmakedefine HAVE_WS2TCPIP_H    1
#cmakedefine GETDNS_ON_WINDOWS  1
#cmakedefine USE_WINSOCK	1

#cmakedefine HAVE_SSL           1
#cmakedefine USE_DANESSL	1

#cmakedefine HAVE_OPENSSL_SSL_H         1
#cmakedefine HAVE_OPENSSL_EVP_H         1
#cmakedefine HAVE_OPENSSL_ERR_H         1
#cmakedefine HAVE_OPENSSL_RAND_H        1
#cmakedefine HAVE_OPENSSL_CONF_H        1
#cmakedefine HAVE_OPENSSL_ENGINE_H      1
#cmakedefine HAVE_OPENSSL_BN_H          1
#cmakedefine HAVE_OPENSSL_DSA_H         1
#cmakedefine HAVE_OPENSSL_RSA_H         1
#cmakedefine HAVE_OPENSSL_PARAM_BUILD_H 1

#cmakedefine HAVE_DSA_SIG_SET0		1
#cmakedefine HAVE_DSA_SET0_PQG		1
#cmakedefine HAVE_DSA_SET0_KEY		1

#cmakedefine HAVE_RSA_SET0_KEY		1

#cmakedefine HAVE_EVP_MD5		1
#cmakedefine HAVE_EVP_SHA1		1
#cmakedefine HAVE_EVP_SHA224		1
#cmakedefine HAVE_EVP_SHA256		1
#cmakedefine HAVE_EVP_SHA384		1
#cmakedefine HAVE_EVP_SHA512		1

#cmakedefine HAVE_EVP_DSS1		1
#cmakedefine HAVE_EVP_DIGESTVERIFY	1

#cmakedefine HAVE_EVP_MD_CTX_NEW	1

#cmakedefine HAVE_HMAC_CTX_NEW		1

#cmakedefine HAVE_NETTLE_GET_SECP_256R1	1
#cmakedefine HAVE_NETTLE_GET_SECP_384R1	1

#cmakedefine HAVE_TLS_CLIENT_METHOD	1

#cmakedefine HAVE_OPENSSL_VERSION_NUM	1
#cmakedefine HAVE_OPENSSL_VERSION	1

#cmakedefine HAVE_SSL_CTX_DANE_ENABLE	1
#cmakedefine HAVE_SSL_CTX_SET_CIPHERSUITES	1
#cmakedefine HAVE_SSL_SET_CIPHERSUITES	1

#cmakedefine HAVE_OPENSSL_INIT_CRYPTO	1

#cmakedefine HAVE_OSSL_PARAM_BLD_NEW	1

#cmakedefine HAVE_SSL_DANE_ENABLE			1
#cmakedefine HAVE_DECL_SSL_CTX_SET1_CURVES_LIST		1
#cmakedefine HAVE_DECL_SSL_SET1_CURVES_LIST		1
#cmakedefine HAVE_DECL_SSL_SET_MIN_PROTO_VERSION	1
#cmakedefine HAVE_X509_GET_NOTAFTER			1
#cmakedefine HAVE_X509_GET0_NOTAFTER			1

#cmakedefine HAVE_PTHREAD               1
#cmakedefine HAVE_WINDOWS_THREADS       1

#cmakedefine RUNSTATEDIR                "@RUNSTATEDIR@"
#cmakedefine TRUST_ANCHOR_FILE          "@PATH_TRUST_ANCHOR_FILE@"
#cmakedefine GETDNS_FN_RESOLVCONF       "@PATH_RESOLVCONF@"
#cmakedefine GETDNS_FN_HOSTS            "@PATH_HOSTS@"

#cmakedefine DNSSEC_ROADBLOCK_AVOIDANCE         1
#cmakedefine HAVE_MDNS_SUPPORT			1
#cmakedefine STUB_NATIVE_DNSSEC                 1
#cmakedefine MAXIMUM_UPSTREAM_OPTION_SPACE      @MAXIMUM_UPSTREAM_OPTION_SPACE@
#cmakedefine EDNS_PADDING_OPCODE                @EDNS_PADDING_OPCODE@
#cmakedefine MAX_CNAME_REFERRALS                @MAX_CNAME_REFERRALS@
#cmakedefine DRAFT_RRTYPES                      @DRAFT_RRTYPES@
#cmakedefine EDNS_COOKIES			1
#cmakedefine EDNS_COOKIE_OPCODE                 @EDNS_COOKIE_OPCODE@
#cmakedefine EDNS_COOKIE_ROLLOVER_TIME          @EDNS_COOKIE_ROLLOVER_TIME@
#cmakedefine UDP_MAX_BACKOFF			@MAX_UDP_BACKOFF@

#cmakedefine HAVE_DECL_GETENTROPY       1
#cmakedefine HAVE_DECL_INET_PTON        1
#cmakedefine HAVE_DECL_INET_NTOP        1
#cmakedefine HAVE_WIN_DECL_INET_PTON    1
#cmakedefine HAVE_WIN_DECL_INET_NTOP    1
#cmakedefine HAVE_DECL_MKSTEMP          1
#cmakedefine HAVE_DECL_SIGEMPTYSET      1
#cmakedefine HAVE_DECL_SIGFILLSET       1
#cmakedefine HAVE_DECL_SIGADDSET        1
#cmakedefine HAVE_DECL_STRPTIME         1

#cmakedefine HAVE_DECL_TCP_FASTOPEN		1
#cmakedefine HAVE_DECL_TCP_FASTOPEN_CONNECT	1
#cmakedefine HAVE_DECL_MSG_FASTOPEN		1

#if defined(HAVE_DECL_INET_PTON) || defined(HAVE_WIN_DECL_INET_PTON)
#undef HAVE_DECL_INET_PTON
#define HAVE_DECL_INET_PTON 1
#endif
#if defined(HAVE_DECL_INET_NTOP) || defined(HAVE_WIN_DECL_INET_NTOP)
#undef HAVE_DECL_INET_NTOP
#define HAVE_DECL_INET_NTOP 1
#endif

#cmakedefine HAVE_FCNTL		        1
#cmakedefine HAVE_GETTIMEOFDAY		1
#cmakedefine HAVE_IOCTLSOCKET		1
#cmakedefine HAVE_SIGEMPTYSET           1
#cmakedefine HAVE_SIGFILLSET            1
#cmakedefine HAVE_SIGADDSET             1
#cmakedefine HAVE_STRPTIME              1

#cmakedefine HAVE_SIGSET_T              1
#cmakedefine HAVE__SIGSET_T             1

#cmakedefine HAVE_BSD_STDLIB_H		1
#cmakedefine HAVE_BSD_STRING_H		1

#cmakedefine HAVE_DECL_STRLCPY                  1
#cmakedefine HAVE_DECL_ARC4RANDOM               1
#cmakedefine HAVE_DECL_ARC4RANDOM_UNIFORM       1
#cmakedefine HAVE_BSD_DECL_STRLCPY              1
#cmakedefine HAVE_BSD_DECL_ARC4RANDOM           1
#cmakedefine HAVE_BSD_DECL_ARC4RANDOM_UNIFORM   1

#cmakedefine HAVE_STRLCPY               1
#cmakedefine HAVE_ARC4RANDOM            1
#cmakedefine HAVE_ARC4RANDOM_UNIFORM    1

#cmakedefine HAVE_LIBUNBOUND		1
#cmakedefine HAVE_UNBOUND_EVENT_H	1
#cmakedefine HAVE_UNBOUND_EVENT_API	1
#cmakedefine HAVE_UB_CTX_SET_STUB	1

#cmakedefine HAVE_LIBIDN		1
#cmakedefine HAVE_LIBIDN2		1

#cmakedefine HAVE_NETTLE		1
#cmakedefine HAVE_NETTLE_DSA_COMPAT_H	1
#cmakedefine HAVE_NETTLE_EDDSA_H	1

#cmakedefine HAVE_EVENT2_EVENT_H	1
#cmakedefine HAVE_EVENT_BASE_NEW	1
#cmakedefine HAVE_EVENT_BASE_FREE	1

#cmakedefine DEFAULT_EVENTLOOP          "@DEFAULT_EVENTLOOP@"
#cmakedefine USE_POLL_DEFAULT_EVENTLOOP 1

#cmakedefine STRPTIME_WORKS		1

#cmakedefine FD_SETSIZE			@FD_SETSIZE@

#cmakedefine REQ_DEBUG			1
#cmakedefine SCHED_DEBUG		1
#cmakedefine STUB_DEBUG			1
#cmakedefine DAEMON_DEBUG		1
#cmakedefine SEC_DEBUG			1
#cmakedefine SERVER_DEBUG		1
#cmakedefine ANCHOR_DEBUG		1
#cmakedefine KEEP_CONNECTIONS_OPEN_DEBUG  1

#cmakedefine USE_SHA1			1
#cmakedefine USE_SHA2			1
#cmakedefine USE_GOST			1
#cmakedefine USE_ECDSA			1
#cmakedefine USE_DSA			1
#cmakedefine USE_ED25519		1
#cmakedefine USE_ED448			1

#cmakedefine USE_OSX_TCP_FASTOPEN	1

#cmakedefine HAVE_DECL_TCP_USER_TIMEOUT	1

#cmakedefine HAVE_NEW_UV_TIMER_CB	1

#cmakedefine HAVE_TARGET_ENDIANNESS
#cmakedefine TARGET_IS_BIG_ENDIAN

#cmakedefine HAVE___FUNC__		1

#ifdef HAVE___FUNC__
#define __FUNC__ __func__
#else
#define __FUNC__ __FUNCTION__
#endif

#ifdef GETDNS_ON_WINDOWS
 /* On windows it is allowed to increase the FD_SETSIZE
  * (and nescessary to make our custom eventloop work)
  * See: https://support.microsoft.com/en-us/kb/111855
  */
# ifndef FD_SETSIZE
#  define FD_SETSIZE 1024
# endif

/* the version of the windows API enabled */
# ifndef WINVER
#  define WINVER 0x0600 // 0x0502
# endif
# ifndef _WIN32_WINNT
#  define _WIN32_WINNT 0x0600 // 0x0502
# endif
# ifdef HAVE_WS2TCPIP_H
#  include <ws2tcpip.h>
# endif

# ifdef _MSC_VER
#  if _MSC_VER >= 1800
#   define PRIsz "zu"
#  else
#   define PRIsz "Iu"
#  endif
#  include <BaseTsd.h>
   typedef SSIZE_T ssize_t;
# else
#  define PRIsz "Iu"
# endif

# ifdef HAVE_WINSOCK2_H
#  include <winsock2.h>
# endif

/* detect if we need to cast to unsigned int for FD_SET to avoid warnings */
# ifdef HAVE_WINSOCK2_H
#  define FD_SET_T (u_int)
# else
#  define FD_SET_T
# endif

 /* Windows wants us to use _strdup instead of strdup */
# ifndef strdup
#  define strdup _strdup
# endif

/* Windows doesn't have strcasecmp and strncasecmp. */
# define strcasecmp _stricmp
# define strncasecmp _strnicmp
#else
# define PRIsz "zu"
#endif

#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif

#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#ifdef HAVE_ASSERT_H
#include <assert.h>
#endif

#ifdef HAVE_STRING_H
#include <string.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif

#ifdef HAVE_BSD_STDLIB_H
#include <bsd/stdlib.h>
#endif

#ifdef HAVE_BSD_STRING_H
#include <bsd/string.h>
#endif

#if !defined(HAVE_STRLCPY) || !HAVE_DECL_STRLCPY || !defined(strlcpy)
size_t strlcpy(char *dst, const char *src, size_t siz);
#else
#ifndef __BSD_VISIBLE
#define __BSD_VISIBLE 1
#endif
#endif
#if !defined(HAVE_ARC4RANDOM) || !HAVE_DECL_ARC4RANDOM
uint32_t arc4random(void);
#endif
#if !defined(HAVE_ARC4RANDOM_UNIFORM) || !HAVE_DECL_ARC4RANDOM_UNIFORM
uint32_t arc4random_uniform(uint32_t upper_bound);
#endif
#ifndef HAVE_ARC4RANDOM
void explicit_bzero(void* buf, size_t len);
int getentropy(void* buf, size_t len);
void arc4random_buf(void* buf, size_t n);
void _ARC4_LOCK(void);
void _ARC4_UNLOCK(void);
#endif
#ifdef COMPAT_SHA512
#ifndef SHA512_DIGEST_LENGTH
#define SHA512_BLOCK_LENGTH             128
#define SHA512_DIGEST_LENGTH            64
#define SHA512_DIGEST_STRING_LENGTH     (SHA512_DIGEST_LENGTH * 2 + 1)
typedef struct _SHA512_CTX {
        uint64_t        state[8];
        uint64_t        bitcount[2];
        uint8_t buffer[SHA512_BLOCK_LENGTH];
} SHA512_CTX;
#endif /* SHA512_DIGEST_LENGTH */
void SHA512_Init(SHA512_CTX*);
void SHA512_Update(SHA512_CTX*, void*, size_t);
void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
unsigned char *SHA512(void* data, unsigned int data_len, unsigned char *digest);
#endif /* COMPAT_SHA512 */

#ifdef USE_WINSOCK
# ifndef  _CUSTOM_VSNPRINTF
#  define _CUSTOM_VSNPRINTF
static inline int _gldns_custom_vsnprintf(char *str, size_t size, const char *format, va_list ap)
{ int r = vsnprintf(str, size, format, ap); return r == -1 ? _vscprintf(format, ap) : r; }
#  define vsnprintf _gldns_custom_vsnprintf
# endif
#endif

#ifdef __cplusplus
}
#endif

/** Use on-board gldns */
#define USE_GLDNS 1
#ifdef HAVE_SSL
#  define GLDNS_BUILD_CONFIG_HAVE_SSL 1
#endif

#ifdef HAVE_STDARG_H
#include <stdarg.h>
#endif

#include <errno.h>

#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif

#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h>
#endif

#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif

#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif

#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif

#ifdef HAVE_SYS_LIMITS_H
#include <sys/limits.h>
#endif

#ifdef PATH_MAX
#define _GETDNS_PATH_MAX PATH_MAX
#else
#define _GETDNS_PATH_MAX 2048
#endif

#ifndef PRIu64
#define PRIu64 "llu"
#endif

#ifdef HAVE_ATTR_FORMAT
#  define ATTR_FORMAT(archetype, string_index, first_to_check) \
    __attribute__ ((format (archetype, string_index, first_to_check)))
#else /* !HAVE_ATTR_FORMAT */
#  define ATTR_FORMAT(archetype, string_index, first_to_check) /* empty */
#endif /* !HAVE_ATTR_FORMAT */

#if defined(DOXYGEN)
#  define ATTR_UNUSED(x)  x
#elif defined(__cplusplus)
#  define ATTR_UNUSED(x)
#elif defined(__GNUC__)
#  define ATTR_UNUSED(x)  x __attribute__((unused))
#else /* !HAVE_ATTR_UNUSED */
#  define ATTR_UNUSED(x)  x
#endif /* !HAVE_ATTR_UNUSED */

#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(HAVE_STRPTIME) || !defined(STRPTIME_WORKS)
#define strptime unbound_strptime
struct tm;
char *strptime(const char *s, const char *format, struct tm *tm);
#endif

#if !defined(HAVE_SIGSET_T) && defined(HAVE__SIGSET_T)
typedef _sigset_t sigset_t;
#endif
#if !defined(HAVE_SIGEMPTYSET)
#  define sigemptyset(pset)    (*(pset) = 0)
#endif
#if !defined(HAVE_SIGFILLSET)
#  define sigfillset(pset)     (*(pset) = (sigset_t)-1)
#endif
#if !defined(HAVE_SIGADDSET)
#  define sigaddset(pset, num) (*(pset) |= (1L<<(num)))
#endif

#ifdef HAVE_LIBUNBOUND
# include <unbound.h>
# ifdef HAVE_UNBOUND_EVENT_H
#  include <unbound-event.h>
# else
#  ifdef HAVE_UNBOUND_EVENT_API
#   ifndef _UB_EVENT_PRIMITIVES
#    define _UB_EVENT_PRIMITIVES
struct ub_event_base;
struct ub_ctx* ub_ctx_create_ub_event(struct ub_event_base* base);
typedef void (*ub_event_callback_t)(void*, int, void*, int, int, char*);
int ub_resolve_event(struct ub_ctx* ctx, const char* name, int rrtype,
        int rrclass, void* mydata, ub_event_callback_t callback, int* async_id);
#   endif
#  endif
# endif
#endif

#ifndef HAVE_DECL_INET_PTON
int inet_pton(int af, const char* src, void* dst);
#endif

#ifndef HAVE_DECL_INET_NTOP
const char *inet_ntop(int af, const void *src, char *dst, size_t size);
#endif

#ifndef HAVE_DECL_MKSTEMP
int mkstemp(char *template);
#endif

#ifndef HAVE_GETTIMEOFDAY
int gettimeofday(struct timeval* tv, void* tz);
#endif

#ifdef __cplusplus
}
#endif

#endif /* CONFIG_H */