1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3AC_PREREQ([2.56])
4sinclude(acx_nlnetlabs.m4)
5sinclude(ax_pthread.m4)
6sinclude(acx_python.m4)
7sinclude(ac_pkg_swig.m4)
8sinclude(dnstap/dnstap.m4)
9sinclude(dnscrypt/dnscrypt.m4)
10
11# must be numbers. ac_defun because of later processing
12m4_define([VERSION_MAJOR],[1])
13m4_define([VERSION_MINOR],[14])
14m4_define([VERSION_MICRO],[0])
15AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound])
16AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
17AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
18AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
19
20LIBUNBOUND_CURRENT=9
21LIBUNBOUND_REVISION=14
22LIBUNBOUND_AGE=1
23# 1.0.0 had 0:12:0
24# 1.0.1 had 0:13:0
25# 1.0.2 had 0:14:0
26# 1.1.0 had 0:15:0
27# 1.1.1 had 0:16:0
28# 1.2.0 had 0:17:0
29# 1.2.1 had 0:18:0
30# 1.3.0 had 1:0:0   # ub_cancel and -export-symbols.
31# 1.3.1 had 1:1:0
32# 1.3.2 had 1:2:0
33# 1.3.3 had 1:3:0
34# 1.3.4 had 1:4:0
35# 1.4.0-snapshots had 1:5:0
36# 1.4.0 had 1:5:0 (not 2:0:0)   # ub_result.why_bogus
37# 1.4.1 had 2:1:0
38# 1.4.2 had 2:2:0
39# 1.4.3 had 2:3:0
40# 1.4.4 had 2:4:0
41# 1.4.5 had 2:5:0
42# 1.4.6 had 2:6:0
43# 1.4.7 had 2:7:0
44# 1.4.8 had 2:8:0
45# 1.4.9 had 2:9:0
46# 1.4.10 had 2:10:0
47# 1.4.11 had 2:11:0
48# 1.4.12 had 2:12:0
49# 1.4.13 had 2:13:0
50# and 1.4.13p1 and 1.4.13.p2
51# 1.4.14 had 2:14:0
52# 1.4.15 had 3:0:1 # adds ub_version()
53# 1.4.16 had 3:1:1
54# 1.4.17 had 3:2:1
55# 1.4.18 had 3:3:1
56# 1.4.19 had 3:4:1
57# 1.4.20 had 4:0:2 # adds libunbound.ttl # but shipped 3:5:1
58# 1.4.21 had 4:1:2
59# 1.4.22 had 4:1:2
60# 1.5.0 had 5:3:3 # adds ub_ctx_add_ta_autr
61# 1.5.1 had 5:3:3
62# 1.5.2 had 5:5:3
63# 1.5.3 had 5:6:3
64# 1.5.4 had 5:7:3
65# 1.5.5 had 5:8:3
66# 1.5.6 had 5:9:3
67# 1.5.7 had 5:10:3
68# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
69# 1.5.9 had 6:1:4
70# 1.5.10 had 6:2:4
71# 1.6.0 had 6:3:4
72# 1.6.1 had 7:0:5 # ub_callback_t typedef renamed to ub_callback_type
73# 1.6.2 had 7:1:5
74# 1.6.3 had 7:2:5
75# 1.6.4 had 7:3:5
76# 1.6.5 had 7:4:5
77# 1.6.6 had 7:5:5
78# 1.6.7 had 7:6:5
79# 1.6.8 had 7:7:5
80# 1.7.0 had 7:8:5
81# 1.7.1 had 7:9:5
82# 1.7.2 had 7:10:5
83# 1.7.3 had 7:11:5
84# 1.8.0 had 8:0:0 # changes the event callback function signature
85# 1.8.1 had 8:1:0
86# 1.8.2 had 8:2:0
87# 1.8.3 had 8:3:0
88# 1.9.0 had 9:0:1 # add ub_ctx_set_tls
89# 1.9.1 had 9:1:1
90# 1.9.2 had 9:2:1
91# 1.9.3 had 9:3:1
92# 1.9.4 had 9:4:1
93# 1.9.5 had 9:5:1
94# 1.9.6 had 9:6:1
95# 1.10.0 had 9:7:1
96# 1.10.1 had 9:8:1
97# 1.11.0 had 9:9:1
98# 1.12.0 had 9:10:1
99# 1.13.0 had 9:11:1
100# 1.13.1 had 9:12:1
101# 1.13.2 had 9:13:1
102# 1.14.0 had 9:14:1
103
104#   Current  -- the number of the binary API that we're implementing
105#   Revision -- which iteration of the implementation of the binary
106#               API are we supplying?
107#   Age      -- How many previous binary API versions do we also
108#               support?
109#
110# If we release a new version that does not change the binary API,
111# increment Revision.
112#
113# If we release a new version that changes the binary API, but does
114# not break programs compiled against the old binary API, increment
115# Current and Age.  Set Revision to 0, since this is the first
116# implementation of the new API.
117#
118# Otherwise, we're changing the binary API and breaking backward
119# compatibility with old binaries.  Increment Current.  Set Age to 0,
120# since we're backward compatible with no previous APIs.  Set Revision
121# to 0 too.
122AC_SUBST(LIBUNBOUND_CURRENT)
123AC_SUBST(LIBUNBOUND_REVISION)
124AC_SUBST(LIBUNBOUND_AGE)
125
126
127cmdln="`echo $@ | sed -e 's/\\\\/\\\\\\\\/g' | sed -e 's/"/\\\\"/'g`"
128AC_DEFINE_UNQUOTED(CONFCMDLINE, ["$cmdln"], [Command line arguments used with configure])
129
130CFLAGS="$CFLAGS"
131AC_USE_SYSTEM_EXTENSIONS
132if test "$ac_cv_header_minix_config_h" = "yes"; then
133	AC_DEFINE(_NETBSD_SOURCE,1, [Enable for compile on Minix])
134fi
135
136dnl
137dnl By default set prefix to /usr/local
138dnl
139case "$prefix" in
140        NONE)
141		prefix="/usr/local"
142        ;;
143esac
144case "$exec_prefix" in
145        NONE)
146		exec_prefix="$prefix"
147        ;;
148esac
149
150# are we on MinGW?
151if uname -s 2>&1 | grep MINGW >/dev/null; then on_mingw="yes"
152else
153	if echo $host | grep mingw >/dev/null; then on_mingw="yes"
154	else on_mingw="no"; fi
155fi
156
157#
158# Determine configuration file
159# the eval is to evaluate shell expansion twice
160UNBOUND_SBIN_DIR=`eval echo "${sbindir}"`
161AC_SUBST(UNBOUND_SBIN_DIR)
162UNBOUND_SYSCONF_DIR=`eval echo "${sysconfdir}"`
163AC_SUBST(UNBOUND_SYSCONF_DIR)
164UNBOUND_LOCALSTATE_DIR=`eval echo "${localstatedir}"`
165AC_SUBST(UNBOUND_LOCALSTATE_DIR)
166if test $on_mingw = "no"; then
167  ub_conf_file=`eval echo "${sysconfdir}/unbound/unbound.conf"`
168else
169  ub_conf_file="C:\\Program Files\\Unbound\\service.conf"
170fi
171AC_ARG_WITH([conf_file],
172        AS_HELP_STRING([--with-conf-file=path],[Pathname to the Unbound configuration file]),
173	[ub_conf_file="$withval"])
174AC_SUBST(ub_conf_file)
175ACX_ESCAPE_BACKSLASH($ub_conf_file, hdr_config)
176AC_DEFINE_UNQUOTED(CONFIGFILE, ["$hdr_config"], [Pathname to the Unbound configuration file])
177ub_conf_dir=`AS_DIRNAME(["$ub_conf_file"])`
178AC_SUBST(ub_conf_dir)
179
180# Determine run, chroot directory and pidfile locations
181AC_ARG_WITH(run-dir,
182    AS_HELP_STRING([--with-run-dir=path],[set default directory to chdir to (by default dir part of cfg file)]),
183    UNBOUND_RUN_DIR="$withval",
184if test $on_mingw = no; then
185    UNBOUND_RUN_DIR=`dirname "$ub_conf_file"`
186else
187    UNBOUND_RUN_DIR=""
188fi
189)
190AC_SUBST(UNBOUND_RUN_DIR)
191ACX_ESCAPE_BACKSLASH($UNBOUND_RUN_DIR, hdr_run)
192AC_DEFINE_UNQUOTED(RUN_DIR, ["$hdr_run"], [Directory to chdir to])
193
194AC_ARG_WITH(chroot-dir,
195    AS_HELP_STRING([--with-chroot-dir=path],[set default directory to chroot to (by default same as run-dir)]),
196    UNBOUND_CHROOT_DIR="$withval",
197if test $on_mingw = no; then
198    UNBOUND_CHROOT_DIR="$UNBOUND_RUN_DIR"
199else
200    UNBOUND_CHROOT_DIR=""
201fi
202)
203AC_SUBST(UNBOUND_CHROOT_DIR)
204ACX_ESCAPE_BACKSLASH($UNBOUND_CHROOT_DIR, hdr_chroot)
205AC_DEFINE_UNQUOTED(CHROOT_DIR, ["$hdr_chroot"], [Directory to chroot to])
206
207AC_ARG_WITH(share-dir,
208    AS_HELP_STRING([--with-share-dir=path],[set default directory with shared data (by default same as share/unbound)]),
209    UNBOUND_SHARE_DIR="$withval",
210    UNBOUND_SHARE_DIR="$UNBOUND_RUN_DIR")
211AC_SUBST(UNBOUND_SHARE_DIR)
212AC_DEFINE_UNQUOTED(SHARE_DIR, ["$UNBOUND_SHARE_DIR"], [Shared data])
213
214AC_ARG_WITH(pidfile,
215    AS_HELP_STRING([--with-pidfile=filename],[set default pathname to unbound pidfile (default run-dir/unbound.pid)]),
216    UNBOUND_PIDFILE="$withval",
217if test $on_mingw = no; then
218    UNBOUND_PIDFILE="$UNBOUND_RUN_DIR/unbound.pid"
219else
220    UNBOUND_PIDFILE=""
221fi
222)
223AC_SUBST(UNBOUND_PIDFILE)
224ACX_ESCAPE_BACKSLASH($UNBOUND_PIDFILE, hdr_pid)
225AC_DEFINE_UNQUOTED(PIDFILE, ["$hdr_pid"], [default pidfile location])
226
227AC_ARG_WITH(rootkey-file,
228    AS_HELP_STRING([--with-rootkey-file=filename],[set default pathname to root key file (default run-dir/root.key). This file is read and written.]),
229    UNBOUND_ROOTKEY_FILE="$withval",
230if test $on_mingw = no; then
231    UNBOUND_ROOTKEY_FILE="$UNBOUND_RUN_DIR/root.key"
232else
233    UNBOUND_ROOTKEY_FILE="C:\\Program Files\\Unbound\\root.key"
234fi
235)
236AC_SUBST(UNBOUND_ROOTKEY_FILE)
237ACX_ESCAPE_BACKSLASH($UNBOUND_ROOTKEY_FILE, hdr_rkey)
238AC_DEFINE_UNQUOTED(ROOT_ANCHOR_FILE, ["$hdr_rkey"], [default rootkey location])
239
240AC_ARG_WITH(rootcert-file,
241    AS_HELP_STRING([--with-rootcert-file=filename],[set default pathname to root update certificate file (default run-dir/icannbundle.pem).  This file need not exist if you are content with the builtin.]),
242    UNBOUND_ROOTCERT_FILE="$withval",
243if test $on_mingw = no; then
244    UNBOUND_ROOTCERT_FILE="$UNBOUND_RUN_DIR/icannbundle.pem"
245else
246    UNBOUND_ROOTCERT_FILE="C:\\Program Files\\Unbound\\icannbundle.pem"
247fi
248)
249AC_SUBST(UNBOUND_ROOTCERT_FILE)
250ACX_ESCAPE_BACKSLASH($UNBOUND_ROOTCERT_FILE, hdr_rpem)
251AC_DEFINE_UNQUOTED(ROOT_CERT_FILE, ["$hdr_rpem"], [default rootcert location])
252
253AC_ARG_WITH(username,
254    AS_HELP_STRING([--with-username=user],[set default user that unbound changes to (default user is unbound)]),
255    UNBOUND_USERNAME="$withval",
256    UNBOUND_USERNAME="unbound")
257AC_SUBST(UNBOUND_USERNAME)
258AC_DEFINE_UNQUOTED(UB_USERNAME, ["$UNBOUND_USERNAME"], [default username])
259
260AC_DEFINE(WINVER, 0x0502, [the version of the windows API enabled])
261ACX_RSRC_VERSION(wnvs)
262AC_DEFINE_UNQUOTED(RSRC_PACKAGE_VERSION, [$wnvs], [version number for resource files])
263
264# Checks for typedefs, structures, and compiler characteristics.
265AC_C_CONST
266AC_LANG([C])
267# allow user to override the -g -O2 flags.
268default_cflags=no
269if test "x$CFLAGS" = "x" ; then
270ACX_CHECK_COMPILER_FLAG(g, [CFLAGS="$CFLAGS -g"])
271ACX_CHECK_COMPILER_FLAG(O2, [CFLAGS="$CFLAGS -O2"])
272default_cflags=yes
273fi
274AC_PROG_CC
275ACX_DEPFLAG
276ACX_DETERMINE_EXT_FLAGS_UNBOUND
277
278# debug mode flags warnings
279AC_ARG_ENABLE(checking, AS_HELP_STRING([--enable-checking],[Enable warnings, asserts, makefile-dependencies]))
280AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],[same as enable-checking]))
281if test "$enable_debug" = "yes"; then debug_enabled="$enable_debug";
282else debug_enabled="$enable_checking"; fi
283AC_SUBST(debug_enabled)
284case "$debug_enabled" in
285        yes)
286		ACX_CHECK_COMPILER_FLAG(W, [CFLAGS="$CFLAGS -W"])
287		ACX_CHECK_COMPILER_FLAG(Wall, [CFLAGS="$CFLAGS -Wall"])
288		ACX_CHECK_COMPILER_FLAG(Wextra, [CFLAGS="$CFLAGS -Wextra"])
289		ACX_CHECK_COMPILER_FLAG(Wdeclaration-after-statement, [CFLAGS="$CFLAGS -Wdeclaration-after-statement"])
290		AC_DEFINE([UNBOUND_DEBUG], [], [define this to enable debug checks.])
291		;;
292	no|*)
293		# nothing to do.
294		;;
295esac
296if test "$default_cflags" = "yes"; then
297	# only when CFLAGS was "" at the start, if the users wants to
298	# override we shouldn't add default cflags, because they wouldn't
299	# be able to turn off these options and set the CFLAGS wanted.
300	ACX_CHECK_FLTO
301	ACX_CHECK_PIE
302	ACX_CHECK_RELRO_NOW
303fi
304
305AC_C_INLINE
306ACX_CHECK_FORMAT_ATTRIBUTE
307ACX_CHECK_UNUSED_ATTRIBUTE
308
309AC_DEFUN([CHECK_WEAK_ATTRIBUTE],
310[AC_REQUIRE([AC_PROG_CC])
311AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "weak" attribute)
312AC_CACHE_VAL(ac_cv_c_weak_attribute,
313[ac_cv_c_weak_attribute=no
314AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h>
315__attribute__((weak)) void f(int x) { printf("%d", x); }
316]], [[
317   f(1);
318]])],[ac_cv_c_weak_attribute="yes"],[ac_cv_c_weak_attribute="no"])
319])
320
321AC_MSG_RESULT($ac_cv_c_weak_attribute)
322if test $ac_cv_c_weak_attribute = yes; then
323  AC_DEFINE(HAVE_ATTR_WEAK, 1, [Whether the C compiler accepts the "weak" attribute])
324  AC_DEFINE(ATTR_WEAK, [__attribute__((weak))], [apply the weak attribute to a symbol])
325fi
326])dnl End of CHECK_WEAK_ATTRIBUTE
327
328CHECK_WEAK_ATTRIBUTE
329
330AC_DEFUN([CHECK_NORETURN_ATTRIBUTE],
331[AC_REQUIRE([AC_PROG_CC])
332AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "noreturn" attribute)
333AC_CACHE_VAL(ac_cv_c_noreturn_attribute,
334[ac_cv_c_noreturn_attribute=no
335AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h>
336__attribute__((noreturn)) void f(int x) { printf("%d", x); }
337]], [[
338   f(1);
339]])],[ac_cv_c_noreturn_attribute="yes"],[ac_cv_c_noreturn_attribute="no"])
340])
341
342AC_MSG_RESULT($ac_cv_c_noreturn_attribute)
343if test $ac_cv_c_noreturn_attribute = yes; then
344  AC_DEFINE(HAVE_ATTR_NORETURN, 1, [Whether the C compiler accepts the "noreturn" attribute])
345  AC_DEFINE(ATTR_NORETURN, [__attribute__((__noreturn__))], [apply the noreturn attribute to a function that exits the program])
346fi
347])dnl End of CHECK_NORETURN_ATTRIBUTE
348
349CHECK_NORETURN_ATTRIBUTE
350
351if test "$srcdir" != "."; then
352	CPPFLAGS="$CPPFLAGS -I$srcdir"
353fi
354
355AC_DEFUN([ACX_YYLEX_DESTROY], [
356	AC_MSG_CHECKING([for yylex_destroy])
357	if echo %% | $LEX -t 2>&1 | grep yylex_destroy >/dev/null 2>&1; then
358		AC_DEFINE(LEX_HAS_YYLEX_DESTROY, 1, [if lex has yylex_destroy])
359		AC_MSG_RESULT(yes)
360	else AC_MSG_RESULT(no);
361		LEX=":"
362	fi
363])
364
365AC_DEFUN([ACX_YYLEX_OPTION], [
366	AC_MSG_CHECKING([for lex %option])
367	if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
368%option nounput
369%%
370EOF
371		AC_MSG_RESULT(yes)
372	else AC_MSG_RESULT(no);
373		LEX=":"
374	fi
375])
376
377AC_PROG_LEX([noyywrap])
378if test "$LEX" != "" -a "$LEX" != ":"; then
379ACX_YYLEX_DESTROY
380fi
381if test "$LEX" != "" -a "$LEX" != ":"; then
382ACX_YYLEX_OPTION
383fi
384AC_PROG_YACC
385AC_CHECK_PROG(doxygen, doxygen, doxygen)
386AC_CHECK_TOOL(STRIP, strip)
387ACX_LIBTOOL_C_ONLY
388
389# pkg-config is only needed for these options, do not require it otherwise
390if test "$enable_systemd" = "yes" -o "$with_pyunbound" = "yes" -o "$with_pythonmod" = "yes"; then
391PKG_PROG_PKG_CONFIG
392fi
393
394# Checks for header files.
395AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h],,, [AC_INCLUDES_DEFAULT])
396# net/if.h portability for Darwin see:
397# https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Header-Portability.html
398AC_CHECK_HEADERS([net/if.h],,, [
399#include <stdio.h>
400#ifdef STDC_HEADERS
401# include <stdlib.h>
402# include <stddef.h>
403#else
404# ifdef HAVE_STDLIB_H
405#  include <stdlib.h>
406# endif
407#endif
408#ifdef HAVE_SYS_SOCKET_H
409# include <sys/socket.h>
410#endif
411])
412
413# Check for Apple header. This uncovers TARGET_OS_IPHONE, TARGET_OS_TV or TARGET_OS_WATCH
414AC_CHECK_HEADERS([TargetConditionals.h],,, [AC_INCLUDES_DEFAULT])
415
416# check for types.
417# Using own tests for int64* because autoconf builtin only give 32bit.
418AC_CHECK_TYPE(int8_t, signed char)
419AC_CHECK_TYPE(int16_t, short)
420AC_CHECK_TYPE(int32_t, int)
421AC_CHECK_TYPE(int64_t, long long)
422AC_CHECK_TYPE(uint8_t, unsigned char)
423AC_CHECK_TYPE(uint16_t, unsigned short)
424AC_CHECK_TYPE(uint32_t, unsigned int)
425AC_CHECK_TYPE(uint64_t, unsigned long long)
426AC_TYPE_SIZE_T
427AC_CHECK_TYPE(ssize_t, int)
428AC_TYPE_UID_T
429AC_TYPE_PID_T
430AC_TYPE_OFF_T
431ACX_TYPE_U_CHAR
432ACX_TYPE_RLIM_T
433ACX_TYPE_SOCKLEN_T
434ACX_TYPE_IN_ADDR_T
435ACX_TYPE_IN_PORT_T
436ACX_CHECK_MEMCMP_SIGNED
437
438AC_CHECK_SIZEOF(time_t,,[
439AC_INCLUDES_DEFAULT
440#ifdef TIME_WITH_SYS_TIME
441# include <sys/time.h>
442# include <time.h>
443#else
444# ifdef HAVE_SYS_TIME_H
445#  include <sys/time.h>
446# else
447#  include <time.h>
448# endif
449#endif
450])
451AC_CHECK_SIZEOF(size_t)
452
453# add option to disable the evil rpath
454ACX_ARG_RPATH
455AC_SUBST(RUNTIME_PATH)
456
457# check to see if libraries are needed for these functions.
458AC_SEARCH_LIBS([inet_pton], [nsl])
459AC_SEARCH_LIBS([socket], [socket])
460
461# check whether strptime also works
462AC_DEFUN([AC_CHECK_STRPTIME_WORKS],
463[AC_REQUIRE([AC_PROG_CC])
464AC_MSG_CHECKING(whether strptime works)
465if test c${cross_compiling} = cno; then
466AC_RUN_IFELSE([AC_LANG_SOURCE([[
467#define _XOPEN_SOURCE 600
468#include <time.h>
469int main(void) { struct tm tm; char *res;
470res = strptime("2010-07-15T00:00:00+00:00", "%t%Y%t-%t%m%t-%t%d%tT%t%H%t:%t%M%t:%t%S%t", &tm);
471if (!res) return 2;
472res = strptime("20070207111842", "%Y%m%d%H%M%S", &tm);
473if (!res) return 1; return 0; }
474]])] , [eval "ac_cv_c_strptime_works=yes"], [eval "ac_cv_c_strptime_works=no"])
475else
476eval "ac_cv_c_strptime_works=maybe"
477fi
478AC_MSG_RESULT($ac_cv_c_strptime_works)
479if test $ac_cv_c_strptime_works = no; then
480AC_LIBOBJ(strptime)
481else
482AC_DEFINE_UNQUOTED([STRPTIME_WORKS], 1, [use default strptime.])
483fi
484])dnl
485
486# check some functions of the OS before linking libs (while still runnable).
487AC_FUNC_CHOWN
488AC_FUNC_FORK
489AC_DEFINE(RETSIGTYPE,void,[Return type of signal handlers, but autoconf 2.70 says 'your code may safely assume C89 semantics that RETSIGTYPE is void.'])
490AC_FUNC_FSEEKO
491ACX_SYS_LARGEFILE
492ACX_CHECK_NONBLOCKING_BROKEN
493ACX_MKDIR_ONE_ARG
494AC_CHECK_FUNCS([strptime],[AC_CHECK_STRPTIME_WORKS],[AC_LIBOBJ([strptime])])
495
496# check if we can use SO_REUSEPORT
497reuseport_default=0
498if echo "$host" | $GREP -i -e linux >/dev/null; then reuseport_default=1; fi
499if echo "$host" | $GREP -i -e dragonfly >/dev/null; then reuseport_default=1; fi
500if test "$reuseport_default" = 1; then
501	AC_DEFINE(REUSEPORT_DEFAULT, 1, [if REUSEPORT is enabled by default])
502else
503	AC_DEFINE(REUSEPORT_DEFAULT, 0, [if REUSEPORT is enabled by default])
504fi
505
506# Include systemd.m4 - begin
507sinclude(systemd.m4)
508# Include systemd.m4 - end
509
510# set memory allocation checking if requested
511AC_ARG_ENABLE(alloc-checks, AS_HELP_STRING([--enable-alloc-checks],[ enable to memory allocation statistics, for debug purposes ]),
512	, )
513AC_ARG_ENABLE(alloc-lite, AS_HELP_STRING([--enable-alloc-lite],[ enable for lightweight alloc assertions, for debug purposes ]),
514	, )
515AC_ARG_ENABLE(alloc-nonregional, AS_HELP_STRING([--enable-alloc-nonregional],[ enable nonregional allocs, slow but exposes regional allocations to other memory purifiers, for debug purposes ]),
516	, )
517if test x_$enable_alloc_nonregional = x_yes; then
518	AC_DEFINE(UNBOUND_ALLOC_NONREGIONAL, 1, [use malloc not regions, for debug use])
519fi
520if test x_$enable_alloc_checks = x_yes; then
521	AC_DEFINE(UNBOUND_ALLOC_STATS, 1, [use statistics for allocs and frees, for debug use])
522	SLDNS_ALLOCCHECK_EXTRA_OBJ="alloc.lo log.lo"
523	AC_SUBST(SLDNS_ALLOCCHECK_EXTRA_OBJ)
524	ASYNCLOOK_ALLOCCHECK_EXTRA_OBJ="alloc.lo"
525	AC_SUBST(ASYNCLOOK_ALLOCCHECK_EXTRA_OBJ)
526else
527	if test x_$enable_alloc_lite = x_yes; then
528		AC_DEFINE(UNBOUND_ALLOC_LITE, 1, [use to enable lightweight alloc assertions, for debug use])
529	else
530		ACX_FUNC_MALLOC([unbound])
531	fi
532fi
533
534# check windows threads (we use them, not pthreads, on windows).
535if test "$on_mingw" = "yes"; then
536# check windows threads
537	AC_CHECK_HEADERS([windows.h],,, [AC_INCLUDES_DEFAULT])
538	AC_MSG_CHECKING([for CreateThread])
539	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
540#ifdef HAVE_WINDOWS_H
541#include <windows.h>
542#endif
543], [
544	HANDLE t = CreateThread(NULL, 0, NULL, NULL, 0, NULL);
545])],
546	AC_MSG_RESULT(yes)
547	AC_DEFINE(HAVE_WINDOWS_THREADS, 1, [Using Windows threads])
548,
549	AC_MSG_RESULT(no)
550)
551
552else
553# not on mingw, check thread libraries.
554
555# check for thread library.
556# check this first, so that the pthread lib does not get linked in via
557# libssl or libpython, and thus distorts the tests, and we end up using
558# the non-threadsafe C libraries.
559AC_ARG_WITH(pthreads, AS_HELP_STRING([--with-pthreads],[use pthreads library, or --without-pthreads to disable threading support.]),
560 [ ],[ withval="yes" ])
561ub_have_pthreads=no
562if test x_$withval != x_no; then
563	AX_PTHREAD([
564		AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.])
565		if test -n "$PTHREAD_LIBS"; then
566		  LIBS="$PTHREAD_LIBS $LIBS"
567		fi
568		CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
569		CC="$PTHREAD_CC"
570		ub_have_pthreads=yes
571		AC_CHECK_TYPES([pthread_spinlock_t, pthread_rwlock_t],,,[#include <pthread.h>])
572
573		if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then
574		AC_MSG_CHECKING([if -pthread unused during linking])
575		# catch clang warning 'argument unused during compilation'
576		AC_LANG_CONFTEST([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
577[[
578int main(void) {return 0;}
579]])])
580		pthread_unused="yes"
581		# first compile
582		echo "$CC $CFLAGS -c conftest.c -o conftest.o" >&AS_MESSAGE_LOG_FD
583		$CC $CFLAGS -c conftest.c -o conftest.o 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD
584		if test $? = 0; then
585			# then link
586			echo "$CC $CFLAGS -Werror $LDFLAGS $LIBS -o conftest contest.o" >&AS_MESSAGE_LOG_FD
587			$CC $CFLAGS -Werror $LDFLAGS $LIBS -o conftest conftest.o 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD
588			if test $? -ne 0; then
589				AC_MSG_RESULT(yes)
590				CFLAGS=`echo "$CFLAGS" | sed -e 's/-pthread//'`
591				PTHREAD_CFLAGS_ONLY="-pthread"
592				AC_SUBST(PTHREAD_CFLAGS_ONLY)
593			else
594				AC_MSG_RESULT(no)
595			fi
596		else
597			AC_MSG_RESULT(no)
598		fi # endif cc successful
599		rm -f conftest conftest.c conftest.o
600		fi # endif -pthread in CFLAGS
601
602		])
603fi
604
605# check solaris thread library
606AC_ARG_WITH(solaris-threads, AS_HELP_STRING([--with-solaris-threads],[use solaris native thread library.]), [ ],[ withval="no" ])
607ub_have_sol_threads=no
608if test x_$withval != x_no; then
609	if test x_$ub_have_pthreads != x_no; then
610	    AC_MSG_WARN([Have pthreads already, ignoring --with-solaris-threads])
611	else
612	AC_SEARCH_LIBS(thr_create, [thread],
613	[
614    		AC_DEFINE(HAVE_SOLARIS_THREADS, 1, [Using Solaris threads])
615
616		ACX_CHECK_COMPILER_FLAG(mt, [CFLAGS="$CFLAGS -mt"],
617			[CFLAGS="$CFLAGS -D_REENTRANT"])
618		ub_have_sol_threads=yes
619	] , [
620		AC_MSG_ERROR([no solaris threads found.])
621	])
622	fi
623fi
624
625fi # end of non-mingw check of thread libraries
626
627# Check for SYSLOG_FACILITY
628AC_ARG_WITH(syslog-facility, AS_HELP_STRING([--with-syslog-facility=LOCAL0 - LOCAL7],[ set SYSLOG_FACILITY, default DAEMON ]),
629	[ UNBOUND_SYSLOG_FACILITY="$withval" ], [])
630case "${UNBOUND_SYSLOG_FACILITY}" in
631
632  LOCAL[[0-7]]) UNBOUND_SYSLOG_FACILITY="LOG_${UNBOUND_SYSLOG_FACILITY}" ;;
633
634           *) UNBOUND_SYSLOG_FACILITY="LOG_DAEMON" ;;
635
636esac
637AC_DEFINE_UNQUOTED(UB_SYSLOG_FACILITY,${UNBOUND_SYSLOG_FACILITY},[the SYSLOG_FACILITY to use, default LOG_DAEMON])
638
639# Check for dynamic library module
640AC_ARG_WITH(dynlibmodule,
641   AS_HELP_STRING([--with-dynlibmodule],[build dynamic library module, or --without-dynlibmodule to disable it. (default=no)]),
642   [], [ withval="no" ])
643
644if test x_$withval != x_no; then
645  AC_DEFINE(WITH_DYNLIBMODULE, 1, [Define if you want dynlib module.])
646  WITH_DYNLIBMODULE=yes
647  AC_SUBST(WITH_DYNLIBMODULE)
648  DYNLIBMOD_OBJ="dynlibmod.lo"
649  AC_SUBST(DYNLIBMOD_OBJ)
650  DYNLIBMOD_HEADER='$(srcdir)/dynlibmod/dynlibmod.h'
651  AC_SUBST(DYNLIBMOD_HEADER)
652  if test $on_mingw = "no"; then
653    # link with -ldl if not already there, for all executables because
654    # dlopen call is in the dynlib module.  For unbound executable, also
655    # export symbols.
656    AC_SEARCH_LIBS([dlopen], [dl])
657    DYNLIBMOD_EXTRALIBS="-export-dynamic"
658  else
659    DYNLIBMOD_EXTRALIBS="-Wl,--export-all-symbols,--out-implib,libunbound.dll.a"
660  fi
661  AC_SUBST(DYNLIBMOD_EXTRALIBS)
662fi
663
664# Check for PyUnbound
665AC_ARG_WITH(pyunbound,
666   AS_HELP_STRING([--with-pyunbound],[build PyUnbound, or --without-pyunbound to skip it. (default=no)]),
667   [], [ withval="no" ])
668
669ub_test_python=no
670ub_with_pyunbound=no
671if test x_$withval != x_no; then
672   ub_with_pyunbound=yes
673   ub_test_python=yes
674fi
675
676# Check for Python module
677AC_ARG_WITH(pythonmodule,
678   AS_HELP_STRING([--with-pythonmodule],[build Python module, or --without-pythonmodule to disable script engine. (default=no)]),
679   [], [ withval="no" ])
680
681ub_with_pythonmod=no
682if test x_$withval != x_no; then
683   ub_with_pythonmod=yes
684   ub_test_python=yes
685fi
686
687# Check for Python & SWIG only on PyUnbound or PyModule
688if test x_$ub_test_python != x_no; then
689
690   # Check for Python
691   ub_have_python=no
692   ac_save_LIBS="$LIBS" dnl otherwise AC_PYTHON_DEVEL thrashes $LIBS
693   AC_PYTHON_DEVEL
694   if test ! -z "$PYTHON_VERSION"; then
695	if test `$PYTHON -c "print('$PYTHON_VERSION' >= '2.4.0')"` = "False"; then
696		AC_MSG_ERROR([Python version >= 2.4.0 is required])
697	fi
698
699      [PY_MAJOR_VERSION="`$PYTHON -c \"import sys; print(sys.version_info[0])\"`"]
700      AC_SUBST(PY_MAJOR_VERSION)
701      # Have Python
702      AC_DEFINE(HAVE_PYTHON,1,[Define if you have Python libraries and header files.])
703      if test x_$ub_with_pythonmod != x_no; then
704        if test -n "$LIBS"; then
705          LIBS="$PYTHON_LDFLAGS $LIBS"
706        else
707          LIBS="$PYTHON_LDFLAGS"
708        fi
709      fi
710      PYTHON_LIBS="$PYTHON_LDFLAGS"
711      AC_SUBST(PYTHON_LIBS)
712      if test -n "$CPPFLAGS"; then
713        CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
714      else
715        CPPFLAGS="$PYTHON_CPPFLAGS"
716      fi
717      if test "$PYTHON_LIBDIR" != "/usr/lib" -a "$PYTHON_LIBDIR" != "" -a "$PYTHON_LIBDIR" != "/usr/lib64"; then
718        ACX_RUNTIME_PATH_ADD([$PYTHON_LIBDIR])
719      fi
720      ub_have_python=yes
721      PKG_CHECK_EXISTS(["python${PY_MAJOR_VERSION}"],
722                       [PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"],
723                       [PC_PY_DEPENDENCY="python"])
724      AC_SUBST(PC_PY_DEPENDENCY)
725
726      # Check for SWIG
727      ub_have_swig=no
728      AC_ARG_ENABLE(swig-version-check, AS_HELP_STRING([--disable-swig-version-check],[Disable swig version check to build python modules with older swig even though that is unreliable]))
729      if test "$enable_swig_version_check" = "yes"; then
730      	AC_PROG_SWIG(2.0.1)
731      else
732      	AC_PROG_SWIG
733      fi
734      AC_MSG_CHECKING(SWIG)
735      if test ! -x "$SWIG"; then
736         AC_MSG_ERROR([failed to find swig tool, install it, or do not build Python module and PyUnbound])
737      else
738         AC_DEFINE(HAVE_SWIG, 1, [Define if you have Swig libraries and header files.])
739         AC_SUBST(swig, "$SWIG")
740         AC_MSG_RESULT(present)
741
742         # If have Python & SWIG
743         # Declare PythonMod
744         if test x_$ub_with_pythonmod != x_no; then
745            AC_DEFINE(WITH_PYTHONMODULE, 1, [Define if you want Python module.])
746            WITH_PYTHONMODULE=yes
747            AC_SUBST(WITH_PYTHONMODULE)
748	    PYTHONMOD_OBJ="pythonmod.lo pythonmod_utils.lo"
749	    AC_SUBST(PYTHONMOD_OBJ)
750	    PYTHONMOD_HEADER='$(srcdir)/pythonmod/pythonmod.h'
751	    AC_SUBST(PYTHONMOD_HEADER)
752	    PYTHONMOD_INSTALL=pythonmod-install
753	    AC_SUBST(PYTHONMOD_INSTALL)
754	    PYTHONMOD_UNINSTALL=pythonmod-uninstall
755	    AC_SUBST(PYTHONMOD_UNINSTALL)
756         fi
757
758         # Declare PyUnbound
759         if test x_$ub_with_pyunbound != x_no; then
760            AC_DEFINE(WITH_PYUNBOUND, 1, [Define if you want PyUnbound.])
761            WITH_PYUNBOUND=yes
762            AC_SUBST(WITH_PYUNBOUND)
763	    PYUNBOUND_OBJ="libunbound_wrap.lo"
764	    AC_SUBST(PYUNBOUND_OBJ)
765	    PYUNBOUND_TARGET="_unbound.la"
766	    AC_SUBST(PYUNBOUND_TARGET)
767	    PYUNBOUND_INSTALL=pyunbound-install
768	    AC_SUBST(PYUNBOUND_INSTALL)
769	    PYUNBOUND_UNINSTALL=pyunbound-uninstall
770	    AC_SUBST(PYUNBOUND_UNINSTALL)
771         fi
772      fi
773   else
774      AC_MSG_RESULT([*** Python libraries not found, won't build PythonMod or PyUnbound ***])
775      ub_with_pyunbound=no
776      ub_with_pythonmod=no
777   fi
778fi
779
780if test "`uname`" = "NetBSD"; then
781	NETBSD_LINTFLAGS='"-D__RENAME(x)=" -D_NETINET_IN_H_'
782	AC_SUBST(NETBSD_LINTFLAGS)
783fi
784
785if test "`uname -o`" = "GNU/Linux"; then
786	# splint cannot parse modern c99 header files
787	GCC_DOCKER_LINTFLAGS='-syntax'
788	AC_SUBST(GCC_DOCKER_LINTFLAGS)
789fi
790CONFIG_DATE=`date +%Y%m%d`
791AC_SUBST(CONFIG_DATE)
792
793# Checks for libraries.
794
795# libnss
796USE_NSS="no"
797AC_ARG_WITH([nss], AS_HELP_STRING([--with-nss=path],[use libnss instead of openssl, installed at path.]),
798	[
799	USE_NSS="yes"
800	AC_DEFINE(HAVE_NSS, 1, [Use libnss for crypto])
801	if test "$withval" != "" -a "$withval" != "yes"; then
802		CPPFLAGS="$CPPFLAGS -I$withval/include/nss3"
803		LDFLAGS="$LDFLAGS -L$withval/lib"
804		ACX_RUNTIME_PATH_ADD([$withval/lib])
805		CPPFLAGS="-I$withval/include/nspr4 $CPPFLAGS"
806	else
807		CPPFLAGS="$CPPFLAGS -I/usr/include/nss3"
808		CPPFLAGS="-I/usr/include/nspr4 $CPPFLAGS"
809	fi
810        LIBS="$LIBS -lnss3 -lnspr4"
811	SSLLIB=""
812	PC_CRYPTO_DEPENDENCY="nss nspr"
813	AC_SUBST(PC_CRYPTO_DEPENDENCY)
814	]
815)
816
817# libnettle
818USE_NETTLE="no"
819AC_ARG_WITH([nettle], AS_HELP_STRING([--with-nettle=path],[use libnettle as crypto library, installed at path.]),
820	[
821	USE_NETTLE="yes"
822	AC_DEFINE(HAVE_NETTLE, 1, [Use libnettle for crypto])
823	AC_CHECK_HEADERS([nettle/dsa-compat.h],,, [AC_INCLUDES_DEFAULT])
824	if test "$withval" != "" -a "$withval" != "yes"; then
825		CPPFLAGS="$CPPFLAGS -I$withval/include/nettle"
826		LDFLAGS="$LDFLAGS -L$withval/lib"
827		ACX_RUNTIME_PATH_ADD([$withval/lib])
828	else
829		CPPFLAGS="$CPPFLAGS -I/usr/include/nettle"
830	fi
831        LIBS="$LIBS -lhogweed -lnettle -lgmp"
832	SSLLIB=""
833	PC_CRYPTO_DEPENDENCY="hogweed nettle"
834	AC_SUBST(PC_CRYPTO_DEPENDENCY)
835	]
836)
837
838# openssl
839if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
840ACX_WITH_SSL
841ACX_LIB_SSL
842SSLLIB="-lssl"
843
844PC_CRYPTO_DEPENDENCY=""
845AC_SUBST(PC_CRYPTO_DEPENDENCY)
846
847# check if -lcrypt32 is needed because CAPIENG needs that. (on windows)
848BAKLIBS="$LIBS"
849LIBS="-lssl $LIBS"
850AC_MSG_CHECKING([if libssl needs -lcrypt32])
851AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
852	int EVP_sha256(void);
853	(void)EVP_sha256();
854]])], [
855	AC_MSG_RESULT([no])
856	LIBS="$BAKLIBS"
857], [
858	AC_MSG_RESULT([yes])
859	LIBS="$BAKLIBS"
860	LIBS="$LIBS -lcrypt32"
861])
862
863AC_MSG_CHECKING([for LibreSSL])
864if grep VERSION_TEXT $ssldir_include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
865	AC_MSG_RESULT([yes])
866	AC_DEFINE([HAVE_LIBRESSL], [1], [Define if we have LibreSSL])
867	# libressl provides these compat functions, but they may also be
868	# declared by the OS in libc.  See if they have been declared.
869	AC_CHECK_DECLS([strlcpy,strlcat,arc4random,arc4random_uniform])
870else
871	AC_MSG_RESULT([no])
872fi
873AC_CHECK_HEADERS([openssl/conf.h openssl/engine.h openssl/bn.h openssl/dh.h openssl/dsa.h openssl/rsa.h openssl/core_names.h openssl/param_build.h],,, [AC_INCLUDES_DEFAULT])
874AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ENGINE_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup DSA_SIG_set0 EVP_dss1 EVP_DigestVerify EVP_aes_256_cbc EVP_EncryptInit_ex HMAC_Init_ex CRYPTO_THREADID_set_callback EVP_MAC_CTX_set_params OSSL_PARAM_BLD_new BIO_set_callback_ex])
875
876# these check_funcs need -lssl
877BAKLIBS="$LIBS"
878LIBS="-lssl $LIBS"
879AC_CHECK_FUNCS([OPENSSL_init_ssl SSL_CTX_set_security_level SSL_set1_host SSL_get0_peername X509_VERIFY_PARAM_set1_host SSL_CTX_set_ciphersuites SSL_CTX_set_tlsext_ticket_key_evp_cb SSL_CTX_set_alpn_select_cb SSL_get0_alpn_selected SSL_CTX_set_alpn_protos SSL_get1_peer_certificate])
880LIBS="$BAKLIBS"
881
882AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
883AC_INCLUDES_DEFAULT
884#ifdef HAVE_OPENSSL_ERR_H
885#include <openssl/err.h>
886#endif
887
888#ifdef HAVE_OPENSSL_RAND_H
889#include <openssl/rand.h>
890#endif
891
892#ifdef HAVE_OPENSSL_CONF_H
893#include <openssl/conf.h>
894#endif
895
896#ifdef HAVE_OPENSSL_ENGINE_H
897#include <openssl/engine.h>
898#endif
899#include <openssl/ssl.h>
900#include <openssl/evp.h>
901])
902
903if test "$ac_cv_func_HMAC_Init_ex" = "yes"; then
904# check function return type.
905AC_MSG_CHECKING(the return type of HMAC_Init_ex)
906AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
907#ifdef HAVE_OPENSSL_ERR_H
908#include <openssl/err.h>
909#endif
910
911#ifdef HAVE_OPENSSL_RAND_H
912#include <openssl/rand.h>
913#endif
914
915#ifdef HAVE_OPENSSL_CONF_H
916#include <openssl/conf.h>
917#endif
918
919#ifdef HAVE_OPENSSL_ENGINE_H
920#include <openssl/engine.h>
921#endif
922#include <openssl/ssl.h>
923#include <openssl/evp.h>
924], [
925	HMAC_CTX* hmac_ctx = NULL;
926	void* hmac_key = NULL;
927	const EVP_MD* digest = NULL;
928	int x = HMAC_Init_ex(hmac_ctx, hmac_key, 32, digest, NULL);
929	(void)x;
930])], [
931	AC_MSG_RESULT(int)
932], [
933	AC_MSG_RESULT(void)
934	AC_DEFINE([HMAC_INIT_EX_RETURNS_VOID], 1, [If HMAC_Init_ex() returns void])
935])
936fi
937
938fi
939AC_SUBST(SSLLIB)
940
941# libbsd
942AC_ARG_WITH([libbsd], AS_HELP_STRING([--with-libbsd],[Use portable libbsd functions]), [
943	AC_CHECK_HEADERS([bsd/string.h bsd/stdlib.h],,, [AC_INCLUDES_DEFAULT])
944	if test "x$ac_cv_header_bsd_string_h" = xyes -a "x$ac_cv_header_bsd_stdlib_h" = xyes; then
945		for func in strlcpy strlcat arc4random arc4random_uniform reallocarray; do
946			AC_SEARCH_LIBS([$func], [bsd], [
947				AC_DEFINE(HAVE_LIBBSD, 1, [Use portable libbsd functions])
948				PC_LIBBSD_DEPENDENCY=libbsd
949				AC_SUBST(PC_LIBBSD_DEPENDENCY)
950			])
951		done
952	fi
953])
954
955AC_ARG_ENABLE(sha1, AS_HELP_STRING([--disable-sha1],[Disable SHA1 RRSIG support, does not disable nsec3 support]))
956case "$enable_sha1" in
957	no)
958	;;
959	yes|*)
960	AC_DEFINE([USE_SHA1], [1], [Define this to enable SHA1 support.])
961	;;
962esac
963
964
965AC_ARG_ENABLE(sha2, AS_HELP_STRING([--disable-sha2],[Disable SHA256 and SHA512 RRSIG support]))
966case "$enable_sha2" in
967	no)
968	;;
969	yes|*)
970	AC_DEFINE([USE_SHA2], [1], [Define this to enable SHA256 and SHA512 support.])
971	;;
972esac
973
974AC_ARG_ENABLE(subnet, AS_HELP_STRING([--enable-subnet],[Enable client subnet]))
975case "$enable_subnet" in
976	yes)
977	AC_DEFINE([CLIENT_SUBNET], [1], [Define this to enable client subnet option.])
978	SUBNET_OBJ="edns-subnet.lo subnetmod.lo addrtree.lo subnet-whitelist.lo"
979	AC_SUBST(SUBNET_OBJ)
980	SUBNET_HEADER='$(srcdir)/edns-subnet/subnetmod.h $(srcdir)/edns-subnet/edns-subnet.h $(srcdir)/edns-subnet/subnet-whitelist.h $(srcdir)/edns-subnet/addrtree.h'
981	AC_SUBST(SUBNET_HEADER)
982	;;
983	no|*)
984	;;
985esac
986
987# check whether gost also works
988AC_DEFUN([AC_CHECK_GOST_WORKS],
989[AC_REQUIRE([AC_PROG_CC])
990AC_MSG_CHECKING([if GOST works])
991if test c${cross_compiling} = cno; then
992BAKCFLAGS="$CFLAGS"
993if test -n "$ssldir"; then
994	CFLAGS="$CFLAGS -Wl,-rpath,$ssldir_lib"
995fi
996AC_RUN_IFELSE([AC_LANG_SOURCE([[
997#include <string.h>
998#include <openssl/ssl.h>
999#include <openssl/evp.h>
1000#include <openssl/engine.h>
1001#include <openssl/conf.h>
1002/* routine to load gost (from sldns) */
1003int load_gost_id(void)
1004{
1005	static int gost_id = 0;
1006	const EVP_PKEY_ASN1_METHOD* meth;
1007	ENGINE* e;
1008
1009	if(gost_id) return gost_id;
1010
1011	/* see if configuration loaded gost implementation from other engine*/
1012	meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1);
1013	if(meth) {
1014		EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
1015		return gost_id;
1016	}
1017
1018	/* see if engine can be loaded already */
1019	e = ENGINE_by_id("gost");
1020	if(!e) {
1021		/* load it ourself, in case statically linked */
1022		ENGINE_load_builtin_engines();
1023		ENGINE_load_dynamic();
1024		e = ENGINE_by_id("gost");
1025	}
1026	if(!e) {
1027		/* no gost engine in openssl */
1028		return 0;
1029	}
1030	if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
1031		ENGINE_finish(e);
1032		ENGINE_free(e);
1033		return 0;
1034	}
1035
1036	meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1);
1037	if(!meth) {
1038		/* algo not found */
1039		ENGINE_finish(e);
1040		ENGINE_free(e);
1041		return 0;
1042	}
1043	EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
1044	return gost_id;
1045}
1046int main(void) {
1047	EVP_MD_CTX* ctx;
1048	const EVP_MD* md;
1049	unsigned char digest[64]; /* its a 256-bit digest, so uses 32 bytes */
1050	const char* str = "Hello world";
1051	const unsigned char check[] = {
1052		0x40 , 0xed , 0xf8 , 0x56 , 0x5a , 0xc5 , 0x36 , 0xe1 ,
1053		0x33 , 0x7c , 0x7e , 0x87 , 0x62 , 0x1c , 0x42 , 0xe0 ,
1054		0x17 , 0x1b , 0x5e , 0xce , 0xa8 , 0x46 , 0x65 , 0x4d ,
1055		0x8d , 0x3e , 0x22 , 0x9b , 0xe1 , 0x30 , 0x19 , 0x9d
1056	};
1057	OPENSSL_config(NULL);
1058	(void)load_gost_id();
1059	md = EVP_get_digestbyname("md_gost94");
1060	if(!md) return 1;
1061	memset(digest, 0, sizeof(digest));
1062	ctx = EVP_MD_CTX_create();
1063	if(!ctx) return 2;
1064	if(!EVP_DigestInit_ex(ctx, md, NULL)) return 3;
1065	if(!EVP_DigestUpdate(ctx, str, 10)) return 4;
1066	if(!EVP_DigestFinal_ex(ctx, digest, NULL)) return 5;
1067	/* uncomment to see the hash calculated.
1068		{int i;
1069		for(i=0; i<32; i++)
1070			printf(" %2.2x", (int)digest[i]);
1071		printf("\n");}
1072	*/
1073	if(memcmp(digest, check, sizeof(check)) != 0)
1074		return 6;
1075	return 0;
1076}
1077]])] , [eval "ac_cv_c_gost_works=yes"], [eval "ac_cv_c_gost_works=no"])
1078CFLAGS="$BAKCFLAGS"
1079else
1080eval "ac_cv_c_gost_works=maybe"
1081fi
1082AC_MSG_RESULT($ac_cv_c_gost_works)
1083])dnl
1084
1085AC_ARG_ENABLE(gost, AS_HELP_STRING([--disable-gost],[Disable GOST support]))
1086use_gost="no"
1087if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1088case "$enable_gost" in
1089	no)
1090	;;
1091	*)
1092	AC_CHECK_FUNC(EVP_PKEY_set_type_str, [:],[AC_MSG_ERROR([OpenSSL 1.0.0 is needed for GOST support])])
1093	AC_CHECK_FUNC(EC_KEY_new, [], [AC_MSG_ERROR([OpenSSL does not support ECC, needed for GOST support])])
1094	AC_CHECK_GOST_WORKS
1095	if test "$ac_cv_c_gost_works" != no; then
1096		use_gost="yes"
1097		AC_DEFINE([USE_GOST], [1], [Define this to enable GOST support.])
1098	fi
1099	;;
1100esac
1101fi dnl !USE_NSS && !USE_NETTLE
1102
1103AC_ARG_ENABLE(ecdsa, AS_HELP_STRING([--disable-ecdsa],[Disable ECDSA support]))
1104use_ecdsa="no"
1105case "$enable_ecdsa" in
1106    no)
1107      ;;
1108    *)
1109      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1110	      AC_CHECK_FUNC(ECDSA_sign, [], [AC_MSG_ERROR([OpenSSL does not support ECDSA: please upgrade or rerun with --disable-ecdsa])])
1111	      AC_CHECK_FUNC(SHA384_Init, [], [AC_MSG_ERROR([OpenSSL does not support SHA384: please upgrade or rerun with --disable-ecdsa])])
1112	      AC_CHECK_DECLS([NID_X9_62_prime256v1, NID_secp384r1], [], [AC_MSG_ERROR([OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa])], [AC_INCLUDES_DEFAULT
1113#include <openssl/evp.h>
1114	      ])
1115	      # see if OPENSSL 1.0.0 or later (has EVP MD and Verify independency)
1116	      AC_MSG_CHECKING([if openssl supports SHA2 and ECDSA with EVP])
1117	      if grep OPENSSL_VERSION_TEXT $ssldir_include/openssl/opensslv.h | grep "OpenSSL" >/dev/null; then
1118		if grep OPENSSL_VERSION_NUMBER $ssldir_include/openssl/opensslv.h | grep 0x0 >/dev/null; then
1119		  AC_MSG_RESULT([no])
1120		  AC_DEFINE_UNQUOTED([USE_ECDSA_EVP_WORKAROUND], [1], [Define this to enable an EVP workaround for older openssl])
1121		else
1122		  AC_MSG_RESULT([yes])
1123		fi
1124	      else
1125		# not OpenSSL, thus likely LibreSSL, which supports it
1126		AC_MSG_RESULT([yes])
1127	      fi
1128      fi
1129      # we now know we have ECDSA and the required curves.
1130      AC_DEFINE_UNQUOTED([USE_ECDSA], [1], [Define this to enable ECDSA support.])
1131      use_ecdsa="yes"
1132      ;;
1133esac
1134
1135AC_ARG_ENABLE(dsa, AS_HELP_STRING([--disable-dsa],[Disable DSA support]))
1136use_dsa="no"
1137case "$enable_dsa" in
1138    yes)
1139      # detect if DSA is supported, and turn it off if not.
1140      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1141      AC_CHECK_FUNC(DSA_SIG_new, [
1142      AC_CHECK_TYPE(DSA_SIG*, [
1143      AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
1144      ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
1145               fi ], [
1146AC_INCLUDES_DEFAULT
1147#ifdef HAVE_OPENSSL_ERR_H
1148#include <openssl/err.h>
1149#endif
1150
1151#ifdef HAVE_OPENSSL_RAND_H
1152#include <openssl/rand.h>
1153#endif
1154
1155#ifdef HAVE_OPENSSL_CONF_H
1156#include <openssl/conf.h>
1157#endif
1158
1159#ifdef HAVE_OPENSSL_ENGINE_H
1160#include <openssl/engine.h>
1161#endif
1162      ])
1163      ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
1164               fi ])
1165      else
1166      AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
1167      fi
1168      ;;
1169    *)
1170      # disable dsa by default, RFC 8624 section 3.1, validators MUST NOT
1171      # support DSA for DNSSEC Validation.
1172      ;;
1173esac
1174
1175AC_ARG_WITH(deprecate-rsa-1024, AS_HELP_STRING([--with-deprecate-rsa-1024],[Deprecate RSA 1024 bit length, makes that an unsupported key, for use when OpenSSL FIPS refuses 1024 bit verification]))
1176if test "$with_deprecate_rsa_1024" = "yes"; then
1177	AC_DEFINE([DEPRECATE_RSA_1024], [1], [Deprecate RSA 1024 bit length, makes that an unsupported key])
1178fi
1179
1180AC_ARG_ENABLE(ed25519, AS_HELP_STRING([--disable-ed25519],[Disable ED25519 support]))
1181use_ed25519="no"
1182case "$enable_ed25519" in
1183    no)
1184      ;;
1185    *)
1186      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1187	      AC_CHECK_DECLS([NID_ED25519], [
1188      		use_ed25519="yes"
1189	      ], [ if test "x$enable_ed25519" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support ED25519 and you used --enable-ed25519.])
1190	      	fi ], [AC_INCLUDES_DEFAULT
1191#include <openssl/evp.h>
1192	      ])
1193      fi
1194      if test $USE_NETTLE = "yes"; then
1195		AC_CHECK_HEADERS([nettle/eddsa.h], use_ed25519="yes",, [AC_INCLUDES_DEFAULT])
1196      fi
1197      if test $use_ed25519 = "yes"; then
1198      		AC_DEFINE_UNQUOTED([USE_ED25519], [1], [Define this to enable ED25519 support.])
1199      fi
1200      ;;
1201esac
1202
1203AC_ARG_ENABLE(ed448, AS_HELP_STRING([--disable-ed448],[Disable ED448 support]))
1204use_ed448="no"
1205case "$enable_ed448" in
1206    no)
1207      ;;
1208    *)
1209      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1210	      AC_CHECK_DECLS([NID_ED448], [
1211      		use_ed448="yes"
1212	      ], [ if test "x$enable_ed448" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support ED448 and you used --enable-ed448.])
1213	      	fi ], [AC_INCLUDES_DEFAULT
1214#include <openssl/evp.h>
1215	      ])
1216      fi
1217      if test $use_ed448 = "yes"; then
1218      		AC_DEFINE_UNQUOTED([USE_ED448], [1], [Define this to enable ED448 support.])
1219      fi
1220      ;;
1221esac
1222
1223AC_ARG_ENABLE(event-api, AS_HELP_STRING([--enable-event-api],[Enable (experimental) pluggable event base libunbound API installed to unbound-event.h]))
1224case "$enable_event_api" in
1225    yes)
1226      AC_SUBST(UNBOUND_EVENT_INSTALL, [unbound-event-install])
1227      AC_SUBST(UNBOUND_EVENT_UNINSTALL, [unbound-event-uninstall])
1228      ;;
1229    *)
1230      ;;
1231esac
1232
1233AC_ARG_ENABLE(tfo-client, AS_HELP_STRING([--enable-tfo-client],[Enable TCP Fast Open for client mode]))
1234case "$enable_tfo_client" in
1235	yes)
1236		case "$host_os" in
1237			linux*) AC_CHECK_DECL([MSG_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
1238				[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
1239				[AC_INCLUDES_DEFAULT
1240#include <netinet/tcp.h>
1241])
1242				AC_DEFINE_UNQUOTED([USE_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
1243				;;
1244			darwin*) AC_CHECK_DECL([CONNECT_RESUME_ON_READ_WRITE], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
1245				[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
1246				[AC_INCLUDES_DEFAULT
1247#include <sys/socket.h>
1248])
1249				AC_DEFINE_UNQUOTED([USE_OSX_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
1250				;;
1251		esac
1252		;;
1253	no|*)
1254		;;
1255esac
1256
1257AC_ARG_ENABLE(tfo-server, AS_HELP_STRING([--enable-tfo-server],[Enable TCP Fast Open for server mode]))
1258case "$enable_tfo_server" in
1259	yes)
1260	      AC_CHECK_DECL([TCP_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO])], [AC_MSG_ERROR([TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server])], [AC_INCLUDES_DEFAULT
1261#include <netinet/tcp.h>
1262	      ])
1263		AC_DEFINE_UNQUOTED([USE_TCP_FASTOPEN], [1], [Define this to enable server TCP Fast Open.])
1264		;;
1265	no|*)
1266		;;
1267esac
1268
1269# check for libevent
1270AC_ARG_WITH(libevent, AS_HELP_STRING([--with-libevent=pathname],[use libevent (will check /usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr  or you can specify an explicit path). Slower, but allows use of large outgoing port ranges.]),
1271    [ ],[ with_libevent="no" ])
1272if test "x_$with_libevent" != x_no; then
1273        AC_DEFINE([USE_LIBEVENT], [1], [Define if you enable libevent])
1274        AC_MSG_CHECKING(for libevent)
1275        if test "x_$with_libevent" = x_ -o "x_$with_libevent" = x_yes; then
1276            with_libevent="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1277        fi
1278        for dir in $with_libevent; do
1279            thedir="$dir"
1280            if test -f "$dir/include/event.h" -o -f "$dir/include/event2/event.h"; then
1281                found_libevent="yes"
1282				dnl assume /usr is in default path.
1283				if test "$thedir" != "/usr"; then
1284				    CPPFLAGS="$CPPFLAGS -I$thedir/include"
1285				fi
1286				break;
1287		    fi
1288        done
1289        if test x_$found_libevent != x_yes; then
1290		if test -f "$dir/event.h" -a \( -f "$dir/libevent.la" -o -f "$dir/libev.la" \) ; then
1291			# libevent source directory
1292			AC_MSG_RESULT(found in $thedir)
1293			CPPFLAGS="$CPPFLAGS -I$thedir -I$thedir/include"
1294			BAK_LDFLAGS_SET="1"
1295			BAK_LDFLAGS="$LDFLAGS"
1296			# remove evdns from linking
1297			mkdir build >/dev/null 2>&1
1298			mkdir build/libevent >/dev/null 2>&1
1299			mkdir build/libevent/.libs >/dev/null 2>&1
1300			ev_files_o=`ls $thedir/*.o | grep -v evdns\.o | grep -v bufferevent_openssl\.o`
1301			ev_files_lo=`ls $thedir/*.lo | grep -v evdns\.lo | grep -v bufferevent_openssl\.lo`
1302			ev_files_libso=`ls $thedir/.libs/*.o | grep -v evdns\.o | grep -v bufferevent_openssl\.o`
1303			cp $ev_files_o build/libevent
1304			cp $ev_files_lo build/libevent
1305			cp $ev_files_libso build/libevent/.libs
1306			LATE_LDFLAGS="build/libevent/*.lo -lm"
1307			LDFLAGS="build/libevent/*.o $LDFLAGS -lm"
1308		else
1309            AC_MSG_ERROR([Cannot find the libevent library in $with_libevent
1310You can restart ./configure --with-libevent=no to use a builtin alternative.
1311Please note that this alternative is not as capable as libevent when using
1312large outgoing port ranges.  ])
1313		fi
1314        else
1315            AC_MSG_RESULT(found in $thedir)
1316	    dnl if event2 exists and no event lib in dir itself, use subdir
1317	    if test ! -f $thedir/lib/libevent.a -a ! -f $thedir/lib/libevent.so -a -d "$thedir/lib/event2"; then
1318		    LDFLAGS="$LDFLAGS -L$thedir/lib/event2"
1319		    ACX_RUNTIME_PATH_ADD([$thedir/lib/event2])
1320	    else
1321		    dnl assume /usr is in default path, do not add "".
1322		    if test "$thedir" != "/usr" -a "$thedir" != ""; then
1323			LDFLAGS="$LDFLAGS -L$thedir/lib"
1324			ACX_RUNTIME_PATH_ADD([$thedir/lib])
1325		    fi
1326	    fi
1327        fi
1328	# check for library used by libevent after 1.3c
1329	AC_SEARCH_LIBS([clock_gettime], [rt])
1330
1331	# is the event.h header libev or libevent?
1332	AC_CHECK_HEADERS([event.h],,, [AC_INCLUDES_DEFAULT])
1333	AC_CHECK_DECL(EV_VERSION_MAJOR, [
1334		AC_SEARCH_LIBS(event_set, [ev])
1335	],[
1336		AC_SEARCH_LIBS(event_set, [event])
1337	],[AC_INCLUDES_DEFAULT
1338#include <event.h>
1339	])
1340	AC_CHECK_FUNCS([event_base_free]) # only in libevent 1.2 and later
1341	AC_CHECK_FUNCS([event_base_once]) # only in libevent 1.4.1 and later
1342	AC_CHECK_FUNCS([event_base_new]) # only in libevent 1.4.1 and later
1343	AC_CHECK_FUNCS([event_base_get_method]) # only in libevent 1.4.3 and later
1344	AC_CHECK_FUNCS([ev_loop]) # only in libev. (tested on 3.51)
1345	AC_CHECK_FUNCS([ev_default_loop]) # only in libev. (tested on 4.00)
1346	AC_CHECK_FUNCS([event_assign]) # in libevent, for thread-safety
1347	AC_CHECK_DECLS([evsignal_assign], [], [], [AC_INCLUDES_DEFAULT
1348#ifdef HAVE_EVENT_H
1349#  include <event.h>
1350#else
1351#  include "event2/event.h"
1352#endif
1353	])
1354        PC_LIBEVENT_DEPENDENCY="libevent"
1355        AC_SUBST(PC_LIBEVENT_DEPENDENCY)
1356	if test -n "$BAK_LDFLAGS_SET"; then
1357		LDFLAGS="$BAK_LDFLAGS"
1358	fi
1359else
1360	AC_DEFINE(USE_MINI_EVENT, 1, [Define if you want to use internal select based events])
1361fi
1362
1363# check for libexpat
1364AC_ARG_WITH(libexpat, AS_HELP_STRING([--with-libexpat=path],[specify explicit path for libexpat.]),
1365    [ ],[ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr" ])
1366AC_MSG_CHECKING(for libexpat)
1367found_libexpat="no"
1368for dir in $withval ; do
1369            if test -f "$dir/include/expat.h"; then
1370		found_libexpat="yes"
1371		dnl assume /usr is in default path.
1372		if test "$dir" != "/usr"; then
1373                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1374		    LDFLAGS="$LDFLAGS -L$dir/lib"
1375		fi
1376            	AC_MSG_RESULT(found in $dir)
1377                break;
1378            fi
1379done
1380if test x_$found_libexpat != x_yes; then
1381	AC_MSG_ERROR([Could not find libexpat, expat.h])
1382fi
1383AC_CHECK_HEADERS([expat.h],,, [AC_INCLUDES_DEFAULT])
1384AC_CHECK_DECLS([XML_StopParser], [], [], [AC_INCLUDES_DEFAULT
1385#include <expat.h>
1386])
1387
1388# hiredis (redis C client for cachedb)
1389AC_ARG_WITH(libhiredis, AS_HELP_STRING([--with-libhiredis=path],[specify explicit path for libhiredis.]),
1390    [ ],[ withval="no" ])
1391found_libhiredis="no"
1392if test x_$withval = x_yes -o x_$withval != x_no; then
1393   AC_MSG_CHECKING(for libhiredis)
1394   if test x_$withval = x_ -o x_$withval = x_yes; then
1395            withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1396   fi
1397   for dir in $withval ; do
1398            if test -f "$dir/include/hiredis/hiredis.h"; then
1399		found_libhiredis="yes"
1400		dnl assume /usr is in default path.
1401		if test "$dir" != "/usr"; then
1402                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1403		    LDFLAGS="$LDFLAGS -L$dir/lib"
1404		fi
1405		AC_MSG_RESULT(found in $dir)
1406		AC_DEFINE([USE_REDIS], [1], [Define this to use hiredis client.])
1407		LIBS="$LIBS -lhiredis"
1408                break;
1409            fi
1410    done
1411    if test x_$found_libhiredis != x_yes; then
1412	AC_MSG_ERROR([Could not find libhiredis, hiredis.h])
1413    fi
1414    AC_CHECK_HEADERS([hiredis/hiredis.h],,, [AC_INCLUDES_DEFAULT])
1415    AC_CHECK_DECLS([redisConnect], [], [], [AC_INCLUDES_DEFAULT
1416    #include <hiredis/hiredis.h>
1417    ])
1418fi
1419
1420# nghttp2
1421AC_ARG_WITH(libnghttp2, AS_HELP_STRING([--with-libnghttp2=path],[specify explicit path for libnghttp2.]),
1422    [ ],[ withval="no" ])
1423found_libnghttp2="no"
1424if test x_$withval = x_yes -o x_$withval != x_no; then
1425   AC_MSG_CHECKING(for libnghttp2)
1426   if test x_$withval = x_ -o x_$withval = x_yes; then
1427            withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1428   fi
1429   for dir in $withval ; do
1430            if test -f "$dir/include/nghttp2/nghttp2.h"; then
1431		found_libnghttp2="yes"
1432		dnl assume /usr is in default path.
1433		if test "$dir" != "/usr"; then
1434                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1435		    LDFLAGS="$LDFLAGS -L$dir/lib"
1436		fi
1437		AC_MSG_RESULT(found in $dir)
1438		AC_DEFINE([HAVE_NGHTTP2], [1], [Define this to use nghttp2 client.])
1439		LIBS="$LIBS -lnghttp2"
1440                break;
1441            fi
1442    done
1443    if test x_$found_libnghttp2 != x_yes; then
1444	AC_MSG_ERROR([Could not find libnghttp2, nghttp2.h])
1445    fi
1446    AC_CHECK_HEADERS([nghttp2/nghttp2.h],,, [AC_INCLUDES_DEFAULT])
1447    AC_CHECK_DECLS([nghttp2_session_server_new], [], [], [AC_INCLUDES_DEFAULT
1448    #include <nghttp2/nghttp2.h>
1449    ])
1450fi
1451
1452# set static linking for uninstalled libraries if requested
1453AC_SUBST(staticexe)
1454staticexe=""
1455AC_ARG_ENABLE(static-exe, AS_HELP_STRING([--enable-static-exe],[ enable to compile executables statically against (event) uninstalled libs, for debug purposes ]),
1456	, )
1457if test x_$enable_static_exe = x_yes; then
1458	staticexe="-static"
1459	if test "$on_mingw" = yes; then
1460		staticexe="-all-static"
1461		# for static compile, include gdi32 and zlib here.
1462		if echo $LIBS | grep 'lgdi32' >/dev/null; then
1463			:
1464		else
1465			LIBS="$LIBS -lgdi32"
1466		fi
1467		LIBS="$LIBS -lz"
1468		LIBS="$LIBS -l:libssp.a"
1469	fi
1470fi
1471
1472# set full static linking if requested
1473AC_ARG_ENABLE(fully-static, AS_HELP_STRING([--enable-fully-static],[ enable to compile fully static ]),
1474	, )
1475if test x_$enable_fully_static = x_yes; then
1476	staticexe="-all-static"
1477	if test "$on_mingw" = yes; then
1478		# for static compile, include gdi32 and zlib here.
1479		if echo $LIBS | grep 'lgdi32' >/dev/null; then
1480			:
1481		else
1482			LIBS="$LIBS -lgdi32"
1483		fi
1484		LIBS="$LIBS -lz"
1485		LIBS="$LIBS -l:libssp.a"
1486	fi
1487fi
1488
1489# set lock checking if requested
1490AC_ARG_ENABLE(lock_checks, AS_HELP_STRING([--enable-lock-checks],[ enable to check lock and unlock calls, for debug purposes ]),
1491	, )
1492if test x_$enable_lock_checks = x_yes; then
1493	AC_DEFINE(ENABLE_LOCK_CHECKS, 1, [Define if you want to use debug lock checking (slow).])
1494	CHECKLOCK_OBJ="checklocks.lo"
1495	AC_SUBST(CHECKLOCK_OBJ)
1496fi
1497
1498ACX_CHECK_GETADDRINFO_WITH_INCLUDES
1499if test "$USE_WINSOCK" = 1; then
1500	AC_DEFINE(UB_ON_WINDOWS, 1, [Use win32 resources and API])
1501	AC_CHECK_HEADERS([iphlpapi.h],,, [AC_INCLUDES_DEFAULT
1502#include <windows.h>
1503	])
1504	AC_CHECK_TOOL(WINDRES, windres)
1505	LIBS="$LIBS -liphlpapi -lcrypt32"
1506	WINAPPS="unbound-service-install.exe unbound-service-remove.exe anchor-update.exe"
1507	AC_SUBST(WINAPPS)
1508	WIN_DAEMON_SRC="winrc/win_svc.c winrc/w_inst.c"
1509	AC_SUBST(WIN_DAEMON_SRC)
1510	WIN_DAEMON_OBJ="win_svc.lo w_inst.lo"
1511	AC_SUBST(WIN_DAEMON_OBJ)
1512	WIN_DAEMON_OBJ_LINK="rsrc_unbound.o"
1513	AC_SUBST(WIN_DAEMON_OBJ_LINK)
1514	WIN_HOST_OBJ_LINK="rsrc_unbound_host.o"
1515	AC_SUBST(WIN_HOST_OBJ_LINK)
1516	WIN_UBANCHOR_OBJ_LINK="rsrc_unbound_anchor.o log.lo locks.lo"
1517	AC_SUBST(WIN_UBANCHOR_OBJ_LINK)
1518	WIN_CONTROL_OBJ_LINK="rsrc_unbound_control.o"
1519	AC_SUBST(WIN_CONTROL_OBJ_LINK)
1520	WIN_CHECKCONF_OBJ_LINK="rsrc_unbound_checkconf.o"
1521	AC_SUBST(WIN_CHECKCONF_OBJ_LINK)
1522fi
1523if test $ac_cv_func_getaddrinfo = no; then
1524	AC_LIBOBJ([fake-rfc2553])
1525fi
1526# check after getaddrinfo for its libraries
1527ACX_FUNC_IOCTLSOCKET
1528
1529# see if daemon(3) exists, and if it is deprecated.
1530AC_CHECK_FUNCS([daemon])
1531if test $ac_cv_func_daemon = yes; then
1532	ACX_FUNC_DEPRECATED([daemon], [(void)daemon(0, 0);], [
1533#include <stdlib.h>
1534#include <unistd.h>
1535])
1536fi
1537
1538AC_CHECK_MEMBERS([struct sockaddr_un.sun_len],,,[
1539AC_INCLUDES_DEFAULT
1540#ifdef HAVE_SYS_UN_H
1541#include <sys/un.h>
1542#endif
1543])
1544AC_CHECK_MEMBERS([struct in_pktinfo.ipi_spec_dst],,,[
1545AC_INCLUDES_DEFAULT
1546#if HAVE_SYS_PARAM_H
1547#include <sys/param.h>
1548#endif
1549
1550#ifdef HAVE_SYS_SOCKET_H
1551#include <sys/socket.h>
1552#endif
1553
1554#ifdef HAVE_SYS_UIO_H
1555#include <sys/uio.h>
1556#endif
1557
1558#ifdef HAVE_NETINET_IN_H
1559#include <netinet/in.h>
1560#endif
1561
1562#ifdef HAVE_NETINET_TCP_H
1563#include <netinet/tcp.h>
1564#endif
1565
1566#ifdef HAVE_ARPA_INET_H
1567#include <arpa/inet.h>
1568#endif
1569
1570#ifdef HAVE_WINSOCK2_H
1571#include <winsock2.h>
1572#endif
1573
1574#ifdef HAVE_WS2TCPIP_H
1575#include <ws2tcpip.h>
1576#endif
1577])
1578
1579AC_MSG_CHECKING([for htobe64])
1580AC_LINK_IFELSE([AC_LANG_PROGRAM([
1581#include <stdio.h>
1582#ifdef HAVE_ENDIAN_H
1583#  include <endian.h>
1584#endif
1585#ifdef HAVE_SYS_ENDIAN_H
1586#  include <sys/endian.h>
1587#endif
1588], [unsigned long long x = htobe64(0); printf("%u", (unsigned)x);])],
1589  AC_MSG_RESULT(yes)
1590  AC_DEFINE(HAVE_HTOBE64, 1, [If we have htobe64]),
1591  AC_MSG_RESULT(no))
1592
1593AC_MSG_CHECKING([for be64toh])
1594AC_LINK_IFELSE([AC_LANG_PROGRAM([
1595#include <stdio.h>
1596#ifdef HAVE_ENDIAN_H
1597#  include <endian.h>
1598#endif
1599#ifdef HAVE_SYS_ENDIAN_H
1600#  include <sys/endian.h>
1601#endif
1602], [unsigned long long x = be64toh(0); printf("%u", (unsigned)x);])],
1603  AC_MSG_RESULT(yes)
1604  AC_DEFINE(HAVE_BE64TOH, 1, [If we have be64toh]),
1605  AC_MSG_RESULT(no))
1606
1607AC_SEARCH_LIBS([setusercontext], [util])
1608AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex])
1609AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])])
1610AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])
1611
1612# check if setreuid en setregid fail, on MacOSX10.4(darwin8).
1613if echo $host_os | grep darwin8 > /dev/null; then
1614	AC_DEFINE(DARWIN_BROKEN_SETREUID, 1, [Define this if on macOSX10.4-darwin8 and setreuid and setregid do not work])
1615fi
1616AC_CHECK_DECLS([inet_pton,inet_ntop], [], [], [
1617AC_INCLUDES_DEFAULT
1618#ifdef HAVE_NETINET_IN_H
1619#include <netinet/in.h>
1620#endif
1621
1622#ifdef HAVE_NETINET_TCP_H
1623#include <netinet/tcp.h>
1624#endif
1625
1626#ifdef HAVE_ARPA_INET_H
1627#include <arpa/inet.h>
1628#endif
1629
1630#ifdef HAVE_WINSOCK2_H
1631#include <winsock2.h>
1632#endif
1633
1634#ifdef HAVE_WS2TCPIP_H
1635#include <ws2tcpip.h>
1636#endif
1637])
1638AC_REPLACE_FUNCS(inet_aton)
1639AC_REPLACE_FUNCS(inet_pton)
1640AC_REPLACE_FUNCS(inet_ntop)
1641AC_REPLACE_FUNCS(snprintf)
1642# test if snprintf return the proper length
1643if test "x$ac_cv_func_snprintf" = xyes; then
1644    if test c${cross_compiling} = cno; then
1645	AC_MSG_CHECKING([for correct snprintf return value])
1646	AC_RUN_IFELSE([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
1647[[
1648int main(void) { return !(snprintf(NULL, 0, "test") == 4); }
1649]])], [AC_MSG_RESULT(yes)], [
1650		AC_MSG_RESULT(no)
1651		AC_DEFINE([SNPRINTF_RET_BROKEN], [], [define if (v)snprintf does not return length needed, (but length used)])
1652		AC_LIBOBJ(snprintf)
1653	  ])
1654    fi
1655fi
1656AC_REPLACE_FUNCS(strlcat)
1657AC_REPLACE_FUNCS(strlcpy)
1658AC_REPLACE_FUNCS(memmove)
1659AC_REPLACE_FUNCS(gmtime_r)
1660AC_REPLACE_FUNCS(isblank)
1661AC_REPLACE_FUNCS(explicit_bzero)
1662dnl without CTIME, ARC4-functions and without reallocarray.
1663LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
1664AC_SUBST(LIBOBJ_WITHOUT_CTIMEARC4)
1665AC_MSG_CHECKING([for reallocarray])
1666AC_LINK_IFELSE([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
1667[[
1668#ifndef _OPENBSD_SOURCE
1669#define _OPENBSD_SOURCE 1
1670#endif
1671#include <stdlib.h>
1672int main(void) {
1673	void* p = reallocarray(NULL, 10, 100);
1674	free(p);
1675	return 0;
1676}
1677]])], [AC_MSG_RESULT(yes)
1678	AC_DEFINE(HAVE_REALLOCARRAY, 1, [If we have reallocarray(3)])
1679], [
1680	AC_MSG_RESULT(no)
1681	AC_LIBOBJ(reallocarray)
1682])
1683AC_CHECK_DECLS([reallocarray])
1684if test "$USE_NSS" = "no"; then
1685	AC_REPLACE_FUNCS(arc4random)
1686	AC_REPLACE_FUNCS(arc4random_uniform)
1687	if test "$ac_cv_func_arc4random" = "no"; then
1688		AC_LIBOBJ(arc4_lock)
1689		AC_CHECK_FUNCS([getentropy],,[
1690		    if test "$USE_WINSOCK" = 1; then
1691			AC_LIBOBJ(getentropy_win)
1692		    else
1693			case "$host" in
1694			Darwin|*darwin*)
1695				AC_LIBOBJ(getentropy_osx)
1696			;;
1697			*solaris*|*sunos*|SunOS)
1698				AC_LIBOBJ(getentropy_solaris)
1699				AC_CHECK_HEADERS([sys/sha2.h],, [
1700					AC_CHECK_FUNCS([SHA512_Update],,[
1701						AC_LIBOBJ(sha512)
1702					])
1703				], [AC_INCLUDES_DEFAULT])
1704				if test "$ac_cv_header_sys_sha2_h" = "yes"; then
1705					# this lib needed for sha2 on solaris
1706					LIBS="$LIBS -lmd"
1707				fi
1708				AC_SEARCH_LIBS([clock_gettime], [rt])
1709			;;
1710			*freebsd*|*FreeBSD)
1711				AC_LIBOBJ(getentropy_freebsd)
1712			;;
1713			*linux*|Linux|*)
1714				AC_LIBOBJ(getentropy_linux)
1715				AC_CHECK_FUNCS([SHA512_Update],,[
1716					AC_DEFINE([COMPAT_SHA512], [1], [Do sha512 definitions in config.h])
1717					AC_LIBOBJ(sha512)
1718				])
1719				AC_CHECK_HEADERS([sys/sysctl.h],,, [AC_INCLUDES_DEFAULT])
1720				AC_CHECK_FUNCS([getauxval])
1721				AC_SEARCH_LIBS([clock_gettime], [rt])
1722			;;
1723			esac
1724		    fi
1725		])
1726	fi
1727fi
1728LIBOBJ_WITHOUT_CTIME="$LIBOBJS"
1729AC_SUBST(LIBOBJ_WITHOUT_CTIME)
1730AC_REPLACE_FUNCS(ctime_r)
1731AC_REPLACE_FUNCS(strsep)
1732
1733AC_ARG_ENABLE(allsymbols, AS_HELP_STRING([--enable-allsymbols],[export all symbols from libunbound and link binaries to it, smaller install size but libunbound export table is polluted by internal symbols]))
1734case "$enable_allsymbols" in
1735	yes)
1736	COMMON_OBJ_ALL_SYMBOLS=""
1737	UBSYMS=""
1738	EXTRALINK="libunbound.la"
1739	AC_DEFINE(EXPORT_ALL_SYMBOLS, 1, [Define this if you enabled-allsymbols from libunbound to link binaries to it for smaller install size, but the libunbound export table is polluted by internal symbols])
1740	;;
1741	no|*)
1742	COMMON_OBJ_ALL_SYMBOLS='$(COMMON_OBJ)'
1743	UBSYMS='-export-symbols $(srcdir)/libunbound/ubsyms.def'
1744	EXTRALINK=""
1745	;;
1746esac
1747AC_SUBST(COMMON_OBJ_ALL_SYMBOLS)
1748AC_SUBST(EXTRALINK)
1749AC_SUBST(UBSYMS)
1750if test x_$enable_lock_checks = x_yes; then
1751	UBSYMS="-export-symbols clubsyms.def"
1752	cp ${srcdir}/libunbound/ubsyms.def clubsyms.def
1753	echo lock_protect >> clubsyms.def
1754	echo lock_unprotect >> clubsyms.def
1755	echo lock_get_mem >> clubsyms.def
1756	echo checklock_start >> clubsyms.def
1757	echo checklock_stop >> clubsyms.def
1758	echo checklock_lock >> clubsyms.def
1759	echo checklock_unlock >> clubsyms.def
1760	echo checklock_init >> clubsyms.def
1761	echo checklock_thrcreate >> clubsyms.def
1762	echo checklock_thrjoin >> clubsyms.def
1763fi
1764
1765# check for dnstap if requested
1766dt_DNSTAP([$UNBOUND_RUN_DIR/dnstap.sock],
1767    [
1768        AC_DEFINE([USE_DNSTAP], [1], [Define to 1 to enable dnstap support])
1769        AC_SUBST([ENABLE_DNSTAP], [1])
1770
1771        AC_SUBST([opt_dnstap_socket_path])
1772        ACX_ESCAPE_BACKSLASH($opt_dnstap_socket_path, hdr_dnstap_socket_path)
1773        AC_DEFINE_UNQUOTED(DNSTAP_SOCKET_PATH,
1774            ["$hdr_dnstap_socket_path"], [default dnstap socket path])
1775	AC_SUBST(DNSTAP_SOCKET_PATH,["$hdr_dnstap_socket_path"])
1776	AC_SUBST(DNSTAP_SOCKET_TESTBIN,['unbound-dnstap-socket$(EXEEXT)'])
1777        AC_SUBST([DNSTAP_SRC], ["dnstap/dnstap.c dnstap/dnstap.pb-c.c dnstap/dnstap_fstrm.c dnstap/dtstream.c"])
1778        AC_SUBST([DNSTAP_OBJ], ["dnstap.lo dnstap.pb-c.lo dnstap_fstrm.lo dtstream.lo"])
1779    ],
1780    [
1781        AC_SUBST([ENABLE_DNSTAP], [0])
1782    ]
1783)
1784
1785# check for dnscrypt if requested
1786dnsc_DNSCRYPT([
1787        AC_DEFINE([USE_DNSCRYPT], [1], [Define to 1 to enable dnscrypt support])
1788        AC_SUBST([ENABLE_DNSCRYPT], [1])
1789
1790        AC_SUBST([DNSCRYPT_SRC], ["dnscrypt/dnscrypt.c"])
1791        AC_SUBST([DNSCRYPT_OBJ], ["dnscrypt.lo"])
1792    ],
1793    [
1794        AC_SUBST([ENABLE_DNSCRYPT], [0])
1795    ]
1796)
1797
1798# check for cachedb if requested
1799AC_ARG_ENABLE(cachedb, AS_HELP_STRING([--enable-cachedb],[enable cachedb module that can use external cache storage]))
1800# turn on cachedb when hiredis support is enabled.
1801if test "$found_libhiredis" = "yes"; then enable_cachedb="yes"; fi
1802case "$enable_cachedb" in
1803    yes)
1804    	AC_DEFINE([USE_CACHEDB], [1], [Define to 1 to use cachedb support])
1805	AC_SUBST([CACHEDB_SRC], ["cachedb/cachedb.c cachedb/redis.c"])
1806	AC_SUBST([CACHEDB_OBJ], ["cachedb.lo redis.lo"])
1807    	;;
1808    no|*)
1809    	# nothing
1810    	;;
1811esac
1812
1813# check for ipsecmod if requested
1814AC_ARG_ENABLE(ipsecmod, AS_HELP_STRING([--enable-ipsecmod],[Enable ipsecmod module that facilitates opportunistic IPsec]))
1815case "$enable_ipsecmod" in
1816	yes)
1817		AC_DEFINE([USE_IPSECMOD], [1], [Define to 1 to use ipsecmod support.])
1818		IPSECMOD_OBJ="ipsecmod.lo ipsecmod-whitelist.lo"
1819		AC_SUBST(IPSECMOD_OBJ)
1820		IPSECMOD_HEADER='$(srcdir)/ipsecmod/ipsecmod.h $(srcdir)/ipsecmod/ipsecmod-whitelist.h'
1821		AC_SUBST(IPSECMOD_HEADER)
1822		;;
1823	no|*)
1824		# nothing
1825		;;
1826esac
1827
1828# check for ipset if requested
1829AC_ARG_ENABLE(ipset, AS_HELP_STRING([--enable-ipset],[enable ipset module]))
1830case "$enable_ipset" in
1831    yes)
1832		AC_DEFINE([USE_IPSET], [1], [Define to 1 to use ipset support])
1833		IPSET_SRC="ipset/ipset.c"
1834		AC_SUBST(IPSET_SRC)
1835		IPSET_OBJ="ipset.lo"
1836		AC_SUBST(IPSET_OBJ)
1837
1838		# mnl
1839		AC_ARG_WITH(libmnl, AS_HELP_STRING([--with-libmnl=path],[specify explicit path for libmnl.]),
1840			[ ],[ withval="yes" ])
1841		found_libmnl="no"
1842		AC_MSG_CHECKING(for libmnl)
1843		if test x_$withval = x_ -o x_$withval = x_yes; then
1844			withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1845		fi
1846		for dir in $withval ; do
1847			if test -f "$dir/include/libmnl/libmnl.h"; then
1848				found_libmnl="yes"
1849				dnl assume /usr is in default path.
1850				if test "$dir" != "/usr"; then
1851					CPPFLAGS="$CPPFLAGS -I$dir/include"
1852					LDFLAGS="$LDFLAGS -L$dir/lib"
1853				fi
1854				AC_MSG_RESULT(found in $dir)
1855				LIBS="$LIBS -lmnl"
1856				break;
1857			fi
1858		done
1859		if test x_$found_libmnl != x_yes; then
1860			AC_MSG_ERROR([Could not find libmnl, libmnl.h])
1861		fi
1862		;;
1863    no|*)
1864    	# nothing
1865		;;
1866esac
1867AC_ARG_ENABLE(explicit-port-randomisation, AS_HELP_STRING([--disable-explicit-port-randomisation],[disable explicit source port randomisation and rely on the kernel to provide random source ports]))
1868case "$enable_explicit_port_randomisation" in
1869	no)
1870		AC_DEFINE([DISABLE_EXPLICIT_PORT_RANDOMISATION], [1], [Define this to enable kernel based UDP source port randomization.])
1871		;;
1872	yes|*)
1873		;;
1874esac
1875
1876if echo "$host" | $GREP -i -e linux >/dev/null; then
1877	AC_ARG_ENABLE(linux-ip-local-port-range, AC_HELP_STRING([--enable-linux-ip-local-port-range], [Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range. This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Define this only when the target system restricts (e.g. some of SELinux enabled distributions) the use of non-ephemeral ports.]))
1878	case "$enable_linux_ip_local_port_range" in
1879		yes)
1880			AC_DEFINE([USE_LINUX_IP_LOCAL_PORT_RANGE], [1], [Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range. This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Define this only when the target system restricts (e.g. some of SELinux enabled distributions) the use of non-ephemeral ports.])
1881			;;
1882		no|*)
1883			;;
1884	esac
1885fi
1886
1887
1888AC_MSG_CHECKING([if ${MAKE:-make} supports $< with implicit rule in scope])
1889# on openBSD, the implicit rule make $< work.
1890# on Solaris, it does not work ($? is changed sources, $^ lists dependencies).
1891# gmake works.
1892cat >conftest.make <<EOF
1893all:	conftest.lo
1894
1895conftest.lo foo.lo bla.lo:
1896	if test -f "\$<"; then touch \$@; fi
1897
1898.SUFFIXES: .lo
1899.c.lo:
1900	if test -f "\$<"; then touch \$@; fi
1901
1902conftest.lo:        conftest.dir/conftest.c
1903EOF
1904mkdir conftest.dir
1905touch conftest.dir/conftest.c
1906rm -f conftest.lo conftest.c
1907${MAKE:-make} -f conftest.make >/dev/null
1908rm -f conftest.make conftest.c conftest.dir/conftest.c
1909rm -rf conftest.dir
1910if test ! -f conftest.lo; then
1911	AC_MSG_RESULT(no)
1912	SOURCEDETERMINE='echo "$^" | awk "-F " "{print \$$1;}" > .source'
1913	SOURCEFILE='`cat .source`'
1914else
1915	AC_MSG_RESULT(yes)
1916	SOURCEDETERMINE=':'
1917	SOURCEFILE='$<'
1918fi
1919rm -f conftest.lo
1920AC_SUBST(SOURCEDETERMINE)
1921AC_SUBST(SOURCEFILE)
1922
1923# see if we want to build the library or everything
1924ALLTARGET="alltargets"
1925INSTALLTARGET="install-all"
1926AC_ARG_WITH(libunbound-only, AS_HELP_STRING([--with-libunbound-only],[do not build daemon and tool programs]),
1927	[
1928	if test "$withval" = "yes"; then
1929		ALLTARGET="lib"
1930		INSTALLTARGET="install-lib"
1931	fi
1932])
1933if test $ALLTARGET = "alltargets"; then
1934	if test $USE_NSS = "yes"; then
1935		AC_MSG_ERROR([--with-nss can only be used in combination with --with-libunbound-only.])
1936	fi
1937	if test $USE_NETTLE = "yes"; then
1938		AC_MSG_ERROR([--with-nettle can only be used in combination with --with-libunbound-only.])
1939	fi
1940fi
1941
1942AC_SUBST(ALLTARGET)
1943AC_SUBST(INSTALLTARGET)
1944
1945ACX_STRIP_EXT_FLAGS
1946if test -n "$LATE_LDFLAGS"; then
1947  LDFLAGS="$LATE_LDFLAGS $LDFLAGS"
1948fi
1949# remove start spaces
1950LDFLAGS=`echo "$LDFLAGS"|sed -e 's/^ *//'`
1951LIBS=`echo "$LIBS"|sed -e 's/^ *//'`
1952
1953AC_DEFINE_UNQUOTED([MAXSYSLOGMSGLEN], [10240], [Define to the maximum message length to pass to syslog.])
1954
1955AH_BOTTOM(
1956dnl this must be first AH_CONFIG, to define the flags before any includes.
1957AHX_CONFIG_EXT_FLAGS
1958
1959dnl includes
1960[
1961#ifndef _OPENBSD_SOURCE
1962#define _OPENBSD_SOURCE 1
1963#endif
1964
1965#ifndef UNBOUND_DEBUG
1966# ifndef NDEBUG
1967#  define NDEBUG
1968# endif
1969#endif
1970
1971/** Use small-ldns codebase */
1972#define USE_SLDNS 1
1973#ifdef HAVE_SSL
1974#  define LDNS_BUILD_CONFIG_HAVE_SSL 1
1975#endif
1976
1977#include <stdio.h>
1978#include <string.h>
1979#include <unistd.h>
1980#include <assert.h>
1981
1982#if STDC_HEADERS
1983#include <stdlib.h>
1984#include <stddef.h>
1985#endif
1986
1987#ifdef HAVE_STDARG_H
1988#include <stdarg.h>
1989#endif
1990
1991#ifdef HAVE_STDINT_H
1992#include <stdint.h>
1993#endif
1994
1995#include <errno.h>
1996
1997#if HAVE_SYS_PARAM_H
1998#include <sys/param.h>
1999#endif
2000
2001#ifdef HAVE_SYS_SOCKET_H
2002#include <sys/socket.h>
2003#endif
2004
2005#ifdef HAVE_SYS_UIO_H
2006#include <sys/uio.h>
2007#endif
2008
2009#ifdef HAVE_NETINET_IN_H
2010#include <netinet/in.h>
2011#endif
2012
2013#ifdef HAVE_NETINET_TCP_H
2014#include <netinet/tcp.h>
2015#endif
2016
2017#ifdef HAVE_ARPA_INET_H
2018#include <arpa/inet.h>
2019#endif
2020
2021#ifdef HAVE_WINSOCK2_H
2022#include <winsock2.h>
2023#endif
2024
2025#ifdef HAVE_WS2TCPIP_H
2026#include <ws2tcpip.h>
2027#endif
2028
2029#ifndef USE_WINSOCK
2030#define ARG_LL "%ll"
2031#else
2032#define ARG_LL "%I64"
2033#endif
2034
2035#ifndef AF_LOCAL
2036#define AF_LOCAL AF_UNIX
2037#endif
2038]
2039
2040AHX_CONFIG_FORMAT_ATTRIBUTE
2041AHX_CONFIG_UNUSED_ATTRIBUTE
2042AHX_CONFIG_FSEEKO
2043AHX_CONFIG_MAXHOSTNAMELEN
2044#if !defined(HAVE_SNPRINTF) || defined(SNPRINTF_RET_BROKEN)
2045#define snprintf snprintf_unbound
2046#define vsnprintf vsnprintf_unbound
2047#include <stdarg.h>
2048int snprintf (char *str, size_t count, const char *fmt, ...);
2049int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
2050#endif /* HAVE_SNPRINTF or SNPRINTF_RET_BROKEN */
2051AHX_CONFIG_INET_PTON(unbound)
2052AHX_CONFIG_INET_NTOP(unbound)
2053AHX_CONFIG_INET_ATON(unbound)
2054AHX_CONFIG_MEMMOVE(unbound)
2055AHX_CONFIG_STRLCAT(unbound)
2056AHX_CONFIG_STRLCPY(unbound)
2057AHX_CONFIG_GMTIME_R(unbound)
2058AHX_CONFIG_REALLOCARRAY(unbound)
2059AHX_CONFIG_W32_SLEEP
2060AHX_CONFIG_W32_USLEEP
2061AHX_CONFIG_W32_RANDOM
2062AHX_CONFIG_W32_SRANDOM
2063AHX_CONFIG_W32_FD_SET_T
2064AHX_CONFIG_IPV6_MIN_MTU
2065AHX_MEMCMP_BROKEN(unbound)
2066
2067[
2068#ifndef HAVE_CTIME_R
2069#define ctime_r unbound_ctime_r
2070char *ctime_r(const time_t *timep, char *buf);
2071#endif
2072
2073#ifndef HAVE_STRSEP
2074#define strsep unbound_strsep
2075char *strsep(char **stringp, const char *delim);
2076#endif
2077
2078#ifndef HAVE_ISBLANK
2079#define isblank unbound_isblank
2080int isblank(int c);
2081#endif
2082
2083#ifndef HAVE_EXPLICIT_BZERO
2084#define explicit_bzero unbound_explicit_bzero
2085void explicit_bzero(void* buf, size_t len);
2086#endif
2087
2088#if defined(HAVE_INET_NTOP) && !HAVE_DECL_INET_NTOP
2089const char *inet_ntop(int af, const void *src, char *dst, size_t size);
2090#endif
2091
2092#if defined(HAVE_INET_PTON) && !HAVE_DECL_INET_PTON
2093int inet_pton(int af, const char* src, void* dst);
2094#endif
2095
2096#if !defined(HAVE_STRPTIME) || !defined(STRPTIME_WORKS)
2097#define strptime unbound_strptime
2098struct tm;
2099char *strptime(const char *s, const char *format, struct tm *tm);
2100#endif
2101
2102#if !HAVE_DECL_REALLOCARRAY
2103void *reallocarray(void *ptr, size_t nmemb, size_t size);
2104#endif
2105
2106#ifdef HAVE_LIBBSD
2107#include <bsd/string.h>
2108#include <bsd/stdlib.h>
2109#endif
2110
2111#ifdef HAVE_LIBRESSL
2112#  if !HAVE_DECL_STRLCPY
2113size_t strlcpy(char *dst, const char *src, size_t siz);
2114#  endif
2115#  if !HAVE_DECL_STRLCAT
2116size_t strlcat(char *dst, const char *src, size_t siz);
2117#  endif
2118#  if !HAVE_DECL_ARC4RANDOM && defined(HAVE_ARC4RANDOM)
2119uint32_t arc4random(void);
2120#  endif
2121#  if !HAVE_DECL_ARC4RANDOM_UNIFORM && defined(HAVE_ARC4RANDOM_UNIFORM)
2122uint32_t arc4random_uniform(uint32_t upper_bound);
2123#  endif
2124#endif /* HAVE_LIBRESSL */
2125#ifndef HAVE_ARC4RANDOM
2126int getentropy(void* buf, size_t len);
2127uint32_t arc4random(void);
2128void arc4random_buf(void* buf, size_t n);
2129void _ARC4_LOCK(void);
2130void _ARC4_UNLOCK(void);
2131void _ARC4_LOCK_DESTROY(void);
2132#endif
2133#ifndef HAVE_ARC4RANDOM_UNIFORM
2134uint32_t arc4random_uniform(uint32_t upper_bound);
2135#endif
2136#ifdef COMPAT_SHA512
2137#ifndef SHA512_DIGEST_LENGTH
2138#define SHA512_BLOCK_LENGTH		128
2139#define SHA512_DIGEST_LENGTH		64
2140#define SHA512_DIGEST_STRING_LENGTH	(SHA512_DIGEST_LENGTH * 2 + 1)
2141typedef struct _SHA512_CTX {
2142	uint64_t	state[8];
2143	uint64_t	bitcount[2];
2144	uint8_t	buffer[SHA512_BLOCK_LENGTH];
2145} SHA512_CTX;
2146#endif /* SHA512_DIGEST_LENGTH */
2147void SHA512_Init(SHA512_CTX*);
2148void SHA512_Update(SHA512_CTX*, void*, size_t);
2149void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
2150unsigned char *SHA512(void* data, unsigned int data_len, unsigned char *digest);
2151#endif /* COMPAT_SHA512 */
2152
2153
2154
2155#if defined(HAVE_EVENT_H) && !defined(HAVE_EVENT_BASE_ONCE) && !(defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && (defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS))
2156   /* using version of libevent that is not threadsafe. */
2157#  define LIBEVENT_SIGNAL_PROBLEM 1
2158#endif
2159
2160#ifndef CHECKED_INET6
2161#  define CHECKED_INET6
2162#  ifdef AF_INET6
2163#    define INET6
2164#  else
2165#    define AF_INET6        28
2166#  endif
2167#endif /* CHECKED_INET6 */
2168
2169#ifndef HAVE_GETADDRINFO
2170struct sockaddr_storage;
2171#include "compat/fake-rfc2553.h"
2172#endif
2173
2174#ifdef UNBOUND_ALLOC_STATS
2175#  define malloc(s) unbound_stat_malloc_log(s, __FILE__, __LINE__, __func__)
2176#  define calloc(n,s) unbound_stat_calloc_log(n, s, __FILE__, __LINE__, __func__)
2177#  define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
2178#  define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
2179void *unbound_stat_malloc(size_t size);
2180void *unbound_stat_calloc(size_t nmemb, size_t size);
2181void unbound_stat_free(void *ptr);
2182void *unbound_stat_realloc(void *ptr, size_t size);
2183void *unbound_stat_malloc_log(size_t size, const char* file, int line,
2184	const char* func);
2185void *unbound_stat_calloc_log(size_t nmemb, size_t size, const char* file,
2186	int line, const char* func);
2187void unbound_stat_free_log(void *ptr, const char* file, int line,
2188	const char* func);
2189void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
2190	int line, const char* func);
2191#elif defined(UNBOUND_ALLOC_LITE)
2192#  include "util/alloc.h"
2193#endif /* UNBOUND_ALLOC_LITE and UNBOUND_ALLOC_STATS */
2194
2195/** default port for DNS traffic. */
2196#define UNBOUND_DNS_PORT 53
2197/** default port for DNS over TLS traffic. */
2198#define UNBOUND_DNS_OVER_TLS_PORT 853
2199/** default port for DNS over HTTPS traffic. */
2200#define UNBOUND_DNS_OVER_HTTPS_PORT 443
2201/** default port for unbound control traffic, registered port with IANA,
2202    ub-dns-control  8953/tcp    unbound dns nameserver control */
2203#define UNBOUND_CONTROL_PORT 8953
2204/** the version of unbound-control that this software implements */
2205#define UNBOUND_CONTROL_VERSION 1
2206
2207])
2208
2209dnl if we build from source tree, the man pages need @date@ and @version@
2210dnl if this is a distro tarball, that was already done by makedist.sh
2211AC_SUBST(version, [VERSION_MAJOR.VERSION_MINOR.VERSION_MICRO])
2212AC_SUBST(date, [`date +'%b %e, %Y'`])
2213
2214AC_CONFIG_FILES([Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h dnscrypt/dnscrypt_config.h contrib/libunbound.pc contrib/unbound.socket contrib/unbound.service contrib/unbound_portable.service])
2215AC_CONFIG_HEADERS([config.h])
2216AC_OUTPUT
2217