/*
 * 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.
 */

/*
 * win32 configuration file
 * All definitions, declarations, macros and includes are
 * specific to the requirements of the Windows NT and Windows 2000
 * platforms
 */

/* Define to empty if the keyword does not work.  */
/* #undef const */

/* Define as __inline if that's what the C compiler calls it.  */
#define inline __inline

/* Define to `unsigned int/__int64' if <sys/types.h> doesn't define.  */
/* #undef size_t */

/*
 * ANSI C compliance enabled
 */
#define __STDC__ 1

/*
 * Silence compiler warnings about using strcpy and friends.
 */
#define _CRT_SECURE_NO_DEPRECATE 1

/*
 * Use 32 bit time.
 */
#ifndef _WIN64
#define _USE_32BIT_TIME_T 1
#endif

/*
 * Minimum version is Windows XP
 */
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#if _WIN32_WINNT < 0x0501
#error Minimum Target environment is Windows XP and Windows Server 2003
#endif
#ifndef NTDDI_VERSION
#define NTDDI_VERSION 0x05010100
#endif
#if NTDDI_VERSION < 0x05010100
#error Minimum Target environment is Windows XP SP1 and Windows Server 2003
#endif

/* Define if you have the ANSI C header files.  */
#define STDC_HEADERS 1

/* Define if you can safely include both <sys/time.h> and <time.h>.  */
#define TIME_WITH_SYS_TIME 1

/* define on DEC OSF to enable 4.4BSD style sa_len support */
/* #undef _SOCKADDR_LEN */

/* define if your system needs pthread_init() before using pthreads */
/* #undef NEED_PTHREAD_INIT */

/* define if your system has sigwait() */
/* #undef HAVE_SIGWAIT */

/* define on Solaris to get sigwait() to work using pthreads semantics */
/* #undef _POSIX_PTHREAD_SEMANTICS */

/* define if LinuxThreads is in use */
/* #undef HAVE_LINUXTHREADS */

/* define if catgets() is available */
/* #undef HAVE_CATGETS */

/* define if you have the NET_RT_IFLIST sysctl variable. */
#define HAVE_IFLIST_SYSCTL 1

/* define if you need to #define _XPG4_2 before including sys/socket.h */
/* #undef NEED_XPG4_2_BEFORE_SOCKET_H */

/* define if you need to #define _XOPEN_SOURCE_ENTENDED before including
 * sys/socket.h
 */
/* #undef NEED_XSE_BEFORE_SOCKET_H */

/* Define if you have the <fcntl.h> header file.  */
#define HAVE_FCNTL_H 1

/* Define if you have the <sys/sockio.h> header file.  */
#define HAVE_SYS_SOCKIO_H 1

/* Define if you have the <sys/time.h> header file.  */
#define HAVE_SYS_TIME_H 1

/* Define if you have the <unistd.h> header file.  */
#define HAVE_UNISTD_H 1

/* Define if you have the c_r library (-lc_r).  */
/* #undef HAVE_LIBC_R */

/* Define if you have the nsl library (-lnsl).  */
/* #undef HAVE_LIBNSL */

/* Define if you have the pthread library (-lpthread).  */
/* #undef HAVE_LIBPTHREAD */

/* Define if you have the socket library (-lsocket).  */
/* #undef HAVE_LIBSOCKET */

/* Define if you have h_errno */
#define HAVE_H_ERRNO

/* Define if you have RSA_generate_key(). */
#define HAVE_RSA_GENERATE_KEY

/* Define if you have DSA_generate_parameters(). */
#define HAVE_DSA_GENERATE_PARAMETERS

/* Define if you have DH_generate_parameters(). */
#define HAVE_DH_GENERATE_PARAMETERS

/* Define if you have getpassphrase in the C library. */
#define HAVE_GETPASSPHRASE

char *getpassphrase(const char *);

/*
 * Define to 1 if you want to use the DLZ "dlopen" driver
 * (which has the same name on windows even though it uses
 * LoadLibrary() instead of dlopen()).
 */
#define ISC_DLZ_DLOPEN 1

#define WANT_IPV6

#define S_IFMT   _S_IFMT         /* file type mask */
#define S_IFDIR  _S_IFDIR        /* directory */
#define S_IFCHR  _S_IFCHR        /* character special */
#define S_IFIFO  _S_IFIFO        /* pipe */
#define S_IFREG  _S_IFREG        /* regular */
#define S_IREAD  _S_IREAD        /* read permission, owner */
#define S_IWRITE _S_IWRITE       /* write permission, owner */
#define S_IEXEC  _S_IEXEC        /* execute/search permission, owner */

#define O_RDONLY        _O_RDONLY
#define O_WRONLY        _O_WRONLY
#define O_RDWR          _O_RDWR
#define O_APPEND        _O_APPEND
#define O_CREAT         _O_CREAT
#define O_TRUNC         _O_TRUNC
#define O_EXCL          _O_EXCL

/* open() under unix allows setting of read/write permissions
 * at the owner, group and other levels.  These don't exist in NT
 * We'll just map them all to the NT equivalent
 */

#define S_IRUSR _S_IREAD	/* Owner read permission */
#define S_IWUSR _S_IWRITE	/* Owner write permission */
#define S_IRGRP _S_IREAD	/* Group read permission */
#define S_IWGRP _S_IWRITE	/* Group write permission */
#define S_IROTH _S_IREAD	/* Other read permission */
#define S_IWOTH _S_IWRITE	/* Other write permission */


/*
 * WIN32 specials until some other way of dealing with these is decided.
 */

#if _MSC_VER < 1900
#define snprintf _snprintf
#endif
#if _MSC_VER <= 1400
#define vsnprintf _vsnprintf
#endif
#define strcasecmp  _stricmp
#define strncasecmp _strnicmp
#define strdup _strdup
#define sopen _sopen
#define isascii __isascii
#ifndef _WIN64
#define stat _stat
#define fstat _fstat
#else
#define stat _stat64
#define fstat _fstat64
#endif
#define fileno _fileno
#define unlink _unlink
#define chdir _chdir
#define mkdir _mkdir
#define rmdir _rmdir
#define getcwd _getcwd
#define utime _utime
#define utimbuf _utimbuf
#ifndef _WIN64
#define lseek _lseek
#else
#define lseek _lseeki64
#endif

/* #define EAFNOSUPPORT EINVAL */
#define chmod _chmod
#define getpid _getpid
#define getppid _getpid	/* WARNING!!! For now this gets the same pid */
#define random rand	/* Random number generator */
#define srandom srand	/* Random number generator seeding */
/* for the config file */
typedef unsigned int    uid_t;          /* user id */
typedef unsigned int    gid_t;          /* group id */
typedef long pid_t;			/* PID */
#ifndef _WIN64
typedef int ssize_t;
typedef long off_t;
#else
typedef __int64 ssize_t;
#ifndef _AFX
/* BINDInstall defines it with another type but doesn't use it */
typedef __int64 off_t;
#endif
#endif

/*
 * Set up the Version Information
 */
#include <versions.h>

/* We actually are using the CryptAPI and not a device */
#define PATH_RANDOMDEV		"CryptAPI"

#include <stddef.h>
#include <stdio.h>
#include <stdarg.h>

/*
 * Applications may need to get the configuration path
 */
#ifndef _USRDLL
#include <isc/ntpaths.h>
#endif

#define fdopen	_fdopen
#define read	_read
#define open	_open
#define close	_close
#define write	_write
#include <io.h>
#define isatty	_isatty

#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
#endif

/*
 * Make the number of available sockets large
 * The number of sockets needed can get large and memory's cheap
 * This must be defined before winsock2.h gets included as the
 * macro is used there.
 */

#ifndef FD_SETSIZE
#define FD_SETSIZE 16384
#endif
#include <windows.h>

/*
 * main() is hooked
 */
#define ISC_MAIN_HOOK 1

/*
 * Configure sensible arguments
 */
@CONFIGARGS@

/*
 * Define if libxml2 is present
 */
@HAVE_LIBXML2@

/** define if struct addrinfo exists */
#define HAVE_ADDRINFO

/** define if getaddrinfo() exists */
#define HAVE_GETADDRINFO

/** define if gai_strerror() exists */
#define HAVE_GAISTRERROR

/* return type of gai_strerror */
#define IRS_GAISTRERROR_RETURN_T char *

/* Define to the buffer length type used by getnameinfo(3). */
#define IRS_GETNAMEINFO_BUFLEN_T DWORD

/* Define to the flags type used by getnameinfo(3). */
#define IRS_GETNAMEINFO_FLAGS_T int

/* Define to the sockaddr length type used by getnameinfo(3). */
#define IRS_GETNAMEINFO_SOCKLEN_T socklen_t

/* Define to enable the "filter-aaaa-on-v4" and "filter-aaaa-on-v6" options.
   */
@ALLOW_FILTER_AAAA@

/* Define to enable "rrset-order fixed" syntax. */
@DNS_RDATASET_FIXED@

/* Define to 1 if you have the `EVP_sha256' function. */
@HAVE_EVP_SHA256@

/* Define to 1 if you have the `EVP_sha384' function. */
@HAVE_EVP_SHA384@

/* Define to 1 if you have the `EVP_sha512' function. */
@HAVE_EVP_SHA512@

/* Define if OpenSSL provides FIPS_mode() */
@HAVE_FIPS_MODE@

/* Define if OpenSSL includes DSA support */
@HAVE_OPENSSL_DSA@

/* Define if OpenSSL includes ECDSA support */
@HAVE_OPENSSL_ECDSA@

/* Define if OpenSSL includes Ed25519 support */
@HAVE_OPENSSL_ED25519@

/* Define if OpenSSL includes Ed448 support */
@HAVE_OPENSSL_ED448@

/* Define if your OpenSSL version supports GOST. */
@HAVE_OPENSSL_GOST@

/* Define if your PKCS11 provider supports ECDSA. */
@HAVE_PKCS11_ECDSA@

/* Define if your PKCS11 provider supports Ed25519. */
@HAVE_PKCS11_ED25519@

/* Define if your PKCS11 provider supports Ed448. */
@HAVE_PKCS11_ED448@

/* Define if your PKCS11 provider supports GOST. */
@HAVE_PKCS11_GOST@

/* Define if GOST private keys are encoded in ASN.1. */
@PREFER_GOSTASN1@

/* Define if your OpenSSL version supports EVP AES */
@HAVE_OPENSSL_EVP_AES@

/* Define if your OpenSSL version supports AES */
@HAVE_OPENSSL_AES@

/* HMAC_*() return ints */
@HMAC_RETURN_INT@

/* Use AES for Client Cookie generation */
@AES_CC@

/* Use HMAC-SHA1 for Client Cookie generation */
@HMAC_SHA1_CC@

/* Use HMAC-SHA256 for Client Cookie generation */
@HMAC_SHA256_CC@

/* Define to 1 if you have the `readline' function. */
@HAVE_READLINE@

/* Build with GeoIP support */
@HAVE_GEOIP@

/* define if idnkit support is to be included. */
@WITH_IDN@

/* Build with GeoIP City IPv6 support */
@HAVE_GEOIP_CITY_V6@

/* Build with GeoIP Country IPv6 support */
@HAVE_GEOIP_V6@

/* Define if zlib was found */
@HAVE_ZLIB@

/* Define to enable rpz-nsdname rules. */
@ENABLE_RPZ_NSDNAME@

/* Define to enable rpz-nsip rules. */
@ENABLE_RPZ_NSIP@

/* From enable developer */
@ISC_LIST_CHECKINIT@

/* Large system tuning */
@TUNE_LARGE@

/* Verbose query trace logging */
@WANT_QUERYTRACE@

/*
 * Define to nothing if C supports flexible array members, and to 1 if it does
 * not. That way, with a declaration like `struct s { int n; double
 * d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99
 * compilers. When computing the size of such an object, don't use 'sizeof
 * (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)'
 * instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with
 * MSVC and with C++ compilers.
 */
#define FLEXIBLE_ARRAY_MEMBER /**/

/* Avoid warnings with strlen() */
#ifdef _WIN64
#define strlen(x)	(unsigned int) strlen(x)
#endif

/* Get SRCID */
#include "srcid.h"
