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