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