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