xref: /freebsd/contrib/ldns/configure.ac (revision 580744621f33383027108364dcadad718df46ffe)
1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3AC_PREREQ(2.56)
4sinclude(acx_nlnetlabs.m4)
5
6# must be numbers. ac_defun because of later processing.
7m4_define([VERSION_MAJOR],[1])
8m4_define([VERSION_MINOR],[7])
9m4_define([VERSION_MICRO],[0])
10AC_INIT(ldns, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), libdns@nlnetlabs.nl, libdns)
11AC_CONFIG_SRCDIR([packet.c])
12# needed to build correct soname
13AC_SUBST(LDNS_VERSION_MAJOR, [VERSION_MAJOR])
14AC_SUBST(LDNS_VERSION_MINOR, [VERSION_MINOR])
15AC_SUBST(LDNS_VERSION_MICRO, [VERSION_MICRO])
16
17# Library version
18# ---------------
19# current:revision:age
20# (binary-api-number):(which-binary-api-version):(how-many-nrs-backwardscompat)
21# if source code changes increment revision
22# if any interfaces have been added/removed/changed since last update then
23#   increment current and set revision to 0
24# if any interfaces have been added since the last public release then increment age
25# if any interfaces have been removed or changed since the last public release then
26#   set age to 0
27#
28# ldns-1.6.17 and before had a .so with version same as VERSION_INFO
29# ldns-1.7.0 will have libversion 2:0:0
30#
31AC_SUBST(VERSION_INFO, [2:0:0])
32
33AC_AIX
34if test "$ac_cv_header_minix_config_h" = "yes"; then
35	AC_DEFINE(_NETBSD_SOURCE,1, [Enable for compile on Minix])
36fi
37LT_INIT
38AC_CONFIG_MACRO_DIR([m4])
39
40OURCPPFLAGS=''
41CPPFLAGS=${CPPFLAGS:-${OURCPPFLAGS}}
42CFLAGS="$CFLAGS"
43
44# Checks for programs.
45AC_PROG_CC
46ACX_DEPFLAG
47AC_PROG_MAKE_SET
48
49# Extra (sp)lint flags for NetBSD
50AC_CANONICAL_HOST
51case "$host_os" in
52	netbsd*) LINTFLAGS="'-D__RENAME(x)=' -D_NETINET_IN_H_ $LINTFLAGS"
53		 ;;
54	*)       LINTFLAGS="$LINTFLAGS"
55		 ;;
56esac
57AC_SUBST(LINTFLAGS)
58
59AC_DEFINE(WINVER, 0x0502, [the version of the windows API enabled])
60
61ACX_CHECK_COMPILER_FLAG(std=c99, [C99FLAG="-std=c99"])
62ACX_CHECK_COMPILER_FLAG(xc99, [C99FLAG="-xc99"])
63
64# routine to copy files
65# argument 1 is a list of files (relative to the source dir)
66# argument 2 is a destination directory (relative to the current
67# working directory
68AC_DEFUN([COPY_FILES],
69[
70for file in $1; do
71	sh $srcdir/install-sh -m 644 $file $2
72done
73])
74
75# copy all .h files in the dir at argument 1
76# (relative to source) to the dir at argument 2
77# (relative to current dir)
78AC_DEFUN([COPY_HEADER_FILES],
79[
80echo "copying header files"
81COPY_FILES($srcdir/$1/*.h, $2)
82])
83
84# Checks for typedefs, structures, and compiler characteristics.
85AC_C_CONST
86AC_LANG_C
87if test "x$CFLAGS" = "x" ; then
88ACX_CHECK_COMPILER_FLAG(g, [CFLAGS="-g"])
89ACX_CHECK_COMPILER_FLAG(O2, [CFLAGS="-O2 $CFLAGS"])
90fi
91ACX_CHECK_COMPILER_FLAG(Wall, [CFLAGS="-Wall $CFLAGS"])
92ACX_CHECK_COMPILER_FLAG(W, [CFLAGS="-W $CFLAGS"])
93ACX_CHECK_COMPILER_FLAG(Wwrite-strings, [CFLAGS="-Wwrite-strings $CFLAGS"])
94ACX_CHECK_COMPILER_FLAG(Wstrict-prototypes, [CFLAGS="-Wstrict-prototypes $CFLAGS"])
95#ACX_CHECK_COMPILER_FLAG(Wshadow, [CFLAGS="-Wshadow $CFLAGS"])
96ACX_CHECK_COMPILER_FLAG(Wunused-function, [CFLAGS="-Wunused-function $CFLAGS"])
97ACX_CHECK_COMPILER_FLAG(Wmissing-prototypes, [CFLAGS="-Wmissing-prototypes $CFLAGS"])
98
99AC_CHECK_HEADERS([getopt.h time.h],,, [AC_INCLUDES_DEFAULT])
100
101# MinGW32 tests
102AC_CHECK_HEADERS([winsock2.h ws2tcpip.h],,, [AC_INCLUDES_DEFAULT])
103# end mingw32 tests
104
105ACX_DETERMINE_EXT_FLAGS_UNBOUND
106
107AC_C_INLINE
108AC_CHECK_TYPE(int8_t, char)
109AC_CHECK_TYPE(int16_t, short)
110AC_CHECK_TYPE(int32_t, int)
111AC_CHECK_TYPE(int64_t, long long)
112AC_CHECK_TYPE(uint8_t, unsigned char)
113AC_CHECK_TYPE(uint16_t, unsigned short)
114AC_CHECK_TYPE(uint32_t, unsigned int)
115AC_CHECK_TYPE(uint64_t, unsigned long long)
116
117# my own checks
118AC_CHECK_PROG(doxygen, doxygen, doxygen)
119
120# check to see if libraries are needed for these functions.
121AC_SEARCH_LIBS([socket], [socket])
122AC_SEARCH_LIBS([inet_pton], [nsl])
123
124
125AC_ARG_WITH(drill, AC_HELP_STRING([--with-drill],
126 [Also build drill.]),
127 [],[with_drill="no"])
128if test x_$with_drill != x_no ; then
129	AC_SUBST(DRILL,[drill])
130	AC_SUBST(INSTALL_DRILL,[install-drill])
131	AC_SUBST(UNINSTALL_DRILL,[uninstall-drill])
132	AC_SUBST(CLEAN_DRILL,[clean-drill])
133	AC_SUBST(LINT_DRILL,[lint-drill])
134	if test -e $srcdir/drill/config.h -o -e drill/config.h ; then
135		AC_MSG_ERROR([
136A config.h was detected in the drill subdirectory.
137This does not work with the --with-drill option.
138Please remove the config.h from the drill subdirectory
139or do not use the --with-drill option.])
140	fi
141else
142	AC_SUBST(DRILL,[""])
143	AC_SUBST(INSTALL_DRILL,[""])
144	AC_SUBST(UNINSTALL_DRILL,[""])
145	AC_SUBST(CLEAN_DRILL,[""])
146	AC_SUBST(LINT_DRILL,[""])
147fi
148
149
150AC_ARG_WITH(examples, AC_HELP_STRING([--with-examples],
151 [Also build examples.]),
152 [],[with_examples="no"])
153if test x_$with_examples != x_no ; then
154	AC_SUBST(EXAMPLES,[examples])
155	AC_SUBST(INSTALL_EXAMPLES,[install-examples])
156	AC_SUBST(UNINSTALL_EXAMPLES,[uninstall-examples])
157	AC_SUBST(CLEAN_EXAMPLES,[clean-examples])
158	AC_SUBST(LINT_EXAMPLES,[lint-examples])
159	if test -e $srcdir/examples/config.h -o -e examples/config.h ; then
160		AC_MSG_ERROR([
161A config.h was detected in the examples subdirectory.
162This does not work with the --with-examples option.
163Please remove the config.h from the examples subdirectory
164or do not use the --with-examples option.])
165	fi
166else
167	AC_SUBST(EXAMPLES,[""])
168	AC_SUBST(INSTALL_EXAMPLES,[""])
169	AC_SUBST(UNINSTALL_EXAMPLES,[""])
170	AC_SUBST(CLEAN_EXAMPLES,[""])
171	AC_SUBST(LINT_EXAMPLES,[""])
172fi
173
174# add option to disable installation of ldns-config script
175AC_ARG_ENABLE(ldns-config, AC_HELP_STRING([--disable-ldns-config], [disable installation of ldns-config (default=enabled)]),
176	enable_ldns_config=$enableval, enable_ldns_config=yes)
177if test "x$enable_ldns_config" = xyes; then
178	AC_SUBST(INSTALL_CONFIG, [install-config])
179	AC_SUBST(INSTALL_CONFIG_MANPAGE, [install-config-manpage])
180	AC_SUBST(UNINSTALL_CONFIG, [uninstall-config])
181	AC_SUBST(UNINSTALL_CONFIG_MANPAGE, [uninstall-config-manpage])
182else
183	AC_SUBST(INSTALL_CONFIG, [""])
184	AC_SUBST(INSTALL_CONFIG_MANPAGE, [""])
185	AC_SUBST(UNINSTALL_CONFIG, [""])
186	AC_SUBST(UNINSTALL_CONFIG_MANPAGE, [""])
187fi
188
189# add option to disable library printing to stderr
190AC_ARG_ENABLE(stderr-msgs, AC_HELP_STRING([--enable-stderr-msgs], [Enable printing to stderr (default=disabled)]), enable_stderr_msgs=$enableval, enable_stderr_msgs=no)
191case "$enable_stderr_msgs" in
192    no) dnl default
193        ;;
194    *)
195        AC_DEFINE_UNQUOTED([STDERR_MSGS], [1], [Define this to enable messages to stderr.])
196        ;;
197esac
198
199AX_HAVE_POLL(
200  [AX_CONFIG_FEATURE_ENABLE(poll)],
201  [AX_CONFIG_FEATURE_DISABLE(poll)])
202AX_CONFIG_FEATURE(
203  [poll], [This platform supports poll(7)],
204  [HAVE_POLL], [This platform supports poll(7).])
205
206# check for python
207PYTHON_X_CFLAGS=""
208ldns_with_pyldns=no
209ldns_with_pyldnsx=no
210AC_ARG_WITH(pyldns, AC_HELP_STRING([--with-pyldns],
211 [generate python library, or --without-pyldns to disable Python support.]),
212 [],[ withval="no" ])
213ldns_have_python=no
214if test x_$withval != x_no; then
215   sinclude(ax_python_devel.m4)
216   ac_save_LIBS="$LIBS" dnl otherwise AC_PYTHON_DEVEL thrashes $LIBS
217
218   AX_PYTHON_DEVEL([>= '2.4.0'])
219   if test ! -z "$ac_python_version"; then
220	ldns_have_python=yes
221   fi
222
223   # pass additional Python 3 option to SWIG
224   if test `$PYTHON -c "import sys; \
225       ver = sys.version.split()[[0]]; \
226       print(ver >= '3')"` = "True"; then
227       AC_SUBST(SWIGPY3, ["-py3 -DPY3"])
228   fi
229
230   # check for SWIG
231   if test x_$ldns_have_python != x_no; then
232        sinclude(ax_pkg_swig.m4)
233
234        # check for >=SWIG-2.0.4 if Python 3.2 used
235        if test `$PYTHON -c "import sys; \
236            ver = sys.version.split()[[0]]; \
237            print(ver >= '3.2')"` = "True"; then
238            AX_PKG_SWIG(2.0.4, [], [AC_MSG_ERROR([SWIG-2.0.4 is required to build pyldns for Python 3.2 and greater.])])
239        else
240            AX_PKG_SWIG
241        fi
242
243	if test ! -x "$SWIG"; then
244		AC_MSG_ERROR([failed to find SWIG tool, install it, or do not build pyldns])
245	else
246		AC_DEFINE(HAVE_SWIG,1,[Define if you have SWIG libraries and header files.])
247		AC_SUBST(PYLDNS, "pyldns")
248		AC_SUBST(swig, "$SWIG")
249		ldns_with_pyldns=yes
250	fi
251   else
252	AC_MSG_RESULT([*** don't have Python, skipping SWIG, no pyldns ***]) # '
253   fi
254
255   # xtra cflags for pyldns
256   if test x_$ldns_have_python != x_no; then
257	ACX_CHECK_COMPILER_FLAG(fno-strict-aliasing, [PYTHON_X_CFLAGS="-fno-strict-aliasing"])
258	ACX_CHECK_COMPILER_FLAG(Wno-missing-field-initializers, [PYTHON_X_CFLAGS="-Wno-missing-field-initializers $PYTHON_X_CFLAGS"])
259	ACX_CHECK_COMPILER_FLAG(Wno-unused-parameter, [PYTHON_X_CFLAGS="-Wno-unused-parameter $PYTHON_X_CFLAGS"])
260	ACX_CHECK_COMPILER_FLAG(Wno-unused-variable, [PYTHON_X_CFLAGS="-Wno-unused-variable $PYTHON_X_CFLAGS"])
261   fi
262fi
263AC_SUBST(PYTHON_X_CFLAGS)
264
265# Check for pyldnsx
266AC_ARG_WITH(pyldnsx, AC_HELP_STRING([--without-pyldnsx],
267  [Do not install the ldnsx python module, or --with-pyldnsx to install it.]),
268  [],[ withval="with_pyldns" ])
269if test x_$withval != x_no; then
270  if test x_$ldns_with_pyldns != x_no; then
271    AC_SUBST(PYLDNSX, "pyldnsx")
272    ldns_with_pyldnsx=yes
273  else
274    if test x_$withval != x_with_pyldns; then
275      AC_MSG_ERROR([--with-pyldns is needed for the ldnsx python module])
276    fi
277  fi
278fi
279
280if test x_$ldns_with_pyldns != x_no; then
281  AC_SUBST(PYLDNSINST, "install-pyldns")dnl
282  AC_SUBST(PYLDNSUNINST, "uninstall-pyldns")
283else
284  AC_SUBST(PYLDNSINST, "")dnl
285  AC_SUBST(PYLDNSUNINST, "")
286fi
287if test x_$ldns_with_pyldnsx != x_no; then
288  AC_SUBST(PYLDNSXINST, "install-pyldnsx")dnl
289  AC_SUBST(PYLDNSXUNINST, "uninstall-pyldnsx")
290else
291  AC_SUBST(PYLDNSXINST, "")dnl
292  AC_SUBST(PYLDNSXUNINST, "")
293fi
294
295# check for perl
296ldns_with_p5_dns_ldns=no
297AC_ARG_WITH(p5-dns-ldns, AC_HELP_STRING([--with-p5-dns-ldns],
298 [generate DNS::LDNS perl bindings]),
299 [],[ withval="no" ])
300ldns_have_perl=no
301if test x_$withval != x_no; then
302   AC_PATH_PROG([PERL], [perl])
303   if test -z "$PERL"; then
304      AC_MSG_ERROR([Cannot find perl in your system path])
305   fi
306   AC_SUBST(P5_DNS_LDNS, "p5-dns-ldns")dnl
307   AC_SUBST(TEST_P5_DNS_LDNS, "test-p5-dns-ldns")dnl
308   AC_SUBST(INSTALL_P5_DNS_LDNS, "install-p5-dns-ldns")dnl
309   AC_SUBST(UNINSTALL_P5_DNS_LDNS, "uninstall-p5-dns-ldns")dnl
310   AC_SUBST(CLEAN_P5_DNS_LDNS, "clean-p5-dns-ldns")
311else
312   AC_SUBST(P5_DNS_LDNS, "")dnl
313   AC_SUBST(TEST_P5_DNS_LDNS, "")dnl
314   AC_SUBST(INSTALL_P5_DNS_LDNS, "")dnl
315   AC_SUBST(UNINSTALL_P5_DNS_LDNS, "")dnl
316   AC_SUBST(CLEAN_P5_DNS_LDNS, "")
317fi
318
319# Use libtool
320ACX_LIBTOOL_C_ONLY
321
322tmp_CPPFLAGS=$CPPFLAGS
323tmp_LDFLAGS=$LDFLAGS
324tmp_LIBS=$LIBS
325
326ACX_WITH_SSL_OPTIONAL
327AC_MSG_CHECKING([for LibreSSL])
328if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
329	AC_MSG_RESULT([yes])
330	AC_DEFINE([HAVE_LIBRESSL], [1], [Define if we have LibreSSL])
331else
332	AC_MSG_RESULT([no])
333fi
334AC_CHECK_FUNCS([EVP_sha256 EVP_sha384 EVP_sha512 ENGINE_load_cryptodev EVP_PKEY_keygen ECDSA_SIG_get0 EVP_MD_CTX_new EVP_PKEY_base_id DSA_SIG_set0 DSA_SIG_get0 EVP_dss1 DSA_get0_pqg DSA_get0_key])
335
336# for macosx, see if glibtool exists and use that
337# BSD's need to know the version...
338#AC_CHECK_PROG(glibtool, glibtool, [glibtool], )
339#AC_CHECK_PROGS(libtool, [libtool15 libtool], [./libtool])
340
341AC_ARG_ENABLE(sha2, AC_HELP_STRING([--disable-sha2], [Disable SHA256 and SHA512 RRSIG support]))
342case "$enable_sha2" in
343    no)
344        ;;
345    yes|*)
346        if test "x$HAVE_SSL" != "xyes"; then
347            AC_MSG_ERROR([SHA2 enabled, but no SSL support])
348        fi
349	AC_MSG_CHECKING(for SHA256 and SHA512)
350	AC_CHECK_FUNC(SHA256_Init, [], [
351		AC_MSG_ERROR([No SHA2 functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-sha2])
352		])
353	AC_DEFINE_UNQUOTED([USE_SHA2], [1], [Define this to enable SHA256 and SHA512 support.])
354        ;;
355esac
356
357# check wether gost also works
358AC_DEFUN([AC_CHECK_GOST_WORKS],
359[AC_REQUIRE([AC_PROG_CC])
360AC_MSG_CHECKING([if GOST works])
361if test c${cross_compiling} = cno; then
362BAKCFLAGS="$CFLAGS"
363if test -n "$ssldir"; then
364	CFLAGS="$CFLAGS -Wl,-rpath,$ssldir/lib"
365fi
366AC_RUN_IFELSE([AC_LANG_SOURCE([[
367#include <string.h>
368#include <openssl/ssl.h>
369#include <openssl/evp.h>
370#include <openssl/engine.h>
371#include <openssl/conf.h>
372/* routine to load gost (from sldns) */
373int load_gost_id(void)
374{
375	static int gost_id = 0;
376	const EVP_PKEY_ASN1_METHOD* meth;
377	ENGINE* e;
378
379	if(gost_id) return gost_id;
380
381	/* see if configuration loaded gost implementation from other engine*/
382	meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1);
383	if(meth) {
384		EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
385		return gost_id;
386	}
387
388	/* see if engine can be loaded already */
389	e = ENGINE_by_id("gost");
390	if(!e) {
391		/* load it ourself, in case statically linked */
392		ENGINE_load_builtin_engines();
393		ENGINE_load_dynamic();
394		e = ENGINE_by_id("gost");
395	}
396	if(!e) {
397		/* no gost engine in openssl */
398		return 0;
399	}
400	if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
401		ENGINE_finish(e);
402		ENGINE_free(e);
403		return 0;
404	}
405
406	meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1);
407	if(!meth) {
408		/* algo not found */
409		ENGINE_finish(e);
410		ENGINE_free(e);
411		return 0;
412	}
413	EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
414	return gost_id;
415}
416int main(void) {
417	EVP_MD_CTX* ctx;
418	const EVP_MD* md;
419	unsigned char digest[64]; /* its a 256-bit digest, so uses 32 bytes */
420	const char* str = "Hello world";
421	const unsigned char check[] = {
422		0x40 , 0xed , 0xf8 , 0x56 , 0x5a , 0xc5 , 0x36 , 0xe1 ,
423		0x33 , 0x7c , 0x7e , 0x87 , 0x62 , 0x1c , 0x42 , 0xe0 ,
424		0x17 , 0x1b , 0x5e , 0xce , 0xa8 , 0x46 , 0x65 , 0x4d ,
425		0x8d , 0x3e , 0x22 , 0x9b , 0xe1 , 0x30 , 0x19 , 0x9d
426	};
427	OPENSSL_config(NULL);
428	(void)load_gost_id();
429	md = EVP_get_digestbyname("md_gost94");
430	if(!md) return 1;
431	memset(digest, 0, sizeof(digest));
432	ctx = EVP_MD_CTX_create();
433	if(!ctx) return 2;
434	if(!EVP_DigestInit_ex(ctx, md, NULL)) return 3;
435	if(!EVP_DigestUpdate(ctx, str, 10)) return 4;
436	if(!EVP_DigestFinal_ex(ctx, digest, NULL)) return 5;
437	/* uncomment to see the hash calculated.
438		{int i;
439		for(i=0; i<32; i++)
440			printf(" %2.2x", (int)digest[i]);
441		printf("\n");}
442	*/
443	if(memcmp(digest, check, sizeof(check)) != 0)
444		return 6;
445	return 0;
446}
447]])] , [eval "ac_cv_c_gost_works=yes"], [eval "ac_cv_c_gost_works=no"])
448CFLAGS="$BAKCFLAGS"
449else
450eval "ac_cv_c_gost_works=maybe"
451fi
452])dnl
453
454AC_ARG_ENABLE(gost, AC_HELP_STRING([--disable-gost], [Disable GOST support]))
455case "$enable_gost" in
456    no)
457        ;;
458    *)  dnl default
459        if test "x$HAVE_SSL" != "xyes"; then
460            AC_MSG_ERROR([GOST enabled, but no SSL support])
461        fi
462        AC_MSG_CHECKING(for GOST)
463        AC_CHECK_FUNC(EVP_PKEY_set_type_str, [],[AC_MSG_ERROR([OpenSSL >= 1.0.0 is needed for GOST support or rerun with --disable-gost])])
464        AC_CHECK_FUNC(EC_KEY_new, [], [AC_MSG_ERROR([No ECC functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-gost])])
465	AC_CHECK_GOST_WORKS
466	AC_ARG_ENABLE(gost-anyway, AC_HELP_STRING([--enable-gost-anyway], [Enable GOST even whithout a GOST engine installed]))
467	if test "$ac_cv_c_gost_works" != "no" -o "$enable_gost_anyway" = "yes"; then
468		if test "$ac_cv_c_gost_works" = "no"; then
469			AC_MSG_RESULT([no, but compiling with GOST support anyway])
470		else
471			AC_MSG_RESULT([yes])
472		fi
473		use_gost="yes"
474		AC_DEFINE([USE_GOST], [1], [Define this to enable GOST support.])
475	else
476		AC_MSG_RESULT([no])
477		AC_MSG_WARN([Gost support does not work because the engine is missing.])
478		AC_MSG_WARN([Install gost-engine first or use the --enable-gost-anyway to compile with GOST support anyway])
479		AC_MSG_WARN([See also https://github.com/gost-engine/engine/wiki for information about gost-engine])
480	fi
481        ;;
482esac
483
484AC_ARG_ENABLE(ecdsa, AC_HELP_STRING([--disable-ecdsa], [Disable ECDSA support]))
485case "$enable_ecdsa" in
486    no)
487      ;;
488    *) dnl default
489      if test "x$HAVE_SSL" != "xyes"; then
490        AC_MSG_ERROR([ECDSA enabled, but no SSL support])
491      fi
492      AC_CHECK_FUNC(ECDSA_sign, [], [AC_MSG_ERROR([OpenSSL does not support ECDSA: please upgrade OpenSSL or rerun with --disable-ecdsa])])
493      AC_CHECK_FUNC(SHA384_Init, [], [AC_MSG_ERROR([OpenSSL does not support SHA384: please upgrade OpenSSL or rerun with --disable-ecdsa])])
494      AC_CHECK_DECLS([NID_X9_62_prime256v1, NID_secp384r1], [], [AC_MSG_ERROR([OpenSSL does not support the ECDSA curves: please upgrade OpenSSL or rerun with --disable-ecdsa])], [AC_INCLUDES_DEFAULT
495#include <openssl/evp.h>
496      ])
497      # we now know we have ECDSA and the required curves.
498      AC_DEFINE_UNQUOTED([USE_ECDSA], [1], [Define this to enable ECDSA support.])
499      ;;
500esac
501
502AC_ARG_ENABLE(dsa, AC_HELP_STRING([--disable-dsa], [Disable DSA support]))
503case "$enable_dsa" in
504    no)
505      ;;
506    *) dnl default
507      # detect if DSA is supported, and turn it off if not.
508      AC_CHECK_FUNC(DSA_SIG_new, [
509	AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
510      ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
511	  fi ])
512      ;;
513esac
514
515AC_ARG_ENABLE(ed25519, AC_HELP_STRING([--enable-ed25519], [Enable ED25519 support (experimental)]))
516case "$enable_ed25519" in
517    yes)
518      if test "x$HAVE_SSL" != "xyes"; then
519        AC_MSG_ERROR([ED25519 enabled, but no SSL support])
520      fi
521      AC_CHECK_DECLS([NID_X25519], [], [AC_MSG_ERROR([OpenSSL does not support the EDDSA curve: please upgrade OpenSSL or rerun with --disable-ed25519])], [AC_INCLUDES_DEFAULT
522#include <openssl/evp.h>
523      ])
524      AC_DEFINE_UNQUOTED([USE_ED25519], [1], [Define this to enable ED25519 support.])
525      ;;
526    *|no) dnl default
527      ;;
528esac
529
530AC_ARG_ENABLE(ed448, AC_HELP_STRING([--enable-ed448], [Enable ED448 support (experimental)]))
531case "$enable_ed448" in
532    yes)
533      if test "x$HAVE_SSL" != "xyes"; then
534        AC_MSG_ERROR([ED448 enabled, but no SSL support])
535      fi
536      AC_CHECK_DECLS([NID_X448], [], [AC_MSG_ERROR([OpenSSL does not support the EDDSA curve: please upgrade OpenSSL or rerun with --disable-ed448])], [AC_INCLUDES_DEFAULT
537#include <openssl/evp.h>
538      ])
539      AC_DEFINE_UNQUOTED([USE_ED448], [1], [Define this to enable ED448 support.])
540      ;;
541    *|no) dnl default
542      ;;
543esac
544
545AC_ARG_ENABLE(dane, AC_HELP_STRING([--disable-dane], [Disable DANE support]))
546AC_ARG_ENABLE(dane-verify, AC_HELP_STRING([--disable-dane-verify], [Disable DANE verify support]))
547AC_ARG_ENABLE(dane-ta-usage, AC_HELP_STRING([--disable-dane-ta-usage], [Disable DANE-TA usage type support]))
548
549AC_ARG_ENABLE(full-dane,, [
550	enable_dane_ta_usage=yes
551	enable_dane_verify=yes
552	enable_dane=yes
553])
554AC_ARG_ENABLE(no-dane-ta-usage,, [
555	enable_dane_ta_usage=no
556	enable_dane_verify=yes
557	enable_dane=yes
558])
559AC_ARG_ENABLE(no-dane-verify,, [
560	enable_dane_ta_usage=no
561	enable_dane_verify=no
562	enable_dane=yes
563])
564case "$enable_dane" in
565    no)
566      AC_SUBST(ldns_build_config_use_dane, 0)
567      AC_SUBST(ldns_build_config_use_dane_verify, 0)
568      AC_SUBST(ldns_build_config_use_dane_ta_usage, 0)
569      ;;
570    *) dnl default
571      if test "x$HAVE_SSL" != "xyes"; then
572        AC_MSG_ERROR([DANE enabled, but no SSL support])
573      fi
574      AC_CHECK_FUNC(X509_check_ca, [], [AC_MSG_ERROR([OpenSSL does not support DANE: please upgrade OpenSSL or rerun with --disable-dane])])
575      AC_SUBST(ldns_build_config_use_dane, 1)
576      AC_DEFINE_UNQUOTED([USE_DANE], [1], [Define this to enable DANE support.])
577      case "$enable_dane_verify" in
578          no)
579            AC_SUBST(ldns_build_config_use_dane_verify, 0)
580            AC_SUBST(ldns_build_config_use_dane_ta_usage, 0)
581	    ;;
582	  *)
583	    AC_SUBST(ldns_build_config_use_dane_verify, 1)
584	    AC_DEFINE_UNQUOTED([USE_DANE_VERIFY], [1], [Define this to enable DANE verify support.])
585            case "$enable_dane_ta_usage" in
586                no)
587                  AC_SUBST(ldns_build_config_use_dane_ta_usage, 0)
588                  ;;
589                *) dnl default
590      	    LIBS="-lssl $LIBS"
591                  AC_CHECK_FUNC(SSL_get0_dane, [], [AC_MSG_ERROR([OpenSSL does not support offline DANE verification (Needed for the DANE-TA usage type).  Please upgrade OpenSSL to version >= 1.1.0 or rerun with --disable-dane-verify or --disable-dane-ta-usage])])
592                  LIBSSL_LIBS="$LIBSSL_LIBS -lssl"
593                  AC_SUBST(ldns_build_config_use_dane_ta_usage, 1)
594                  AC_DEFINE_UNQUOTED([USE_DANE_TA_USAGE], [1], [Define this to enable DANE-TA usage type support.])
595                  ;;
596            esac
597      esac
598      ;;
599esac
600
601AC_ARG_ENABLE(rrtype-ninfo, AC_HELP_STRING([--enable-rrtype-ninfo], [Enable draft RR type ninfo.]))
602case "$enable_rrtype_ninfo" in
603	yes)
604		AC_DEFINE_UNQUOTED([RRTYPE_NINFO], [], [Define this to enable RR type NINFO.])
605		;;
606	no|*)
607		;;
608esac
609AC_ARG_ENABLE(rrtype-rkey, AC_HELP_STRING([--enable-rrtype-rkey], [Enable draft RR type rkey.]))
610case "$enable_rrtype_rkey" in
611	yes)
612		AC_DEFINE_UNQUOTED([RRTYPE_RKEY], [], [Define this to enable RR type RKEY.])
613		;;
614	no|*)
615		;;
616esac
617AC_ARG_ENABLE(rrtype-openpgpkey, AC_HELP_STRING([--disable-rrtype-openpgpkey], [Disable openpgpkey RR type.]))
618case "$enable_rrtype_openpgpkey" in
619	no)
620		;;
621	yes|*)
622		AC_DEFINE_UNQUOTED([RRTYPE_OPENPGPKEY], [], [Define this to enable RR type OPENPGPKEY.])
623		;;
624esac
625AC_ARG_ENABLE(rrtype-ta, AC_HELP_STRING([--enable-rrtype-ta], [Enable draft RR type ta.]))
626case "$enable_rrtype_ta" in
627	yes)
628		AC_DEFINE_UNQUOTED([RRTYPE_TA], [], [Define this to enable RR type TA.])
629		;;
630	no|*)
631		;;
632esac
633AC_ARG_ENABLE(rrtype-avc, AC_HELP_STRING([--enable-rrtype-avc], [Enable draft RR type avc.]))
634case "$enable_rrtype_avc" in
635	yes)
636		AC_DEFINE_UNQUOTED([RRTYPE_AVC], [], [Define this to enable RR type AVC.])
637		;;
638	no|*)
639		;;
640esac
641
642AC_SUBST(LIBSSL_CPPFLAGS)
643AC_SUBST(LIBSSL_LDFLAGS)
644AC_SUBST(LIBSSL_LIBS)
645if test "x$HAVE_SSL" = "xyes"; then
646AC_SUBST(LIBSSL_SSL_LIBS, ["-lssl $LIBSSL_LIBS"])
647fi
648CPPFLAGS=$tmp_CPPFLAGS
649LDFLAGS=$tmp_LDFLAGS
650LIBS=$tmp_LIBS
651
652
653# add option to disable the evil rpath
654ACX_ARG_RPATH
655
656#AC_RUN_IFELSE([AC_LANG_SOURCE(
657#[
658#int main()
659#{
660#short one = 1;
661#char *cp = (char*)&one;
662#if ( *cp == 0 )
663#return(0);
664#else
665#return(1);
666#}
667#])], [],[
668#AC_DEFINE(CONFCHECK_LITTLE_ENDIAN, 1, [system appears to be little-endian])
669#],[])
670
671# should define WORDS_BIGENDIAN if the system is big-endian
672AC_C_BIGENDIAN
673
674# Checks for header files.
675AC_HEADER_STDC
676AC_HEADER_STDBOOL
677#AC_HEADER_SYS_WAIT
678#AC_CHECK_HEADERS([getopt.h fcntl.h stdlib.h string.h strings.h unistd.h])
679# do the very minimum - we can always extend this
680AC_CHECK_HEADERS([getopt.h stdarg.h openssl/ssl.h netinet/in.h time.h arpa/inet.h netdb.h],,, [AC_INCLUDES_DEFAULT])
681AC_CHECK_HEADERS(sys/param.h sys/mount.h,,,
682[AC_INCLUDES_DEFAULT
683  [
684   #if HAVE_SYS_PARAM_H
685   # include <sys/param.h>
686   #endif
687  ]
688])
689AC_CHECK_HEADER(sys/socket.h,
690[
691include_sys_socket_h='#include <sys/socket.h>'
692AC_DEFINE(HAVE_SYS_SOCKET_H, 1, [define if you have sys/socket.h])
693],[
694include_sys_socket_h=''
695],[AC_INCLUDES_DEFAULT
696  [
697   #if HAVE_SYS_PARAM_H
698   # include <sys/param.h>
699   #endif
700  ]
701])
702AC_SUBST(include_sys_socket_h)
703AC_CHECK_HEADER(inttypes.h,
704[
705include_inttypes_h='#include <inttypes.h>'
706AC_DEFINE(HAVE_INTTYPES_H, 1, [define if you have inttypes.h])
707AC_SUBST(ldns_build_config_have_inttypes_h, 1)
708],[
709include_inttypes_h=''
710AC_SUBST(ldns_build_config_have_inttypes_h, 0)
711],[AC_INCLUDES_DEFAULT
712])
713AC_SUBST(include_inttypes_h)
714AC_CHECK_HEADER(sys/types.h,
715[
716include_systypes_h='#include <sys/types.h>'
717AC_DEFINE(HAVE_SYS_TYPES_H, 1, [define if you have sys/types.h])
718],[
719include_systypes_h=''
720],[AC_INCLUDES_DEFAULT
721])
722AC_SUBST(include_systypes_h)
723AC_CHECK_HEADER(unistd.h,
724[
725include_unistd_h='#include <unistd.h>'
726AC_DEFINE(HAVE_UNISTD_H, 1, [define if you have unistd.h])
727],[
728include_unistd_h=''
729],[AC_INCLUDES_DEFAULT
730])
731AC_SUBST(include_unistd_h)
732
733AC_CHECK_SIZEOF(time_t,,[
734AC_INCLUDES_DEFAULT
735#ifdef TIME_WITH_SYS_TIME
736# include <sys/time.h>
737# include <time.h>
738#else
739# ifdef HAVE_SYS_TIME_H
740#  include <sys/time.h>
741# else
742#  include <time.h>
743# endif
744#endif
745])
746
747if test x_$with_examples != x_no; then
748AC_CHECK_HEADERS([pcap.h],,, [AC_INCLUDES_DEFAULT])
749AC_CHECK_LIB(pcap, pcap_open_offline, [
750	AC_DEFINE([HAVE_LIBPCAP], [1], [Define to 1 if you have the `pcap' library (-lpcap).])dnl`
751	AC_SUBST([LIBPCAP_LIBS], [-lpcap])
752    ], [
753	AC_MSG_WARN([Can't find pcap library (needed for ldns-dpa, will not build dpa now.)])dnl'
754	AC_SUBST([LIBPCAP_LIBS], [])
755    ]
756)
757AC_CHECK_HEADERS([netinet/in_systm.h net/if.h netinet/ip.h netinet/udp.h netinet/igmp.h netinet/if_ether.h netinet/ip6.h net/ethernet.h netinet/ip_compat.h],,, [
758AC_INCLUDES_DEFAULT
759#ifdef HAVE_NETINET_IN_SYSTM_H
760#include <netinet/in_systm.h>
761#endif
762#ifdef HAVE_NETINET_IN_H
763#include <netinet/in.h>
764#endif
765#ifdef HAVE_SYS_SOCKET_H
766#include <sys/socket.h>
767#endif
768#ifdef HAVE_NET_IF_H
769#include <net/if.h>
770#endif])
771fi
772
773ACX_TYPE_SOCKLEN_T
774if test "x$ac_cv_type_socklen_t" = xyes; then
775  AC_SUBST(ldns_build_config_have_socklen_t, 1)
776else
777  AC_SUBST(ldns_build_config_have_socklen_t, 0)
778fi
779AC_TYPE_SIZE_T
780AC_CHECK_TYPE(ssize_t, int)
781dnl AC_TYPE_INTPTR_T does not work on all platforms (autoconf)
782AC_CHECK_TYPE(intptr_t, size_t)
783AC_CHECK_TYPE(in_addr_t, [], [AC_DEFINE([in_addr_t], [uint32_t], [in_addr_t])], [
784#if HAVE_SYS_TYPES_H
785# include <sys/types.h>
786#endif
787#if HAVE_NETINET_IN_H
788# include <netinet/in.h>
789#endif])
790AC_CHECK_TYPE(in_port_t, [], [AC_DEFINE([in_port_t], [uint16_t], [in_port_t])], [
791#if HAVE_SYS_TYPES_H
792# include <sys/types.h>
793#endif
794#if HAVE_NETINET_IN_H
795# include <netinet/in.h>
796#endif])
797ACX_CHECK_SS_FAMILY
798
799AC_FUNC_MALLOC
800AC_FUNC_REALLOC
801
802AC_REPLACE_FUNCS(b64_pton)
803AC_REPLACE_FUNCS(b64_ntop)
804AC_REPLACE_FUNCS(calloc)
805AC_REPLACE_FUNCS(timegm)
806AC_REPLACE_FUNCS(gmtime_r)
807AC_REPLACE_FUNCS(ctime_r)
808AC_REPLACE_FUNCS(localtime_r)
809AC_REPLACE_FUNCS(isblank)
810AC_REPLACE_FUNCS(isascii)
811AC_REPLACE_FUNCS(inet_aton)
812AC_REPLACE_FUNCS(inet_pton)
813AC_REPLACE_FUNCS(inet_ntop)
814AC_REPLACE_FUNCS(snprintf)
815AC_REPLACE_FUNCS(strlcpy)
816AC_REPLACE_FUNCS(memmove)
817AC_FUNC_FORK
818AC_CHECK_FUNCS([endprotoent endservent sleep random fcntl strtoul bzero memset b32_ntop b32_pton])
819if test "x$HAVE_B32_NTOP" = "xyes"; then
820	AC_SUBST(ldns_build_config_have_b32_ntop, 1)
821else
822	AC_SUBST(ldns_build_config_have_b32_ntop, 0)
823fi
824if test "x$HAVE_B32_PTON" = "xyes"; then
825	AC_SUBST(ldns_build_config_have_b32_pton, 1)
826else
827	AC_SUBST(ldns_build_config_have_b32_pton, 0)
828fi
829
830ACX_CHECK_GETADDRINFO_WITH_INCLUDES
831if test $ac_cv_func_getaddrinfo = no; then
832	AC_LIBOBJ([fake-rfc2553])
833fi
834if test "$USE_WINSOCK" = 1; then
835	AC_CHECK_TOOL(WINDRES, windres)
836fi
837ACX_FUNC_IOCTLSOCKET
838
839#AC_SEARCH_LIBS(RSA_new, [crypto])
840
841ACX_CHECK_FORMAT_ATTRIBUTE
842ACX_CHECK_UNUSED_ATTRIBUTE
843
844# check OSX deployment target, if needed
845if echo $build_os | grep darwin > /dev/null; then
846  sdk_p=`xcode-select -print-path`;
847  sdk_v="$( /usr/bin/xcrun --show-sdk-version )";
848  case $sdk_v in
849       10.9|10.8)   sdk_c="10.7";;
850       10.11|10.10|*) sdk_c="10.10";;
851  esac
852  export MACOSX_DEPLOYMENT_TARGET="${sdk_c}";
853  export CFLAGS="$CFLAGS -mmacosx-version-min=${sdk_c} -isysroot ${sdk_p}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${sdk_v}.sdk";
854fi
855
856AC_DEFINE([SYSCONFDIR], [sysconfdir], [System configuration dir])
857
858AC_ARG_WITH(trust-anchor, AC_HELP_STRING([--with-trust-anchor=KEYFILE], [Default location of the trust anchor file for drill and ldns-dane. [default=SYSCONFDIR/unbound/root.key]]), [
859 AC_SUBST([LDNS_TRUST_ANCHOR_FILE], ["$withval"])
860 AC_MSG_NOTICE([Default trust anchor: $withval])
861],[
862 AC_SUBST([LDNS_TRUST_ANCHOR_FILE], ["\$(sysconfdir)/unbound/root.key"])
863])
864
865AC_ARG_WITH(ca-file, AC_HELP_STRING([--with-ca-file=CAFILE], [File containing CA certificates for ldns-dane]), [
866 AC_DEFINE([HAVE_DANE_CA_FILE], [1], [Is a CAFILE given at configure time])
867 AC_DEFINE_UNQUOTED([LDNS_DANE_CA_FILE], ["$withval"], [Is a CAFILE given at configure time])
868 AC_MSG_NOTICE([Using CAfile: $withval])
869 AC_SUBST(DEFAULT_CAFILE, ["Default is $withval"])
870],[
871 AC_DEFINE([HAVE_DANE_CA_FILE], [0], [Is a CAFILE given at configure time])
872 AC_SUBST(DEFAULT_CAFILE, [])
873])
874
875AC_ARG_WITH(ca-path, AC_HELP_STRING([--with-ca-path=CAPATH], [Directory containing CA certificate files for ldns-dane]), [
876 AC_DEFINE([HAVE_DANE_CA_PATH], [1], [Is a CAPATH given at configure time])
877 AC_DEFINE_UNQUOTED([LDNS_DANE_CA_PATH], ["$withval"], [Is a CAPATH given at configure time])
878 AC_MSG_NOTICE([Using CApath: $withval])
879 AC_SUBST(DEFAULT_CAPATH, ["Default is $withval"])
880],[
881 AC_DEFINE([HAVE_DANE_CA_PATH], [0], [Is a CAPATH given at configure time])
882 AC_SUBST(DEFAULT_CAPATH, [])
883])
884
885AH_BOTTOM([
886#include <stdio.h>
887#include <string.h>
888#include <unistd.h>
889#include <assert.h>
890
891#ifndef LITTLE_ENDIAN
892#define LITTLE_ENDIAN 1234
893#endif
894
895#ifndef BIG_ENDIAN
896#define BIG_ENDIAN 4321
897#endif
898
899#ifndef BYTE_ORDER
900#ifdef WORDS_BIGENDIAN
901#define BYTE_ORDER BIG_ENDIAN
902#else
903#define BYTE_ORDER LITTLE_ENDIAN
904#endif /* WORDS_BIGENDIAN */
905#endif /* BYTE_ORDER */
906
907#if STDC_HEADERS
908#include <stdlib.h>
909#include <stddef.h>
910#endif
911
912#ifdef HAVE_STDINT_H
913#include <stdint.h>
914#endif
915
916#ifdef HAVE_SYS_SOCKET_H
917#include <sys/socket.h>
918#endif
919
920#ifdef HAVE_NETINET_IN_H
921#include <netinet/in.h>
922#endif
923
924#ifdef HAVE_ARPA_INET_H
925#include <arpa/inet.h>
926#endif
927
928#ifdef HAVE_WINSOCK2_H
929#include <winsock2.h>
930#endif
931
932#ifdef HAVE_WS2TCPIP_H
933#include <ws2tcpip.h>
934#endif
935]
936AHX_CONFIG_W32_FD_SET_T
937)
938
939AH_BOTTOM([
940#ifdef __cplusplus
941extern "C" {
942#endif
943
944int ldns_b64_ntop(uint8_t const *src, size_t srclength,
945	 	  char *target, size_t targsize);
946/**
947 * calculates the size needed to store the result of b64_ntop
948 */
949/*@unused@*/
950static inline size_t ldns_b64_ntop_calculate_size(size_t srcsize)
951{
952	return ((((srcsize + 2) / 3) * 4) + 1);
953}
954int ldns_b64_pton(char const *src, uint8_t *target, size_t targsize);
955/**
956 * calculates the size needed to store the result of ldns_b64_pton
957 */
958/*@unused@*/
959static inline size_t ldns_b64_pton_calculate_size(size_t srcsize)
960{
961	return (((((srcsize + 3) / 4) * 3)) + 1);
962}
963
964/**
965 * Given in dnssec_zone.c, also used in dnssec_sign.c:w
966
967 */
968int ldns_dname_compare_v(const void *a, const void *b);
969
970#ifndef HAVE_SLEEP
971/* use windows sleep, in millisecs, instead */
972#define sleep(x) Sleep((x)*1000)
973#endif
974
975#ifndef HAVE_RANDOM
976#define srandom(x) srand(x)
977#define random(x) rand(x)
978#endif
979
980#ifndef HAVE_TIMEGM
981#include <time.h>
982time_t timegm (struct tm *tm);
983#endif /* !TIMEGM */
984#ifndef HAVE_GMTIME_R
985struct tm *gmtime_r(const time_t *timep, struct tm *result);
986#endif
987#ifndef HAVE_LOCALTIME_R
988struct tm *localtime_r(const time_t *timep, struct tm *result);
989#endif
990#ifndef HAVE_ISBLANK
991int isblank(int c);
992#endif /* !HAVE_ISBLANK */
993#ifndef HAVE_ISASCII
994int isascii(int c);
995#endif /* !HAVE_ISASCII */
996#ifndef HAVE_SNPRINTF
997#include <stdarg.h>
998int snprintf (char *str, size_t count, const char *fmt, ...);
999int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
1000#endif /* HAVE_SNPRINTF */
1001#ifndef HAVE_INET_PTON
1002int inet_pton(int af, const char* src, void* dst);
1003#endif /* HAVE_INET_PTON */
1004#ifndef HAVE_INET_NTOP
1005const char *inet_ntop(int af, const void *src, char *dst, size_t size);
1006#endif
1007#ifndef HAVE_INET_ATON
1008int inet_aton(const char *cp, struct in_addr *addr);
1009#endif
1010#ifndef HAVE_MEMMOVE
1011void *memmove(void *dest, const void *src, size_t n);
1012#endif
1013#ifndef HAVE_STRLCPY
1014size_t strlcpy(char *dst, const char *src, size_t siz);
1015#endif
1016
1017#ifdef USE_WINSOCK
1018#define SOCK_INVALID INVALID_SOCKET
1019#define close_socket(_s) do { if (_s > SOCK_INVALID) {closesocket(_s); _s = SOCK_INVALID;} } while(0)
1020#else
1021#define SOCK_INVALID -1
1022#define close_socket(_s) do { if (_s > SOCK_INVALID) {close(_s); _s = SOCK_INVALID;} } while(0)
1023#endif
1024
1025#ifdef __cplusplus
1026}
1027#endif
1028#ifndef HAVE_GETADDRINFO
1029#include "compat/fake-rfc2553.h"
1030#endif
1031#ifndef HAVE_STRTOUL
1032#define strtoul (unsigned long)strtol
1033#endif
1034])
1035
1036if test "x$HAVE_SSL" = "xyes"; then
1037	AC_SUBST(ldns_build_config_have_ssl, 1)
1038else
1039	AC_SUBST(ldns_build_config_have_ssl, 0)
1040fi
1041if test "x$ac_cv_c_format_attribute" = "xyes"; then
1042  AC_SUBST(ldns_build_config_have_attr_format, 1)
1043else
1044  AC_SUBST(ldns_build_config_have_attr_format, 0)
1045fi
1046if test "x$ac_cv_c_unused_attribute" = "xyes"; then
1047  AC_SUBST(ldns_build_config_have_attr_unused, 1)
1048else
1049  AC_SUBST(ldns_build_config_have_attr_unused, 0)
1050fi
1051
1052CONFIG_FILES="Makefile ldns/common.h ldns/net.h ldns/util.h packaging/libldns.pc packaging/ldns-config"
1053AC_SUBST(CONFIG_FILES)
1054AC_CONFIG_FILES([$CONFIG_FILES])
1055
1056AC_CONFIG_HEADER([ldns/config.h])
1057AC_OUTPUT
1058COPY_HEADER_FILES(ldns/, ldns/)
1059
1060dnl AC_CONFIG_SUBDIRS([drill])
1061
1062
1063