Petr Menšík f505a4
From 3dcf053c775344855bd6476ec4f4bada824cdd41 Mon Sep 17 00:00:00 2001
Petr Menšík f505a4
From: Tomas Hozza <thozza@redhat.com>
Petr Menšík f505a4
Date: Wed, 23 Sep 2015 14:37:16 +0200
Petr Menšík f505a4
Subject: [PATCH] Add support for GNU libidn
Petr Menšík f505a4
MIME-Version: 1.0
Petr Menšík f505a4
Content-Type: text/plain; charset=UTF-8
Petr Menšík f505a4
Content-Transfer-Encoding: 8bit
Petr Menšík f505a4
Petr Menšík f505a4
Added new configure option:
Petr Menšík f505a4
--with-libidn - to enable IDN using GNU libidn
Petr Menšík f505a4
Petr Menšík f505a4
Renamed configure option:
Petr Menšík f505a4
--with-idn to --with-idnkit to make the option usage more clear
Petr Menšík f505a4
Petr Menšík f505a4
idnkit and libidn support can not be used at the same time.
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Tomas Hozza <thozza@redhat.com>
Petr Menšík f505a4
(cherry picked from commit 2320443f63b14ff926d0b91b479a48e29bc02376)
Petr Menšík f505a4
(cherry picked from commit edab22119f5d2b45a18727a6eb92f11b39ca3e73)
Petr Menšík f505a4
Petr Menšík f505a4
Add support for libidn2
Petr Menšík f505a4
Petr Menšík f505a4
Added two new configure options:
Petr Menšík f505a4
--with-libidn2 - to enable IDN using GNU libidn2
Petr Menšík f505a4
Petr Menšík f505a4
idnkit, libidn and libidn2 support can not be used at the same time.
Petr Menšík f505a4
Petr Menšík f505a4
NOTE: libidn2 does not support punycode back to Unicode
Petr Menšík f505a4
characters, so support for this is missing.
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Tomas Hozza <thozza@redhat.com>
Petr Menšík f505a4
Petr Menšík f505a4
Removed iconv, convert directly from locale to ACE
Petr Menšík f505a4
Petr Menšík f505a4
Fix libidn2 and idnkit origin appending
Petr Menšík f505a4
Petr Menšík f505a4
Make IDN options in help less different
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Petr Menšík <pemensik@redhat.com>
Petr Menšík f505a4
(cherry picked from commit 505f673451d9f94488b99f5af0ea042e3f8e0915)
Petr Menšík f505a4
(cherry picked from commit 56b66f01c6ae4d9db3a2b8df29af21f43ed65516)
Petr Menšík f505a4
Petr Menšík f505a4
Remove conversion from locale to utf8 from public API
Petr Menšík f505a4
Petr Menšík f505a4
Emit fatal failures on locale to ACE encoding
Petr Menšík f505a4
Petr Menšík f505a4
Separate idnout support, disable it for libidn2 < 2.0
Petr Menšík f505a4
Petr Menšík f505a4
Add custom path to libidn. Leave default path for multilib support.
Petr Menšík f505a4
Petr Menšík f505a4
Allow turning off IDN input processing by dig option
Petr Menšík f505a4
Petr Menšík f505a4
Improve documentation, fix support in host
Petr Menšík f505a4
Petr Menšík f505a4
Fix configure changes to adjust help text
Petr Menšík f505a4
Petr Menšík f505a4
Use strlcpy with size guard
Petr Menšík f505a4
Petr Menšík f505a4
Improve IDN variants choosing. Fix idn2 function name.
Petr Menšík f505a4
Petr Menšík f505a4
Remove immediate idn_locale_to_ace and idn_ace_to_locale.
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Petr Menšík <pemensik@redhat.com>
Petr Menšík f505a4
(cherry picked from commit 94757c1545259ec3d7d99f3ba7f9baa9ce58e0d3)
Petr Menšík f505a4
(cherry picked from commit 2b031d17592a253297545c6e525019706c17c460)
Petr Menšík f505a4
Petr Menšík f505a4
Remove support for libidn (IDN 2003)
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Petr Menšík <pemensik@redhat.com>
Petr Menšík f505a4
(cherry picked from commit 8254cf69d34947713c99839dd5139f326d8e5d43)
Petr Menšík f505a4
(cherry picked from commit 9117bbe9a5d637d51ef11c71ff6743e027db5e9e)
Petr Menšík f505a4
Petr Menšík f505a4
Sanitize IDN initialization
Petr Menšík f505a4
Petr Menšík f505a4
Signed-off-by: Petr Menšík <pemensik@redhat.com>
Petr Menšík f505a4
(cherry picked from commit 29b94bbb04014681afe61c1594b99f6ec30f6b1f)
Petr Menšík f505a4
(cherry picked from commit 82914d0a416edb6667e94b54ae828cd0ca8f029b)
Petr Menšík f505a4
Petr Menšík f505a4
Simplify the libidn2 configure checks
Petr Menšík f505a4
Petr Menšík f505a4
(cherry picked from commit 76c05a71fcf464d6a638b2d8fab589100850e3f0)
Petr Menšík f505a4
(cherry picked from commit c08528682254506f4bcf8155d700eff3ce18b601)
Petr Menšík f505a4
Petr Menšík f505a4
Add release notes for IDNA2008
Petr Menšík f505a4
Petr Menšík f505a4
(cherry picked from commit e7590c7528229c7bc761a6c69c33dfb69fbaf82f)
Petr Menšík f505a4
(cherry picked from commit 2ff3b664bca0c084326d2eaf75cb3b382fa26108)
Petr Menšík f505a4
---
Petr Menšík f505a4
 bin/dig/Makefile.in       |   6 +-
Petr Menšík f505a4
 bin/dig/dig.c             |  27 +++-
Petr Menšík f505a4
 bin/dig/dig.docbook       |  18 ++-
Petr Menšík f505a4
 bin/dig/dighost.c         | 304 +++++++++++++++++++++++++++++-----------------
Petr Menšík f505a4
 bin/dig/host.c            |  10 +-
Petr Menšík f505a4
 bin/dig/include/dig/dig.h |   3 +-
Petr Menšík f505a4
 config.h.in               |  11 +-
Petr Menšík f505a4
 configure                 | 181 ++++++++++++++++++++++++---
Petr Menšík f505a4
 configure.in              |  81 +++++++++---
Petr Menšík f505a4
 doc/arm/notes.xml         |  15 +++
Petr Menšík f505a4
 10 files changed, 491 insertions(+), 165 deletions(-)
Petr Menšík f505a4
Petr Menšík f505a4
diff --git a/bin/dig/Makefile.in b/bin/dig/Makefile.in
Petr Menšík f505a4
index 511fdfe86e..d8080e5b30 100644
Petr Menšík f505a4
--- a/bin/dig/Makefile.in
Petr Menšík f505a4
+++ b/bin/dig/Makefile.in
Petr Menšík f505a4
@@ -16,7 +16,7 @@ READLINE_LIB = @READLINE_LIB@
Petr Menšík f505a4
 
Petr Menšík f505a4
 CINCLUDES =	-I${srcdir}/include ${DNS_INCLUDES} \
Petr Menšík f505a4
 		${BIND9_INCLUDES} ${ISC_INCLUDES} \
Petr Menšík f505a4
-		${LWRES_INCLUDES} ${ISCCFG_INCLUDES} @DST_OPENSSL_INC@
Petr Menšík f505a4
+		${LWRES_INCLUDES} ${ISCCFG_INCLUDES} @LIBIDN2_CFLAGS@ @DST_OPENSSL_INC@
Petr Menšík f505a4
 
Petr Menšík f505a4
 CDEFINES =	-DVERSION=\"${VERSION}\" @CRYPTO@
Petr Menšík f505a4
 CWARNINGS =
Petr Menšík f505a4
@@ -38,10 +38,10 @@ DEPLIBS =	${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} \
Petr Menšík f505a4
 		${ISCCFGDEPLIBS} ${LWRESDEPLIBS}
Petr Menšík f505a4
 
Petr Menšík f505a4
 LIBS =		${LWRESLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
Petr Menšík f505a4
-		${ISCLIBS} @IDNLIBS@ @LIBS@
Petr Menšík f505a4
+		${ISCLIBS} @IDNKIT_LIBS@ @LIBIDN2_LIBS@ @LIBS@
Petr Menšík f505a4
 
Petr Menšík f505a4
 NOSYMLIBS =	${LWRESLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
Petr Menšík f505a4
-		${ISCNOSYMLIBS} @IDNLIBS@ @LIBS@
Petr Menšík f505a4
+		${ISCNOSYMLIBS} @IDNKIT_LIBS@ @LIBIDN2_LIBS@ @LIBS@
Petr Menšík f505a4
 
Petr Menšík f505a4
 SUBDIRS =
Petr Menšík f505a4
 
Petr Menšík f505a4
diff --git a/bin/dig/dig.c b/bin/dig/dig.c
Petr Menšík f505a4
index 2e1ade8bf3..9a1176353e 100644
Petr Menšík f505a4
--- a/bin/dig/dig.c
Petr Menšík f505a4
+++ b/bin/dig/dig.c
Petr Menšík f505a4
@@ -187,7 +187,8 @@ help(void) {
Petr Menšík f505a4
 "                 +[no]fail           (Don't try next server on SERVFAIL)\n"
Petr Menšík f505a4
 "                 +[no]header-only    (Send query without a question section)\n"
Petr Menšík f505a4
 "                 +[no]identify       (ID responders in short answers)\n"
Petr Menšík f505a4
-"                 +[no]idnout         (convert IDN response)\n"
Petr Menšík f505a4
+"                 +[no]idnin          (Parse IDN names)\n"
Petr Menšík f505a4
+"                 +[no]idnout         (Convert IDN response)\n"
Petr Menšík f505a4
 "                 +[no]ignore         (Don't revert to TCP for TC responses.)\n"
Petr Menšík f505a4
 "                 +[no]keepopen       (Keep the TCP socket open between queries)\n"
Petr Menšík f505a4
 "                 +[no]mapped         (Allow mapped IPv4 over IPv6)\n"
Petr Menšík f505a4
@@ -1091,12 +1092,28 @@ plus_option(const char *option, isc_boolean_t is_batchfile,
Petr Menšík f505a4
 				lookup->identify = state;
Petr Menšík f505a4
 				break;
Petr Menšík f505a4
 			case 'n':
Petr Menšík f505a4
-				FULLCHECK("idnout");
Petr Menšík f505a4
-#ifndef WITH_IDN
Petr Menšík f505a4
-				fprintf(stderr, ";; IDN support not enabled\n");
Petr Menšík f505a4
+				switch (cmd[3]) {
Petr Menšík f505a4
+				case 'i':
Petr Menšík f505a4
+					FULLCHECK("idnin");
Petr Menšík f505a4
+#ifndef WITH_IDN_SUPPORT
Petr Menšík f505a4
+					fprintf(stderr, ";; IDN input support"
Petr Menšík f505a4
+					        " not enabled\n");
Petr Menšík f505a4
+#else
Petr Menšík f505a4
+					lookup->idnin = state;
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+				break;
Petr Menšík f505a4
+				case 'o':
Petr Menšík f505a4
+					FULLCHECK("idnout");
Petr Menšík f505a4
+#ifndef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
+					fprintf(stderr, ";; IDN output support"
Petr Menšík f505a4
+					        " not enabled\n");
Petr Menšík f505a4
 #else
Petr Menšík f505a4
-				lookup->idnout = state;
Petr Menšík f505a4
+					lookup->idnout = state;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
+					break;
Petr Menšík f505a4
+				default:
Petr Menšík f505a4
+					goto invalid_option;
Petr Menšík f505a4
+				}
Petr Menšík f505a4
 				break;
Petr Menšík f505a4
 			default:
Petr Menšík f505a4
 				goto invalid_option;
Petr Menšík f505a4
diff --git a/bin/dig/dig.docbook b/bin/dig/dig.docbook
Petr Menšík f505a4
index bee62c6307..da5b7d6515 100644
Petr Menšík f505a4
--- a/bin/dig/dig.docbook
Petr Menšík f505a4
+++ b/bin/dig/dig.docbook
Petr Menšík f505a4
@@ -773,6 +773,17 @@
Petr Menšík f505a4
 	  </listitem>
Petr Menšík f505a4
 	</varlistentry>
Petr Menšík f505a4
 
Petr Menšík f505a4
+	<varlistentry>
Petr Menšík f505a4
+	  <term><option>+[no]idnin</option></term>
Petr Menšík f505a4
+	  <listitem>
Petr Menšík f505a4
+	    <para>
Petr Menšík f505a4
+	      Process [do not process] IDN domain names on input.
Petr Menšík f505a4
+	      This requires IDN SUPPORT to have been enabled at
Petr Menšík f505a4
+	      compile time.  The default is to process IDN input.
Petr Menšík f505a4
+	    </para>
Petr Menšík f505a4
+	  </listitem>
Petr Menšík f505a4
+	</varlistentry>
Petr Menšík f505a4
+
Petr Menšík f505a4
 	<varlistentry>
Petr Menšík f505a4
 	  <term><option>+[no]idnout</option></term>
Petr Menšík f505a4
 	  <listitem>
Petr Menšík f505a4
@@ -1265,10 +1276,9 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
Petr Menšík f505a4
       <command>dig</command> appropriately converts character encoding of
Petr Menšík f505a4
       domain name before sending a request to DNS server or displaying a
Petr Menšík f505a4
       reply from the server.
Petr Menšík f505a4
-      If you'd like to turn off the IDN support for some reason, defines
Petr Menšík f505a4
-      the <envar>IDN_DISABLE</envar> environment variable.
Petr Menšík f505a4
-      The IDN support is disabled if the variable is set when
Petr Menšík f505a4
-      <command>dig</command> runs.
Petr Menšík f505a4
+      If you'd like to turn off the IDN support for some reason, use 
Petr Menšík f505a4
+      parameters <parameter>+noidnin</parameter> and
Petr Menšík f505a4
+      <parameter>+noidnout</parameter>.
Petr Menšík f505a4
     </para>
Petr Menšík f505a4
   </refsection>
Petr Menšík f505a4
 
Petr Menšík f505a4
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
Petr Menšík f505a4
index fdfff399f5..c179b625f1 100644
Petr Menšík f505a4
--- a/bin/dig/dighost.c
Petr Menšík f505a4
+++ b/bin/dig/dighost.c
Petr Menšík f505a4
@@ -21,18 +21,25 @@
Petr Menšík f505a4
 #include <unistd.h>
Petr Menšík f505a4
 #include <string.h>
Petr Menšík f505a4
 #include <limits.h>
Petr Menšík f505a4
+#include <errno.h>
Petr Menšík f505a4
 
Petr Menšík f505a4
 #ifdef HAVE_LOCALE_H
Petr Menšík f505a4
 #include <locale.h>
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 #include <idn/result.h>
Petr Menšík f505a4
 #include <idn/log.h>
Petr Menšík f505a4
 #include <idn/resconf.h>
Petr Menšík f505a4
 #include <idn/api.h>
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
+#ifdef WITH_LIBIDN2
Petr Menšík f505a4
+#include <idn2.h>
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+#endif /* WITH_IDN_SUPPORT */
Petr Menšík f505a4
+
Petr Menšík f505a4
 #include <dns/byaddr.h>
Petr Menšík f505a4
 #ifdef DIG_SIGCHASE
Petr Menšík f505a4
 #include <dns/callbacks.h>
Petr Menšík f505a4
@@ -145,18 +152,26 @@ int lookup_counter = 0;
Petr Menšík f505a4
 
Petr Menšík f505a4
 static char servercookie[256];
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-static void		initialize_idn(void);
Petr Menšík f505a4
-static isc_result_t	output_filter(isc_buffer_t *buffer,
Petr Menšík f505a4
-				      unsigned int used_org,
Petr Menšík f505a4
-				      isc_boolean_t absolute);
Petr Menšík f505a4
-static idn_result_t	append_textname(char *name, const char *origin,
Petr Menšík f505a4
-					size_t namesize);
Petr Menšík f505a4
-static void		idn_check_result(idn_result_t r, const char *msg);
Petr Menšík f505a4
-
Petr Menšík f505a4
-#define MAXDLEN		256
Petr Menšík f505a4
-int  idnoptions	= 0;
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+static void idn_initialize(void);
Petr Menšík f505a4
+static isc_result_t idn_locale_to_ace(const char *from,
Petr Menšík f505a4
+		char *to,
Petr Menšík f505a4
+		size_t tolen);
Petr Menšík f505a4
+#endif /* WITH_IDN_SUPPORT */
Petr Menšík f505a4
+
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
+static isc_result_t idn_ace_to_locale(const char *from,
Petr Menšík f505a4
+		char *to,
Petr Menšík f505a4
+		size_t tolen);
Petr Menšík f505a4
+static isc_result_t output_filter(isc_buffer_t *buffer,
Petr Menšík f505a4
+		unsigned int used_org,
Petr Menšík f505a4
+		isc_boolean_t absolute);
Petr Menšík f505a4
+#define MAXDLEN 256
Petr Menšík f505a4
+
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
+int idnoptions = 0;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
+#endif /* WITH_IDN_OUT_SUPPORT */
Petr Menšík f505a4
 
Petr Menšík f505a4
 isc_socket_t *keep = NULL;
Petr Menšík f505a4
 isc_sockaddr_t keepaddr;
Petr Menšík f505a4
@@ -803,7 +818,12 @@ make_empty_lookup(void) {
Petr Menšík f505a4
 	looknew->sendcookie = ISC_FALSE;
Petr Menšík f505a4
 	looknew->seenbadcookie = ISC_FALSE;
Petr Menšík f505a4
 	looknew->badcookie = ISC_TRUE;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+	looknew->idnin = ISC_TRUE;
Petr Menšík f505a4
+#else
Petr Menšík f505a4
+	looknew->idnin = ISC_FALSE;
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
 	looknew->idnout = ISC_TRUE;
Petr Menšík f505a4
 #else
Petr Menšík f505a4
 	looknew->idnout = ISC_FALSE;
Petr Menšík f505a4
@@ -952,6 +972,7 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
Petr Menšík f505a4
 	}
Petr Menšík f505a4
 	looknew->ednsneg = lookold->ednsneg;
Petr Menšík f505a4
 	looknew->mapped = lookold->mapped;
Petr Menšík f505a4
+	looknew->idnin = lookold->idnin;
Petr Menšík f505a4
 	looknew->idnout = lookold->idnout;
Petr Menšík f505a4
 #ifdef DIG_SIGCHASE
Petr Menšík f505a4
 	looknew->sigchase = lookold->sigchase;
Petr Menšík f505a4
@@ -1512,8 +1533,19 @@ setup_system(isc_boolean_t ipv4only, isc_boolean_t ipv6only) {
Petr Menšík f505a4
 		copy_server_list(lwconf, &server_list);
Petr Menšík f505a4
 	}
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-	initialize_idn();
Petr Menšík f505a4
+#ifdef HAVE_SETLOCALE
Petr Menšík f505a4
+	/* Set locale */
Petr Menšík f505a4
+	(void)setlocale(LC_ALL, "");
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+	idn_initialize();
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
+	/* Set domain name -> text post-conversion filter. */
Petr Menšík f505a4
+	result = dns_name_settotextfilter(output_filter);
Petr Menšík f505a4
+	check_result(result, "dns_name_settotextfilter");
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
 	if (keyfile[0] != 0)
Petr Menšík f505a4
@@ -2344,12 +2376,13 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 	char store[MXNAME];
Petr Menšík f505a4
 	char ecsbuf[20];
Petr Menšík f505a4
 	char cookiebuf[256];
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-	idn_result_t mr;
Petr Menšík f505a4
-	char utf8_textname[MXNAME], utf8_origin[MXNAME], idn_textname[MXNAME];
Petr Menšík f505a4
+	char *origin = NULL;
Petr Menšík f505a4
+	char *textname = NULL;
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+	char idn_origin[MXNAME], idn_textname[MXNAME];
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
 	result = dns_name_settotextfilter(lookup->idnout ?
Petr Menšík f505a4
 					  output_filter : NULL);
Petr Menšík f505a4
 	check_result(result, "dns_name_settotextfilter");
Petr Menšík f505a4
@@ -2382,15 +2415,20 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 	isc_buffer_init(&lookup->onamebuf, lookup->oname_space,
Petr Menšík f505a4
 			sizeof(lookup->oname_space));
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
 	/*
Petr Menšík f505a4
 	 * We cannot convert `textname' and `origin' separately.
Petr Menšík f505a4
 	 * `textname' doesn't contain TLD, but local mapping needs
Petr Menšík f505a4
 	 * TLD.
Petr Menšík f505a4
 	 */
Petr Menšík f505a4
-	mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP, lookup->textname,
Petr Menšík f505a4
-			    utf8_textname, sizeof(utf8_textname));
Petr Menšík f505a4
-	idn_check_result(mr, "convert textname to UTF-8");
Petr Menšík f505a4
+	textname = lookup->textname;
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+	if (lookup->idnin) {
Petr Menšík f505a4
+		result = idn_locale_to_ace(lookup->textname, idn_textname,
Petr Menšík f505a4
+					    sizeof(idn_textname));
Petr Menšík f505a4
+		check_result(result, "convert textname to IDN encoding");
Petr Menšík f505a4
+		debug("idn_textname: %s", idn_textname);
Petr Menšík f505a4
+		textname = idn_textname;
Petr Menšík f505a4
+	}
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
 	/*
Petr Menšík f505a4
@@ -2401,17 +2439,8 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 	 * is TRUE or we got a domain line in the resolv.conf file.
Petr Menšík f505a4
 	 */
Petr Menšík f505a4
 	if (lookup->new_search) {
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-		if ((count_dots(utf8_textname) >= ndots) || !usesearch) {
Petr Menšík f505a4
-			lookup->origin = NULL; /* Force abs lookup */
Petr Menšík f505a4
-			lookup->done_as_is = ISC_TRUE;
Petr Menšík f505a4
-			lookup->need_search = usesearch;
Petr Menšík f505a4
-		} else if (lookup->origin == NULL && usesearch) {
Petr Menšík f505a4
-			lookup->origin = ISC_LIST_HEAD(search_list);
Petr Menšík f505a4
-			lookup->need_search = ISC_FALSE;
Petr Menšík f505a4
-		}
Petr Menšík f505a4
-#else
Petr Menšík f505a4
-		if ((count_dots(lookup->textname) >= ndots) || !usesearch) {
Petr Menšík f505a4
+		if ((count_dots(textname) >= ndots) || !usesearch)
Petr Menšík f505a4
+		{
Petr Menšík f505a4
 			lookup->origin = NULL; /* Force abs lookup */
Petr Menšík f505a4
 			lookup->done_as_is = ISC_TRUE;
Petr Menšík f505a4
 			lookup->need_search = usesearch;
Petr Menšík f505a4
@@ -2419,24 +2448,8 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 			lookup->origin = ISC_LIST_HEAD(search_list);
Petr Menšík f505a4
 			lookup->need_search = ISC_FALSE;
Petr Menšík f505a4
 		}
Petr Menšík f505a4
-#endif
Petr Menšík f505a4
 	}
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-	if (lookup->origin != NULL) {
Petr Menšík f505a4
-		mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP,
Petr Menšík f505a4
-				    lookup->origin->origin, utf8_origin,
Petr Menšík f505a4
-				    sizeof(utf8_origin));
Petr Menšík f505a4
-		idn_check_result(mr, "convert origin to UTF-8");
Petr Menšík f505a4
-		mr = append_textname(utf8_textname, utf8_origin,
Petr Menšík f505a4
-				     sizeof(utf8_textname));
Petr Menšík f505a4
-		idn_check_result(mr, "append origin to textname");
Petr Menšík f505a4
-	}
Petr Menšík f505a4
-	mr = idn_encodename(idnoptions | IDN_LOCALMAP | IDN_NAMEPREP |
Petr Menšík f505a4
-			    IDN_IDNCONV | IDN_LENCHECK, utf8_textname,
Petr Menšík f505a4
-			    idn_textname, sizeof(idn_textname));
Petr Menšík f505a4
-	idn_check_result(mr, "convert UTF-8 textname to IDN encoding");
Petr Menšík f505a4
-#else
Petr Menšík f505a4
 	if (lookup->origin != NULL) {
Petr Menšík f505a4
 		debug("trying origin %s", lookup->origin->origin);
Petr Menšík f505a4
 		result = dns_message_gettempname(lookup->sendmsg,
Petr Menšík f505a4
@@ -2444,8 +2457,18 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 		check_result(result, "dns_message_gettempname");
Petr Menšík f505a4
 		dns_name_init(lookup->oname, NULL);
Petr Menšík f505a4
 		/* XXX Helper funct to conv char* to name? */
Petr Menšík f505a4
-		len = (unsigned int) strlen(lookup->origin->origin);
Petr Menšík f505a4
-		isc_buffer_init(&b, lookup->origin->origin, len);
Petr Menšík f505a4
+		origin = lookup->origin->origin;
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+		if (lookup->idnin) {
Petr Menšík f505a4
+			result = idn_locale_to_ace(lookup->origin->origin,
Petr Menšík f505a4
+						idn_origin, sizeof(idn_origin));
Petr Menšík f505a4
+			check_result(result, "convert origin to IDN encoding");
Petr Menšík f505a4
+			debug("trying idn origin %s", idn_origin);
Petr Menšík f505a4
+			origin = idn_origin;
Petr Menšík f505a4
+		}
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+		len = (unsigned int) strlen(origin);
Petr Menšík f505a4
+		isc_buffer_init(&b, origin, len);
Petr Menšík f505a4
 		isc_buffer_add(&b, len);
Petr Menšík f505a4
 		result = dns_name_fromtext(lookup->oname, &b, dns_rootname,
Petr Menšík f505a4
 					   0, &lookup->onamebuf);
Petr Menšík f505a4
@@ -2455,7 +2478,7 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 			dns_message_puttempname(lookup->sendmsg,
Petr Menšík f505a4
 						&lookup->oname);
Petr Menšík f505a4
 			fatal("'%s' is not in legal name syntax (%s)",
Petr Menšík f505a4
-			      lookup->origin->origin,
Petr Menšík f505a4
+			      origin,
Petr Menšík f505a4
 			      isc_result_totext(result));
Petr Menšík f505a4
 		}
Petr Menšík f505a4
 		if (lookup->trace && lookup->trace_root) {
Petr Menšík f505a4
@@ -2466,8 +2489,8 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 
Petr Menšík f505a4
 			dns_fixedname_init(&fixed);
Petr Menšík f505a4
 			name = dns_fixedname_name(&fixed);
Petr Menšík f505a4
-			len = (unsigned int) strlen(lookup->textname);
Petr Menšík f505a4
-			isc_buffer_init(&b, lookup->textname, len);
Petr Menšík f505a4
+			len = (unsigned int) strlen(textname);
Petr Menšík f505a4
+			isc_buffer_init(&b, textname, len);
Petr Menšík f505a4
 			isc_buffer_add(&b, len);
Petr Menšík f505a4
 			result = dns_name_fromtext(name, &b, NULL, 0, NULL);
Petr Menšík f505a4
 			if (result == ISC_R_SUCCESS &&
Petr Menšík f505a4
@@ -2492,28 +2515,17 @@ setup_lookup(dig_lookup_t *lookup) {
Petr Menšík f505a4
 			}
Petr Menšík f505a4
 		}
Petr Menšík f505a4
 		dns_message_puttempname(lookup->sendmsg, &lookup->oname);
Petr Menšík f505a4
-	} else
Petr Menšík f505a4
-#endif
Petr Menšík f505a4
-	{
Petr Menšík f505a4
+	} else {
Petr Menšík f505a4
 		debug("using root origin");
Petr Menšík f505a4
 		if (lookup->trace && lookup->trace_root)
Petr Menšík f505a4
 			dns_name_clone(dns_rootname, lookup->name);
Petr Menšík f505a4
 		else {
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-			len = (unsigned int) strlen(idn_textname);
Petr Menšík f505a4
-			isc_buffer_init(&b, idn_textname, len);
Petr Menšík f505a4
+			len = (unsigned int) strlen(textname);
Petr Menšík f505a4
+			isc_buffer_init(&b, textname, len);
Petr Menšík f505a4
 			isc_buffer_add(&b, len);
Petr Menšík f505a4
 			result = dns_name_fromtext(lookup->name, &b,
Petr Menšík f505a4
 						   dns_rootname, 0,
Petr Menšík f505a4
 						   &lookup->namebuf);
Petr Menšík f505a4
-#else
Petr Menšík f505a4
-			len = (unsigned int) strlen(lookup->textname);
Petr Menšík f505a4
-			isc_buffer_init(&b, lookup->textname, len);
Petr Menšík f505a4
-			isc_buffer_add(&b, len);
Petr Menšík f505a4
-			result = dns_name_fromtext(lookup->name, &b,
Petr Menšík f505a4
-						   dns_rootname, 0,
Petr Menšík f505a4
-						   &lookup->namebuf);
Petr Menšík f505a4
-#endif
Petr Menšík f505a4
 		}
Petr Menšík f505a4
 		if (result != ISC_R_SUCCESS) {
Petr Menšík f505a4
 			dns_message_puttempname(lookup->sendmsg,
Petr Menšík f505a4
@@ -4512,7 +4524,7 @@ destroy_libs(void) {
Petr Menšík f505a4
 	void * ptr;
Petr Menšík f505a4
 	dig_message_t *chase_msg;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
 	isc_result_t result;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
@@ -4549,7 +4561,7 @@ destroy_libs(void) {
Petr Menšík f505a4
 
Petr Menšík f505a4
 	clear_searchlist();
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
 	result = dns_name_settotextfilter(NULL);
Petr Menšík f505a4
 	check_result(result, "dns_name_settotextfilter");
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
@@ -4633,27 +4645,7 @@ destroy_libs(void) {
Petr Menšík f505a4
 		isc_mem_destroy(&mctx);
Petr Menšík f505a4
 }
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
-static void
Petr Menšík f505a4
-initialize_idn(void) {
Petr Menšík f505a4
-	idn_result_t r;
Petr Menšík f505a4
-	isc_result_t result;
Petr Menšík f505a4
-
Petr Menšík f505a4
-#ifdef HAVE_SETLOCALE
Petr Menšík f505a4
-	/* Set locale */
Petr Menšík f505a4
-	(void)setlocale(LC_ALL, "");
Petr Menšík f505a4
-#endif
Petr Menšík f505a4
-	/* Create configuration context. */
Petr Menšík f505a4
-	r = idn_nameinit(1);
Petr Menšík f505a4
-	if (r != idn_success)
Petr Menšík f505a4
-		fatal("idn api initialization failed: %s",
Petr Menšík f505a4
-		      idn_result_tostring(r));
Petr Menšík f505a4
-
Petr Menšík f505a4
-	/* Set domain name -> text post-conversion filter. */
Petr Menšík f505a4
-	result = dns_name_settotextfilter(output_filter);
Petr Menšík f505a4
-	check_result(result, "dns_name_settotextfilter");
Petr Menšík f505a4
-}
Petr Menšík f505a4
-
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
 static isc_result_t
Petr Menšík f505a4
 output_filter(isc_buffer_t *buffer, unsigned int used_org,
Petr Menšík f505a4
 	      isc_boolean_t absolute)
Petr Menšík f505a4
@@ -4661,6 +4653,7 @@ output_filter(isc_buffer_t *buffer, unsigned int used_org,
Petr Menšík f505a4
 	char tmp1[MAXDLEN], tmp2[MAXDLEN];
Petr Menšík f505a4
 	size_t fromlen, tolen;
Petr Menšík f505a4
 	isc_boolean_t end_with_dot;
Petr Menšík f505a4
+	isc_result_t result;
Petr Menšík f505a4
 
Petr Menšík f505a4
 	/*
Petr Menšík f505a4
 	 * Copy contents of 'buffer' to 'tmp1', supply trailing dot
Petr Menšík f505a4
@@ -4669,6 +4662,7 @@ output_filter(isc_buffer_t *buffer, unsigned int used_org,
Petr Menšík f505a4
 	fromlen = isc_buffer_usedlength(buffer) - used_org;
Petr Menšík f505a4
 	if (fromlen >= MAXDLEN)
Petr Menšík f505a4
 		return (ISC_R_SUCCESS);
Petr Menšík f505a4
+
Petr Menšík f505a4
 	memmove(tmp1, (char *)isc_buffer_base(buffer) + used_org, fromlen);
Petr Menšík f505a4
 	end_with_dot = (tmp1[fromlen - 1] == '.') ? ISC_TRUE : ISC_FALSE;
Petr Menšík f505a4
 	if (absolute && !end_with_dot) {
Petr Menšík f505a4
@@ -4677,13 +4671,16 @@ output_filter(isc_buffer_t *buffer, unsigned int used_org,
Petr Menšík f505a4
 			return (ISC_R_SUCCESS);
Petr Menšík f505a4
 		tmp1[fromlen - 1] = '.';
Petr Menšík f505a4
 	}
Petr Menšík f505a4
+
Petr Menšík f505a4
 	tmp1[fromlen] = '\0';
Petr Menšík f505a4
 
Petr Menšík f505a4
 	/*
Petr Menšík f505a4
 	 * Convert contents of 'tmp1' to local encoding.
Petr Menšík f505a4
 	 */
Petr Menšík f505a4
-	if (idn_decodename(IDN_DECODE_APP, tmp1, tmp2, MAXDLEN) != idn_success)
Petr Menšík f505a4
+	result = idn_ace_to_locale(tmp1, tmp2, sizeof(tmp2));
Petr Menšík f505a4
+	if (result != ISC_R_SUCCESS) {
Petr Menšík f505a4
 		return (ISC_R_SUCCESS);
Petr Menšík f505a4
+	}
Petr Menšík f505a4
 	strlcpy(tmp1, tmp2, MAXDLEN);
Petr Menšík f505a4
 
Petr Menšík f505a4
 	/*
Petr Menšík f505a4
@@ -4703,35 +4700,118 @@ output_filter(isc_buffer_t *buffer, unsigned int used_org,
Petr Menšík f505a4
 
Petr Menšík f505a4
 	return (ISC_R_SUCCESS);
Petr Menšík f505a4
 }
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
 
Petr Menšík f505a4
-static idn_result_t
Petr Menšík f505a4
-append_textname(char *name, const char *origin, size_t namesize) {
Petr Menšík f505a4
-	size_t namelen = strlen(name);
Petr Menšík f505a4
-	size_t originlen = strlen(origin);
Petr Menšík f505a4
+#ifdef WITH_IDN_SUPPORT
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
+static void
Petr Menšík f505a4
+idnkit_check_result(idn_result_t result, const char *msg) {
Petr Menšík f505a4
+	if (result != idn_success) {
Petr Menšík f505a4
+		fatal("%s: %s", msg, idn_result_tostring(result));
Petr Menšík f505a4
+	}
Petr Menšík f505a4
+}
Petr Menšík f505a4
+
Petr Menšík f505a4
+static void
Petr Menšík f505a4
+idn_initialize(void) {
Petr Menšík f505a4
+	idn_result_t result;
Petr Menšík f505a4
 
Petr Menšík f505a4
-	/* Already absolute? */
Petr Menšík f505a4
-	if (namelen > 0 && name[namelen - 1] == '.')
Petr Menšík f505a4
-		return (idn_success);
Petr Menšík f505a4
+	/* Create configuration context. */
Petr Menšík f505a4
+	result = idn_nameinit(1);
Petr Menšík f505a4
+	idnkit_check_result(result, "idnkit api initialization failed");
Petr Menšík f505a4
+	return (ISC_R_SUCCESS);
Petr Menšík f505a4
+}
Petr Menšík f505a4
 
Petr Menšík f505a4
-	/* Append dot and origin */
Petr Menšík f505a4
+static isc_result_t
Petr Menšík f505a4
+idn_locale_to_ace(const char *from, char *to, size_t tolen) {
Petr Menšík f505a4
+	char utf8_textname[MXNAME];
Petr Menšík f505a4
+	idn_result_t result;
Petr Menšík f505a4
+
Petr Menšík f505a4
+	result = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP, from,
Petr Menšík f505a4
+	                        utf8_textname, sizeof(utf8_textname));
Petr Menšík f505a4
+	idnkit_check_result(result, "idnkit idn_encodename to utf8 failed");
Petr Menšík f505a4
+
Petr Menšík f505a4
+	result = idn_encodename(idnoptions | IDN_LOCALMAP | IDN_NAMEPREP |
Petr Menšík f505a4
+		                IDN_IDNCONV | IDN_LENCHECK,
Petr Menšík f505a4
+		                utf8_textname, to, tolen);
Petr Menšík f505a4
+	idnkit_check_result(result, "idnkit idn_encodename to idn failed");
Petr Menšík f505a4
+	return (ISC_R_SUCCESS);
Petr Menšík f505a4
+}
Petr Menšík f505a4
 
Petr Menšík f505a4
-	if (namelen + 1 + originlen >= namesize)
Petr Menšík f505a4
-		return (idn_buffer_overflow);
Petr Menšík f505a4
+static isc_result_t
Petr Menšík f505a4
+idn_ace_to_locale(const char *from, char *to, size_t tolen) {
Petr Menšík f505a4
+	idn_result_t result;
Petr Menšík f505a4
 
Petr Menšík f505a4
-	if (*origin != '.')
Petr Menšík f505a4
-		name[namelen++] = '.';
Petr Menšík f505a4
-	(void)strlcpy(name + namelen, origin, namesize - namelen);
Petr Menšík f505a4
-	return (idn_success);
Petr Menšík f505a4
+	result = idn_decodename(IDN_DECODE_APP, from, to, tolen);
Petr Menšík f505a4
+	if (result != idn_success) {
Petr Menšík f505a4
+		debug("idnkit idn_decodename failed: %s",
Petr Menšík f505a4
+		      idn_result_tostring(result));
Petr Menšík f505a4
+		return (ISC_R_FAILURE);
Petr Menšík f505a4
+	}
Petr Menšík f505a4
+	return (ISC_R_SUCCESS);
Petr Menšík f505a4
 }
Petr Menšík f505a4
+#endif /* WITH_IDNKIT */
Petr Menšík f505a4
 
Petr Menšík f505a4
+#ifdef WITH_LIBIDN2
Petr Menšík f505a4
 static void
Petr Menšík f505a4
-idn_check_result(idn_result_t r, const char *msg) {
Petr Menšík f505a4
-	if (r != idn_success) {
Petr Menšík f505a4
-		exitcode = 1;
Petr Menšík f505a4
-		fatal("%s: %s", msg, idn_result_tostring(r));
Petr Menšík f505a4
+idn_initialize(void) {
Petr Menšík f505a4
+}
Petr Menšík f505a4
+
Petr Menšík f505a4
+static isc_result_t
Petr Menšík f505a4
+idn_locale_to_ace(const char *from, char *to, size_t tolen) {
Petr Menšík f505a4
+	int res;
Petr Menšík f505a4
+	char *tmp_str = NULL;
Petr Menšík f505a4
+
Petr Menšík f505a4
+	res = idn2_lookup_ul(from, &tmp_str, IDN2_NONTRANSITIONAL);
Petr Menšík f505a4
+	if (res == IDN2_DISALLOWED)
Petr Menšík f505a4
+		res = idn2_lookup_ul(from, &tmp_str, IDN2_TRANSITIONAL);
Petr Menšík f505a4
+
Petr Menšík f505a4
+	if (res == IDN2_OK) {
Petr Menšík f505a4
+		/* check the length */
Petr Menšík f505a4
+		if (strlen(tmp_str) >= tolen) {
Petr Menšík f505a4
+			debug("ACE string is too long");
Petr Menšík f505a4
+			idn2_free(tmp_str);
Petr Menšík f505a4
+			return ISC_R_NOSPACE;
Petr Menšík f505a4
+		}
Petr Menšík f505a4
+
Petr Menšík f505a4
+		(void) strlcpy(to, tmp_str, tolen);
Petr Menšík f505a4
+		idn2_free(tmp_str);
Petr Menšík f505a4
+		return ISC_R_SUCCESS;
Petr Menšík f505a4
 	}
Petr Menšík f505a4
+
Petr Menšík f505a4
+	fatal("idn2_lookup_ul failed: %s", idn2_strerror(res));
Petr Menšík f505a4
+	return ISC_R_FAILURE;
Petr Menšík f505a4
+}
Petr Menšík f505a4
+
Petr Menšík f505a4
+#ifdef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
+static isc_result_t
Petr Menšík f505a4
+idn_ace_to_locale(const char *from, char *to, size_t tolen) {
Petr Menšík f505a4
+	int res;
Petr Menšík f505a4
+	char *tmp_str = NULL;
Petr Menšík f505a4
+
Petr Menšík f505a4
+	res = idn2_to_unicode_8zlz(from, &tmp_str,
Petr Menšík f505a4
+			       IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT);
Petr Menšík f505a4
+
Petr Menšík f505a4
+	if (res == IDN2_OK) {
Petr Menšík f505a4
+		/* check the length */
Petr Menšík f505a4
+		if (strlen(tmp_str) >= tolen) {
Petr Menšík f505a4
+			debug("encoded ASC string is too long");
Petr Menšík f505a4
+			idn2_free(tmp_str);
Petr Menšík f505a4
+			return ISC_R_FAILURE;
Petr Menšík f505a4
+		}
Petr Menšík f505a4
+
Petr Menšík f505a4
+		(void) strncpy(to, tmp_str, tolen);
Petr Menšík f505a4
+		free(tmp_str);
Petr Menšík f505a4
+		return ISC_R_SUCCESS;
Petr Menšík f505a4
+	} else {
Petr Menšík f505a4
+		debug("idn2_to_unicode_8zlz failed: %s",
Petr Menšík f505a4
+		      idn2_strerror(res));
Petr Menšík f505a4
+	}
Petr Menšík f505a4
+
Petr Menšík f505a4
+	return ISC_R_FAILURE;
Petr Menšík f505a4
 }
Petr Menšík f505a4
-#endif /* WITH_IDN */
Petr Menšík f505a4
+#endif /* WITH_IDN_OUT_SUPPORT */
Petr Menšík f505a4
+#endif /* WITH_LIBIDN2 */
Petr Menšík f505a4
+#endif /* WITH_IDN_SUPPORT */
Petr Menšík f505a4
 
Petr Menšík f505a4
 #ifdef DIG_SIGCHASE
Petr Menšík f505a4
 void
Petr Menšík f505a4
diff --git a/bin/dig/host.c b/bin/dig/host.c
Petr Menšík f505a4
index f9e5b08962..f16483827a 100644
Petr Menšík f505a4
--- a/bin/dig/host.c
Petr Menšík f505a4
+++ b/bin/dig/host.c
Petr Menšík f505a4
@@ -16,7 +16,7 @@
Petr Menšík f505a4
 #include <locale.h>
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 #include <idn/result.h>
Petr Menšík f505a4
 #include <idn/log.h>
Petr Menšík f505a4
 #include <idn/resconf.h>
Petr Menšík f505a4
@@ -720,7 +720,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
Petr Menšík f505a4
 			    lookup->rdtype != dns_rdatatype_axfr)
Petr Menšík f505a4
 				lookup->rdtype = rdtype;
Petr Menšík f505a4
 			lookup->rdtypeset = ISC_TRUE;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 			idnoptions = 0;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 			if (rdtype == dns_rdatatype_axfr) {
Petr Menšík f505a4
@@ -735,7 +735,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
Petr Menšík f505a4
 			} else if (rdtype == dns_rdatatype_any) {
Petr Menšík f505a4
 				if (!lookup->tcp_mode_set)
Petr Menšík f505a4
 					lookup->tcp_mode = ISC_TRUE;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 			} else if (rdtype == dns_rdatatype_a ||
Petr Menšík f505a4
 				   rdtype == dns_rdatatype_aaaa ||
Petr Menšík f505a4
 				   rdtype == dns_rdatatype_mx) {
Petr Menšík f505a4
@@ -767,7 +767,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
Petr Menšík f505a4
 			if (!lookup->rdtypeset ||
Petr Menšík f505a4
 			    lookup->rdtype != dns_rdatatype_axfr)
Petr Menšík f505a4
 				lookup->rdtype = dns_rdatatype_any;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 			idnoptions = 0;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 			list_type = dns_rdatatype_any;
Petr Menšík f505a4
@@ -881,7 +881,7 @@ main(int argc, char **argv) {
Petr Menšík f505a4
 	ISC_LIST_INIT(search_list);
Petr Menšík f505a4
 
Petr Menšík f505a4
 	fatalexit = 1;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 	idnoptions = IDN_ASCCHECK;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h
Petr Menšík f505a4
index 2c7a5aeaa8..446ee027af 100644
Petr Menšík f505a4
--- a/bin/dig/include/dig/dig.h
Petr Menšík f505a4
+++ b/bin/dig/include/dig/dig.h
Petr Menšík f505a4
@@ -130,6 +130,7 @@ struct dig_lookup {
Petr Menšík f505a4
 		ednsneg,
Petr Menšík f505a4
 		mapped,
Petr Menšík f505a4
 		print_unknown_format,
Petr Menšík f505a4
+		idnin,
Petr Menšík f505a4
 		idnout;
Petr Menšík f505a4
 #ifdef DIG_SIGCHASE
Petr Menšík f505a4
 isc_boolean_t	sigchase;
Petr Menšík f505a4
@@ -292,7 +293,7 @@ extern char *progname;
Petr Menšík f505a4
 extern int tries;
Petr Menšík f505a4
 extern int fatalexit;
Petr Menšík f505a4
 extern isc_boolean_t verbose;
Petr Menšík f505a4
-#ifdef WITH_IDN
Petr Menšík f505a4
+#ifdef WITH_IDNKIT
Petr Menšík f505a4
 extern int idnoptions;
Petr Menšík f505a4
 #endif
Petr Menšík f505a4
 
Petr Menšík f505a4
diff --git a/config.h.in b/config.h.in
Petr Menšík f505a4
index 29cdb07a50..cd798c288d 100644
Petr Menšík f505a4
--- a/config.h.in
Petr Menšík f505a4
+++ b/config.h.in
Petr Menšík f505a4
@@ -596,7 +596,16 @@ int sigwait(const unsigned int *set, int *sig);
Petr Menšík f505a4
 #undef WANT_QUERYTRACE
Petr Menšík f505a4
 
Petr Menšík f505a4
 /* define if idnkit support is to be included. */
Petr Menšík f505a4
-#undef WITH_IDN
Petr Menšík f505a4
+#undef WITH_IDNKIT
Petr Menšík f505a4
+
Petr Menšík f505a4
+/* define if IDN output support is to be included. */
Petr Menšík f505a4
+#undef WITH_IDN_OUT_SUPPORT
Petr Menšík f505a4
+
Petr Menšík f505a4
+/* define if IDN input support is to be included. */
Petr Menšík f505a4
+#undef WITH_IDN_SUPPORT
Petr Menšík f505a4
+
Petr Menšík f505a4
+/* define if libidn2 support is to be included. */
Petr Menšík f505a4
+#undef WITH_LIBIDN2
Petr Menšík f505a4
 
Petr Menšík f505a4
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
Petr Menšík f505a4
    significant byte first (like Motorola and SPARC, unlike Intel). */
Petr Menšík f505a4
diff --git a/configure b/configure
Petr Menšík f505a4
index 5ae413202f..ce9f393170 100755
Petr Menšík f505a4
--- a/configure
Petr Menšík f505a4
+++ b/configure
Petr Menšík f505a4
@@ -682,7 +682,9 @@ UNITTESTS
Petr Menšík f505a4
 ATFLIBS
Petr Menšík f505a4
 ATFBIN
Petr Menšík f505a4
 ATFBUILD
Petr Menšík f505a4
-IDNLIBS
Petr Menšík f505a4
+LIBIDN2_LIBS
Petr Menšík f505a4
+LIBIDN2_CFLAGS
Petr Menšík f505a4
+IDNKIT_LIBS
Petr Menšík f505a4
 XSLT_DBLATEX_FASTBOOK
Petr Menšík f505a4
 XSLT_DBLATEX_STYLE
Petr Menšík f505a4
 XSLT_DOCBOOK_MAKETOC_XHTML
Petr Menšík f505a4
@@ -1066,10 +1068,11 @@ enable_dnstap
Petr Menšík f505a4
 with_protobuf_c
Petr Menšík f505a4
 with_libfstrm
Petr Menšík f505a4
 with_docbook_xsl
Petr Menšík f505a4
-with_idn
Petr Menšík f505a4
+with_idnkit
Petr Menšík f505a4
 with_libiconv
Petr Menšík f505a4
 with_iconv
Petr Menšík f505a4
 with_idnlib
Petr Menšík f505a4
+with_libidn2
Petr Menšík f505a4
 with_atf
Petr Menšík f505a4
 with_tuning
Petr Menšík f505a4
 enable_querytrace
Petr Menšík f505a4
@@ -1794,10 +1797,11 @@ Optional Packages:
Petr Menšík f505a4
   --with-protobuf-c=path  Path where protobuf-c is installed, for dnstap
Petr Menšík f505a4
   --with-libfstrm=path    Path where libfstrm is installed, for dnstap
Petr Menšík f505a4
   --with-docbook-xsl=PATH specify path for Docbook-XSL stylesheets
Petr Menšík f505a4
-  --with-idn=MPREFIX      enable IDN support using idnkit [default PREFIX]
Petr Menšík f505a4
+  --with-idnkit=PATH      enable IDN support using idnkit [yes|no|path]
Petr Menšík f505a4
   --with-libiconv=IPREFIX GNU libiconv are in IPREFIX [default PREFIX]
Petr Menšík f505a4
   --with-iconv=LIBSPEC    specify iconv library [default -liconv]
Petr Menšík f505a4
   --with-idnlib=ARG       specify libidnkit
Petr Menšík f505a4
+  --with-libidn2=PATH     enable IDN support using GNU libidn2 [yes|no|path]
Petr Menšík f505a4
   --with-atf              support Automated Test Framework
Petr Menšík f505a4
   --with-tuning=ARG       Specify server tuning (large or default)
Petr Menšík f505a4
   --with-dlopen=ARG       support dynamically loadable DLZ drivers
Petr Menšík f505a4
@@ -22755,28 +22759,28 @@ fi
Petr Menšík f505a4
 
Petr Menšík f505a4
 
Petr Menšík f505a4
 #
Petr Menšík f505a4
-# IDN support
Petr Menšík f505a4
+# IDN support using idnkit
Petr Menšík f505a4
 #
Petr Menšík f505a4
 
Petr Menšík f505a4
-# Check whether --with-idn was given.
Petr Menšík f505a4
-if test "${with_idn+set}" = set; then :
Petr Menšík f505a4
-  withval=$with_idn; use_idn="$withval"
Petr Menšík f505a4
+# Check whether --with-idnkit was given.
Petr Menšík f505a4
+if test "${with_idnkit+set}" = set; then :
Petr Menšík f505a4
+  withval=$with_idnkit; use_idnkit="$withval"
Petr Menšík f505a4
 else
Petr Menšík f505a4
-  use_idn="no"
Petr Menšík f505a4
+  use_idnkit="no"
Petr Menšík f505a4
 fi
Petr Menšík f505a4
 
Petr Menšík f505a4
-case "$use_idn" in
Petr Menšík f505a4
+case "$use_idnkit" in
Petr Menšík f505a4
 yes)
Petr Menšík f505a4
 	if test X$prefix = XNONE ; then
Petr Menšík f505a4
-		idn_path=/usr/local
Petr Menšík f505a4
+		idnkit_path=/usr/local
Petr Menšík f505a4
 	else
Petr Menšík f505a4
-		idn_path=$prefix
Petr Menšík f505a4
+		idnkit_path=$prefix
Petr Menšík f505a4
 	fi
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 no)
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 *)
Petr Menšík f505a4
-	idn_path="$use_idn"
Petr Menšík f505a4
+	idnkit_path="$use_idnkit"
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 esac
Petr Menšík f505a4
 
Petr Menšík f505a4
@@ -22833,20 +22837,161 @@ if test "yes" = "$idnlib"; then
Petr Menšík f505a4
 	as_fn_error $? "You must specify ARG for --with-idnlib." "$LINENO" 5
Petr Menšík f505a4
 fi
Petr Menšík f505a4
 
Petr Menšík f505a4
-IDNLIBS=
Petr Menšík f505a4
-if test "no" != "$use_idn"; then
Petr Menšík f505a4
+IDNKIT_LIBS=
Petr Menšík f505a4
+if test "no" != "$use_idnkit"; then
Petr Menšík f505a4
 
Petr Menšík f505a4
-$as_echo "#define WITH_IDN 1" >>confdefs.h
Petr Menšík f505a4
+$as_echo "#define WITH_IDNKIT 1" >>confdefs.h
Petr Menšík f505a4
 
Petr Menšík f505a4
-	STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include"
Petr Menšík f505a4
+	STD_CINCLUDES="$STD_CINCLUDES -I$idnkit_path/include"
Petr Menšík f505a4
 	if test "no" != "$idnlib"; then
Petr Menšík f505a4
-		IDNLIBS="$idnlib $iconvlib"
Petr Menšík f505a4
+		IDNKIT_LIBS="$idnlib $iconvlib"
Petr Menšík f505a4
 	else
Petr Menšík f505a4
-		IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib"
Petr Menšík f505a4
+		IDNKIT_LIBS="-L$idnkit_path/lib -lidnkit $iconvlib"
Petr Menšík f505a4
 	fi
Petr Menšík f505a4
 fi
Petr Menšík f505a4
 
Petr Menšík f505a4
 
Petr Menšík f505a4
+#
Petr Menšík f505a4
+# IDN support using libidn2
Petr Menšík f505a4
+#
Petr Menšík f505a4
+
Petr Menšík f505a4
+LIBIDN2_CFLAGS=
Petr Menšík f505a4
+LIBIDN2_LIBS=
Petr Menšík f505a4
+
Petr Menšík f505a4
+# Check whether --with-libidn2 was given.
Petr Menšík f505a4
+if test "${with_libidn2+set}" = set; then :
Petr Menšík f505a4
+  withval=$with_libidn2; use_libidn2="$withval"
Petr Menšík f505a4
+else
Petr Menšík f505a4
+  use_libidn2="no"
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+
Petr Menšík f505a4
+case $use_libidn2 in #(
Petr Menšík f505a4
+  no) :
Petr Menšík f505a4
+    : ;; #(
Petr Menšík f505a4
+  yes) :
Petr Menšík f505a4
+
Petr Menšík f505a4
+	    LIBIDN2_LIBS="-lidn2"
Petr Menšík f505a4
+	 ;; #(
Petr Menšík f505a4
+  *) :
Petr Menšík f505a4
+
Petr Menšík f505a4
+	    LIBIDN2_CFLAGS="-I$use_libidn2/include"
Petr Menšík f505a4
+	    LIBIDN2_LIBS="-L$use_libidn2/lib -lidn2"
Petr Menšík f505a4
+	 ;; #(
Petr Menšík f505a4
+  *) :
Petr Menšík f505a4
+     ;;
Petr Menšík f505a4
+esac
Petr Menšík f505a4
+
Petr Menšík f505a4
+if test "$use_libidn2" != "no"; then :
Petr Menšík f505a4
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing idn2_to_ascii_8z" >&5
Petr Menšík f505a4
+$as_echo_n "checking for library containing idn2_to_ascii_8z... " >&6; }
Petr Menšík f505a4
+if ${ac_cv_search_idn2_to_ascii_8z+:} false; then :
Petr Menšík f505a4
+  $as_echo_n "(cached) " >&6
Petr Menšík f505a4
+else
Petr Menšík f505a4
+  ac_func_search_save_LIBS=$LIBS
Petr Menšík f505a4
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Petr Menšík f505a4
+/* end confdefs.h.  */
Petr Menšík f505a4
+
Petr Menšík f505a4
+/* Override any GCC internal prototype to avoid an error.
Petr Menšík f505a4
+   Use char because int might match the return type of a GCC
Petr Menšík f505a4
+   builtin and then its argument prototype would still apply.  */
Petr Menšík f505a4
+#ifdef __cplusplus
Petr Menšík f505a4
+extern "C"
Petr Menšík f505a4
+#endif
Petr Menšík f505a4
+char idn2_to_ascii_8z ();
Petr Menšík f505a4
+int
Petr Menšík f505a4
+main ()
Petr Menšík f505a4
+{
Petr Menšík f505a4
+return idn2_to_ascii_8z ();
Petr Menšík f505a4
+  ;
Petr Menšík f505a4
+  return 0;
Petr Menšík f505a4
+}
Petr Menšík f505a4
+_ACEOF
Petr Menšík f505a4
+for ac_lib in '' idn2; do
Petr Menšík f505a4
+  if test -z "$ac_lib"; then
Petr Menšík f505a4
+    ac_res="none required"
Petr Menšík f505a4
+  else
Petr Menšík f505a4
+    ac_res=-l$ac_lib
Petr Menšík f505a4
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
Petr Menšík f505a4
+  fi
Petr Menšík f505a4
+  if ac_fn_c_try_link "$LINENO"; then :
Petr Menšík f505a4
+  ac_cv_search_idn2_to_ascii_8z=$ac_res
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+rm -f core conftest.err conftest.$ac_objext \
Petr Menšík f505a4
+    conftest$ac_exeext
Petr Menšík f505a4
+  if ${ac_cv_search_idn2_to_ascii_8z+:} false; then :
Petr Menšík f505a4
+  break
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+done
Petr Menšík f505a4
+if ${ac_cv_search_idn2_to_ascii_8z+:} false; then :
Petr Menšík f505a4
+
Petr Menšík f505a4
+else
Petr Menšík f505a4
+  ac_cv_search_idn2_to_ascii_8z=no
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+rm conftest.$ac_ext
Petr Menšík f505a4
+LIBS=$ac_func_search_save_LIBS
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_idn2_to_ascii_8z" >&5
Petr Menšík f505a4
+$as_echo "$ac_cv_search_idn2_to_ascii_8z" >&6; }
Petr Menšík f505a4
+ac_res=$ac_cv_search_idn2_to_ascii_8z
Petr Menšík f505a4
+if test "$ac_res" != no; then :
Petr Menšík f505a4
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
Petr Menšík f505a4
+
Petr Menšík f505a4
+$as_echo "#define WITH_LIBIDN2 1" >>confdefs.h
Petr Menšík f505a4
+
Petr Menšík f505a4
+else
Petr Menšík f505a4
+  as_fn_error $? "libidn2 requested, but not found" "$LINENO" 5
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+
Petr Menšík f505a4
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libidn2 supports idn2_to_unicode_8zlz" >&5
Petr Menšík f505a4
+$as_echo_n "checking whether libidn2 supports idn2_to_unicode_8zlz... " >&6; }
Petr Menšík f505a4
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Petr Menšík f505a4
+/* end confdefs.h.  */
Petr Menšík f505a4
+#include <idn2.h>
Petr Menšík f505a4
+int
Petr Menšík f505a4
+main ()
Petr Menšík f505a4
+{
Petr Menšík f505a4
+idn2_to_unicode_8zlz(".", NULL, IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT);
Petr Menšík f505a4
+  ;
Petr Menšík f505a4
+  return 0;
Petr Menšík f505a4
+}
Petr Menšík f505a4
+_ACEOF
Petr Menšík f505a4
+if ac_fn_c_try_link "$LINENO"; then :
Petr Menšík f505a4
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
Petr Menšík f505a4
+$as_echo "yes" >&6; }
Petr Menšík f505a4
+
Petr Menšík f505a4
+$as_echo "#define WITH_IDN_OUT_SUPPORT 1" >>confdefs.h
Petr Menšík f505a4
+
Petr Menšík f505a4
+else
Petr Menšík f505a4
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
Petr Menšík f505a4
+$as_echo "no" >&6; }
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+rm -f core conftest.err conftest.$ac_objext \
Petr Menšík f505a4
+    conftest$ac_exeext conftest.$ac_ext
Petr Menšík f505a4
+
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+
Petr Menšík f505a4
+
Petr Menšík f505a4
+
Petr Menšík f505a4
+#
Petr Menšík f505a4
+# IDN support in general
Petr Menšík f505a4
+#
Petr Menšík f505a4
+
Petr Menšík f505a4
+# check if idnkit and libidn2 are not used at the same time
Petr Menšík f505a4
+if test "$use_idnkit" != no && test "$use_libidn2" != no; then
Petr Menšík f505a4
+    as_fn_error $? "idnkit and libidn2 cannot be used at the same time." "$LINENO" 5
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+# the IDN support is on
Petr Menšík f505a4
+if test "$use_idnkit" != no || test "$use_libidn2" != no; then
Petr Menšík f505a4
+
Petr Menšík f505a4
+$as_echo "#define WITH_IDN_SUPPORT 1" >>confdefs.h
Petr Menšík f505a4
+
Petr Menšík f505a4
+	if test "$use_libidn2" = no || test "$use_libidn2_out" != no; then
Petr Menšík f505a4
+
Petr Menšík f505a4
+$as_echo "#define WITH_IDN_OUT_SUPPORT 1" >>confdefs.h
Petr Menšík f505a4
+
Petr Menšík f505a4
+	fi
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+
Petr Menšík f505a4
 #
Petr Menšík f505a4
 # Check whether to build Automated Test Framework unit tests
Petr Menšík f505a4
 #
Petr Menšík f505a4
diff --git a/configure.in b/configure.in
Petr Menšík f505a4
index 388356a7c3..63988c97dc 100644
Petr Menšík f505a4
--- a/configure.in
Petr Menšík f505a4
+++ b/configure.in
Petr Menšík f505a4
@@ -4824,24 +4824,24 @@ NOM_PATH_FILE(XSLT_DBLATEX_STYLE, xsl/docbook.xsl, $dblatex_xsl_trees)
Petr Menšík f505a4
 NOM_PATH_FILE(XSLT_DBLATEX_FASTBOOK, xsl/latex_book_fast.xsl, $dblatex_xsl_trees)
Petr Menšík f505a4
 
Petr Menšík f505a4
 #
Petr Menšík f505a4
-# IDN support
Petr Menšík f505a4
+# IDN support using idnkit
Petr Menšík f505a4
 #
Petr Menšík f505a4
-AC_ARG_WITH(idn,
Petr Menšík f505a4
-	    AS_HELP_STRING([--with-idn[=MPREFIX]],
Petr Menšík f505a4
-			   [enable IDN support using idnkit [default PREFIX]]),
Petr Menšík f505a4
-	use_idn="$withval", use_idn="no")
Petr Menšík f505a4
-case "$use_idn" in
Petr Menšík f505a4
+AC_ARG_WITH(idnkit,
Petr Menšík f505a4
+	    AS_HELP_STRING([--with-idnkit[=PATH]],
Petr Menšík f505a4
+			   [enable IDN support using idnkit [yes|no|path]]),
Petr Menšík f505a4
+	use_idnkit="$withval", use_idnkit="no")
Petr Menšík f505a4
+case "$use_idnkit" in
Petr Menšík f505a4
 yes)
Petr Menšík f505a4
 	if test X$prefix = XNONE ; then
Petr Menšík f505a4
-		idn_path=/usr/local
Petr Menšík f505a4
+		idnkit_path=/usr/local
Petr Menšík f505a4
 	else
Petr Menšík f505a4
-		idn_path=$prefix
Petr Menšík f505a4
+		idnkit_path=$prefix
Petr Menšík f505a4
 	fi
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 no)
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 *)
Petr Menšík f505a4
-	idn_path="$use_idn"
Petr Menšík f505a4
+	idnkit_path="$use_idnkit"
Petr Menšík f505a4
 	;;
Petr Menšík f505a4
 esac
Petr Menšík f505a4
 
Petr Menšík f505a4
@@ -4887,17 +4887,66 @@ if test "yes" = "$idnlib"; then
Petr Menšík f505a4
 	AC_MSG_ERROR([You must specify ARG for --with-idnlib.])
Petr Menšík f505a4
 fi
Petr Menšík f505a4
 
Petr Menšík f505a4
-IDNLIBS=
Petr Menšík f505a4
-if test "no" != "$use_idn"; then
Petr Menšík f505a4
-	AC_DEFINE(WITH_IDN, 1, [define if idnkit support is to be included.])
Petr Menšík f505a4
-	STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include"
Petr Menšík f505a4
+IDNKIT_LIBS=
Petr Menšík f505a4
+if test "no" != "$use_idnkit"; then
Petr Menšík f505a4
+	AC_DEFINE(WITH_IDNKIT, 1, [define if idnkit support is to be included.])
Petr Menšík f505a4
+	STD_CINCLUDES="$STD_CINCLUDES -I$idnkit_path/include"
Petr Menšík f505a4
 	if test "no" != "$idnlib"; then
Petr Menšík f505a4
-		IDNLIBS="$idnlib $iconvlib"
Petr Menšík f505a4
+		IDNKIT_LIBS="$idnlib $iconvlib"
Petr Menšík f505a4
 	else
Petr Menšík f505a4
-		IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib"
Petr Menšík f505a4
+		IDNKIT_LIBS="-L$idnkit_path/lib -lidnkit $iconvlib"
Petr Menšík f505a4
+	fi
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+AC_SUBST(IDNKIT_LIBS)
Petr Menšík f505a4
+
Petr Menšík f505a4
+#
Petr Menšík f505a4
+# IDN support using libidn2
Petr Menšík f505a4
+#
Petr Menšík f505a4
+
Petr Menšík f505a4
+LIBIDN2_CFLAGS=
Petr Menšík f505a4
+LIBIDN2_LIBS=
Petr Menšík f505a4
+AC_ARG_WITH(libidn2,
Petr Menšík f505a4
+	AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no|path]]),
Petr Menšík f505a4
+	use_libidn2="$withval", use_libidn2="no")
Petr Menšík f505a4
+AS_CASE([$use_libidn2],
Petr Menšík f505a4
+	[no],[:],
Petr Menšík f505a4
+	[yes],[
Petr Menšík f505a4
+	    LIBIDN2_LIBS="-lidn2"
Petr Menšík f505a4
+	],
Petr Menšík f505a4
+	[*],[
Petr Menšík f505a4
+	    LIBIDN2_CFLAGS="-I$use_libidn2/include"
Petr Menšík f505a4
+	    LIBIDN2_LIBS="-L$use_libidn2/lib -lidn2"
Petr Menšík f505a4
+	])
Petr Menšík f505a4
+
Petr Menšík f505a4
+AS_IF([test "$use_libidn2" != "no"],
Petr Menšík f505a4
+      [AC_SEARCH_LIBS([idn2_to_ascii_8z], [idn2],
Petr Menšík f505a4
+		      [AC_DEFINE(WITH_LIBIDN2, 1, [define if libidn2 support is to be included.])],
Petr Menšík f505a4
+		      [AC_MSG_ERROR([libidn2 requested, but not found])])
Petr Menšík f505a4
+       AC_MSG_CHECKING(whether libidn2 supports idn2_to_unicode_8zlz)
Petr Menšík f505a4
+       AC_TRY_LINK([#include <idn2.h>],
Petr Menšík f505a4
+		   [idn2_to_unicode_8zlz(".", NULL, IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT);],
Petr Menšík f505a4
+		   [AC_MSG_RESULT(yes)
Petr Menšík f505a4
+		    AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.])],
Petr Menšík f505a4
+		   [AC_MSG_RESULT([no])])
Petr Menšík f505a4
+      ])
Petr Menšík f505a4
+AC_SUBST([LIBIDN2_CFLAGS])
Petr Menšík f505a4
+AC_SUBST([LIBIDN2_LIBS])
Petr Menšík f505a4
+
Petr Menšík f505a4
+#
Petr Menšík f505a4
+# IDN support in general
Petr Menšík f505a4
+#
Petr Menšík f505a4
+
Petr Menšík f505a4
+# check if idnkit and libidn2 are not used at the same time
Petr Menšík f505a4
+if test "$use_idnkit" != no && test "$use_libidn2" != no; then
Petr Menšík f505a4
+    AC_MSG_ERROR([idnkit and libidn2 cannot be used at the same time.])
Petr Menšík f505a4
+fi
Petr Menšík f505a4
+# the IDN support is on
Petr Menšík f505a4
+if test "$use_idnkit" != no || test "$use_libidn2" != no; then
Petr Menšík f505a4
+	AC_DEFINE(WITH_IDN_SUPPORT, 1, [define if IDN input support is to be included.])
Petr Menšík f505a4
+	if test "$use_libidn2" = no || test "$use_libidn2_out" != no; then
Petr Menšík f505a4
+		AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.])
Petr Menšík f505a4
 	fi
Petr Menšík f505a4
 fi
Petr Menšík f505a4
-AC_SUBST(IDNLIBS)
Petr Menšík f505a4
 
Petr Menšík f505a4
 #
Petr Menšík f505a4
 # Check whether to build Automated Test Framework unit tests
Petr Menšík f505a4
diff --git a/doc/arm/notes.xml b/doc/arm/notes.xml
Petr Menšík f505a4
index ec761018c8..ea9b61fd73 100644
Petr Menšík f505a4
--- a/doc/arm/notes.xml
Petr Menšík f505a4
+++ b/doc/arm/notes.xml
Petr Menšík f505a4
@@ -166,6 +166,14 @@
Petr Menšík f505a4
 	  [RT #43670]
Petr Menšík f505a4
 	</para>
Petr Menšík f505a4
       </listitem>
Petr Menšík f505a4
+      <listitem>
Petr Menšík f505a4
+	<para>
Petr Menšík f505a4
+	  <command>named</command> will now log a warning if the old
Petr Menšík f505a4
+	  BIND now can be compiled against libidn2 library to add
Petr Menšík f505a4
+	  IDNA2008 support.  Previously BIND only supported IDNA2003
Petr Menšík f505a4
+	  using (now obsolete) idnkit-1 library.
Petr Menšík f505a4
+	</para>
Petr Menšík f505a4
+      </listitem>
Petr Menšík f505a4
     </itemizedlist>
Petr Menšík f505a4
   </section>
Petr Menšík f505a4
 
Petr Menšík f505a4
@@ -242,6 +250,13 @@
Petr Menšík f505a4
 	  Multicast DNS. [RT #44783]
Petr Menšík f505a4
 	</para>
Petr Menšík f505a4
       </listitem>
Petr Menšík f505a4
+      <listitem>
Petr Menšík f505a4
+	<para>
Petr Menšík f505a4
+	  <command>dig +noidnin</command> can be used to disable IDN
Petr Menšík f505a4
+	  processing on the input domain name, when BIND is compiled
Petr Menšík f505a4
+	  with IDN support.
Petr Menšík f505a4
+	</para>
Petr Menšík f505a4
+      </listitem>
Petr Menšík f505a4
     </itemizedlist>
Petr Menšík f505a4
   </section>
Petr Menšík f505a4
 
Petr Menšík f505a4
-- 
Petr Menšík f505a4
2.14.3
Petr Menšík f505a4