1IDN patch for bind-9.2.2
2========================
3
4
5This is a patch file for ISC BIND 9.2.2 to make it work with
6internationalized domain names.  With this patch you'll get IDN-aware
7dig/host/nslookup.
8
9To apply this patch, you should go to the top directory of the BIND
10distribution (where you see `README' file), then invoke `patch'
11command like this:
12
13	% patch -p0 < this-file
14
15Then follow the instructions described in `README.idnkit' to compile
16and install.
17
18
19Index: README.idnkit
20diff -c /dev/null mdn/othersrc/bind9/README.idnkit:1.3
21*** README.idnkit	Tue Mar 11 08:55:20 2003
22--- README.idnkit	Mon Mar 10 09:47:41 2003
23***************
24*** 0 ****
25--- 1,113 ----
26+
27+ 			BIND-9 IDN patch
28+
29+ 	       Japan Network Information Center (JPNIC)
30+
31+
32+ * What is this patch for?
33+
34+ This patch adds internationalized domain name (IDN) support to BIND-9.
35+ You'll get internationalized version of dig/host/nslookup commands.
36+
37+     + internationalized dig/host/nslookup
38+ 	dig/host/nslookup accepts non-ASCII domain names in the local
39+ 	codeset (such as Shift JIS, Big5 or ISO8859-1) determined by
40+ 	the locale information.  The domain names are normalized and
41+ 	converted to the encoding on the DNS protocol, and sent to DNS
42+ 	servers.  The replies are converted back to the local codeset
43+ 	and displayed.
44+
45+
46+ * Compilation & installation
47+
48+ 0. Prerequisite
49+
50+ You have to build and install idnkit before building this patched version
51+ of bind-9.
52+
53+ 1. Running configure script
54+
55+ Run `configure' in the top directory.  See `README' for the
56+ configuration options.
57+
58+ This patch adds the following 4 options to `configure'.  You should
59+ at least specify `--with-idn' option to enable IDN support.
60+
61+     --with-idn[=IDN_PREFIX]
62+ 	To enable IDN support, you have to specify `--with-idn' option.
63+ 	The argument IDN_PREFIX is the install prefix of idnkit.  If
64+ 	IDN_PREFIX is omitted, PREFIX (derived from `--prefix=PREFIX')
65+ 	is assumed.
66+
67+     --with-libiconv[=LIBICONV_PREFIX]
68+ 	Specify this option if idnkit you have installed links GNU
69+ 	libiconv.  The argument LIBICONV_PREFIX is install prefix of
70+ 	GNU libiconv.  If the argument is omitted, PREFIX (derived
71+ 	from `--prefix=PREFIX') is assumed.
72+
73+ 	`--with-libiconv' is shorthand option for GNU libiconv.
74+
75+ 	    --with-libiconv=/usr/local
76+
77+ 	This is equivalent to:
78+
79+ 	    --with-iconv='-L/usr/local/lib -R/usr/local/lib -liconv'
80+
81+ 	`--with-libiconv' assumes that your C compiler has `-R'
82+ 	option, and that the option adds the specified run-time path
83+ 	to an exacutable binary.  If `-R' option of your compiler has
84+ 	different meaning, or your compiler lacks the option, you
85+ 	should use `--with-iconv' option instead.  Binary command
86+ 	without run-time path information might be unexecutable.
87+ 	In that case, you would see an error message like:
88+
89+ 	    error in loading shared libraries: libiconv.so.2: cannot
90+ 	    open shared object file
91+
92+ 	If both `--with-libiconv' and `--with-iconv' options are
93+ 	specified, `--with-iconv' is prior to `--with-libiconv'.
94+
95+     --with-iconv=ICONV_LIBSPEC
96+ 	If your libc doens't provide iconv(), you need to specify the
97+ 	library containing iconv() with this option.  `ICONV_LIBSPEC'
98+ 	is the argument(s) to `cc' or `ld' to link the library, for
99+ 	example, `--with-iconv="-L/usr/local/lib -liconv"'.
100+ 	You don't need to specify the header file directory for "iconv.h"
101+ 	to the compiler, as it isn't included directly by bind-9 with
102+ 	this patch.
103+
104+     --with-idnlib=IDN_LIBSPEC
105+ 	With this option, you can explicitly specify the argument(s)
106+ 	to `cc' or `ld' to link the idnkit's library, `libidnkit'.  If
107+ 	this option is not specified, `-L${PREFIX}/lib -lidnkit' is
108+ 	assumed, where ${PREFIX} is the installation prefix specified
109+ 	with `--with-idn' option above.  You may need to use this
110+ 	option to specify extra argments, for example,
111+ 	`--with-idnlib="-L/usr/local/lib -R/usr/local/lib -lidnkit"'.
112+
113+ Please consult `README' for other configuration options.
114+
115+ Note that if you want to specify some extra header file directories,
116+ you should use the environment variable STD_CINCLUDES instead of
117+ CFLAGS, as described in README.
118+
119+ 2. Compilation and installation
120+
121+ After running "configure", just do
122+
123+ 	make
124+ 	make install
125+
126+ for compiling and installing.
127+
128+
129+ * Contact information
130+
131+ Please see http//www.nic.ad.jp/en/idn/ for the latest news
132+ about idnkit and this patch.
133+
134+ Bug reports and comments on this kit should be sent to
135+ mdnkit-bugs@nic.ad.jp and idn-cmt@nic.ad.jp, respectively.
136+
137+
138+ ; $Id: bind-9.2.2-patch,v 1.1 2003/06/04 00:27:32 marka Exp $
139Index: config.h.in
140diff -c mdn/othersrc/bind9/config.h.in:1.1.1.6 mdn/othersrc/bind9/config.h.in:1.12
141*** config.h.in	Tue Nov 27 16:55:45 2001
142--- config.h.in	Tue Mar 19 16:45:35 2002
143***************
144*** 141,146 ****
145--- 141,149 ----
146  /* define if you have strerror in the C library. */
147  #undef HAVE_STRERROR
148
149+ /* Define if you have the setlocale function.  */
150+ #undef HAVE_SETLOCALE
151+
152  /* Define if you have the <dlfcn.h> header file.  */
153  #undef HAVE_DLFCN_H
154
155***************
156*** 150,155 ****
157--- 153,161 ----
158  /* Define if you have the <linux/capability.h> header file.  */
159  #undef HAVE_LINUX_CAPABILITY_H
160
161+ /* Define if you have the <locale.h> header file.  */
162+ #undef HAVE_LOCALE_H
163+
164  /* Define if you have the <sys/prctl.h> header file.  */
165  #undef HAVE_SYS_PRCTL_H
166
167***************
168*** 176,178 ****
169--- 182,188 ----
170
171  /* Define if you have the socket library (-lsocket).  */
172  #undef HAVE_LIBSOCKET
173+
174+ /* define if idnkit support is to be included. */
175+ #undef WITH_IDN
176+
177Index: configure
178diff -c mdn/othersrc/bind9/configure:1.1.1.10 mdn/othersrc/bind9/configure:1.16
179*** configure	Wed Mar  5 17:14:55 2003
180--- configure	Thu Mar  6 20:10:05 2003
181***************
182*** 1007,1012 ****
183--- 1007,1016 ----
184      --with-gnu-ld           assume the C compiler uses GNU ld default=no
185      --with-pic              try to use only PIC/non-PIC objects default=use both
186    --with-kame=PATH	use Kame IPv6 default path /usr/local/v6
187+   --with-idn=MPREFIX   enable IDN support using idnkit default PREFIX
188+   --with-libiconv=IPREFIX   GNU libiconv are in IPREFIX default PREFIX
189+   --with-iconv=LIBSPEC   specify iconv library default -liconv
190+   --with-idnlib=ARG    specify libidnkit
191
192  Some influential environment variables:
193    CC          C compiler command
194***************
195*** 7371,7377 ****
196  case $host in
197  *-*-irix6*)
198    # Find out which ABI we are using.
199!   echo '#line 7374 "configure"' > conftest.$ac_ext
200    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
201    (eval $ac_compile) 2>&5
202    ac_status=$?
203--- 7375,7381 ----
204  case $host in
205  *-*-irix6*)
206    # Find out which ABI we are using.
207!   echo '#line 7378 "configure"' > conftest.$ac_ext
208    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
209    (eval $ac_compile) 2>&5
210    ac_status=$?
211***************
212*** 7914,7920 ****
213  save_CFLAGS="$CFLAGS"
214  CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
215  compiler_c_o=no
216! if { (eval echo configure:7917: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
217    # The compiler can only warn and ignore the option if not recognized
218    # So say no if there are warnings
219    if test -s out/conftest.err; then
220--- 7918,7924 ----
221  save_CFLAGS="$CFLAGS"
222  CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
223  compiler_c_o=no
224! if { (eval echo configure:7921: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
225    # The compiler can only warn and ignore the option if not recognized
226    # So say no if there are warnings
227    if test -s out/conftest.err; then
228***************
229*** 9599,9605 ****
230      lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
231    lt_status=$lt_dlunknown
232    cat > conftest.$ac_ext <<EOF
233! #line 9602 "configure"
234  #include "confdefs.h"
235
236  #if HAVE_DLFCN_H
237--- 9603,9609 ----
238      lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
239    lt_status=$lt_dlunknown
240    cat > conftest.$ac_ext <<EOF
241! #line 9606 "configure"
242  #include "confdefs.h"
243
244  #if HAVE_DLFCN_H
245***************
246*** 9697,9703 ****
247      lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
248    lt_status=$lt_dlunknown
249    cat > conftest.$ac_ext <<EOF
250! #line 9700 "configure"
251  #include "confdefs.h"
252
253  #if HAVE_DLFCN_H
254--- 9701,9707 ----
255      lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
256    lt_status=$lt_dlunknown
257    cat > conftest.$ac_ext <<EOF
258! #line 9704 "configure"
259  #include "confdefs.h"
260
261  #if HAVE_DLFCN_H
262***************
263*** 13265,13270 ****
264--- 13269,13580 ----
265
266
267  #
268+ # IDN support
269+ #
270+
271+ # Check whether --with-idn or --without-idn was given.
272+ if test "${with_idn+set}" = set; then
273+   withval="$with_idn"
274+   use_idn="$withval"
275+ else
276+   use_idn="no"
277+ fi;
278+ case "$use_idn" in
279+ yes)
280+ 	if test X$prefix = XNONE ; then
281+ 		idn_path=/usr/local
282+ 	else
283+ 		idn_path=$prefix
284+ 	fi
285+ 	;;
286+ no)
287+ 	;;
288+ *)
289+ 	idn_path="$use_idn"
290+ 	;;
291+ esac
292+
293+ iconvinc=
294+ iconvlib=
295+
296+ # Check whether --with-libiconv or --without-libiconv was given.
297+ if test "${with_libiconv+set}" = set; then
298+   withval="$with_libiconv"
299+   use_libiconv="$withval"
300+ else
301+   use_libiconv="no"
302+ fi;
303+ case "$use_libiconv" in
304+ yes)
305+ 	if test X$prefix = XNONE ; then
306+ 		iconvlib="-L/usr/local/lib -R/usr/local/lib -liconv"
307+ 	else
308+ 		iconvlib="-L$prefix/lib -R$prefix/lib -liconv"
309+ 	fi
310+ 	;;
311+ no)
312+ 	iconvlib=
313+ 	;;
314+ *)
315+ 	iconvlib="-L$use_libiconv/lib -R$use_libiconv/lib -liconv"
316+ 	;;
317+ esac
318+
319+
320+ # Check whether --with-iconv or --without-iconv was given.
321+ if test "${with_iconv+set}" = set; then
322+   withval="$with_iconv"
323+   iconvlib="$withval"
324+ fi;
325+ case "$iconvlib" in
326+ no)
327+ 	iconvlib=
328+ 	;;
329+ yes)
330+ 	iconvlib=-liconv
331+ 	;;
332+ esac
333+
334+
335+ # Check whether --with-idnlib or --without-idnlib was given.
336+ if test "${with_idnlib+set}" = set; then
337+   withval="$with_idnlib"
338+   idnlib="$withval"
339+ else
340+   idnlib="no"
341+ fi;
342+ if test "$idnlib" = yes; then
343+ 	{ { echo "$as_me:$LINENO: error: You must specify ARG for --with-idnlib." >&5
344+ echo "$as_me: error: You must specify ARG for --with-idnlib." >&2;}
345+    { (exit 1); exit 1; }; }
346+ fi
347+
348+ IDNLIBS=
349+ if test "$use_idn" != no; then
350+
351+ cat >>confdefs.h <<\_ACEOF
352+ #define WITH_IDN 1
353+ _ACEOF
354+
355+ 	STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include"
356+ 	if test "$idnlib" != no; then
357+ 		IDNLIBS="$idnlib $iconvlib"
358+ 	else
359+ 		IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib"
360+ 	fi
361+ fi
362+
363+
364+
365+ for ac_header in locale.h
366+ do
367+ as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
368+ if eval "test \"\${$as_ac_Header+set}\" = set"; then
369+   echo "$as_me:$LINENO: checking for $ac_header" >&5
370+ echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
371+ if eval "test \"\${$as_ac_Header+set}\" = set"; then
372+   echo $ECHO_N "(cached) $ECHO_C" >&6
373+ fi
374+ echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
375+ echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
376+ else
377+   # Is the header compilable?
378+ echo "$as_me:$LINENO: checking $ac_header usability" >&5
379+ echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
380+ cat >conftest.$ac_ext <<_ACEOF
381+ #line $LINENO "configure"
382+ #include "confdefs.h"
383+ $ac_includes_default
384+ #include <$ac_header>
385+ _ACEOF
386+ rm -f conftest.$ac_objext
387+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
388+   (eval $ac_compile) 2>&5
389+   ac_status=$?
390+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
391+   (exit $ac_status); } &&
392+          { ac_try='test -s conftest.$ac_objext'
393+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
394+   (eval $ac_try) 2>&5
395+   ac_status=$?
396+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
397+   (exit $ac_status); }; }; then
398+   ac_header_compiler=yes
399+ else
400+   echo "$as_me: failed program was:" >&5
401+ cat conftest.$ac_ext >&5
402+ ac_header_compiler=no
403+ fi
404+ rm -f conftest.$ac_objext conftest.$ac_ext
405+ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
406+ echo "${ECHO_T}$ac_header_compiler" >&6
407+
408+ # Is the header present?
409+ echo "$as_me:$LINENO: checking $ac_header presence" >&5
410+ echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
411+ cat >conftest.$ac_ext <<_ACEOF
412+ #line $LINENO "configure"
413+ #include "confdefs.h"
414+ #include <$ac_header>
415+ _ACEOF
416+ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
417+   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
418+   ac_status=$?
419+   egrep -v '^ *\+' conftest.er1 >conftest.err
420+   rm -f conftest.er1
421+   cat conftest.err >&5
422+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
423+   (exit $ac_status); } >/dev/null; then
424+   if test -s conftest.err; then
425+     ac_cpp_err=$ac_c_preproc_warn_flag
426+   else
427+     ac_cpp_err=
428+   fi
429+ else
430+   ac_cpp_err=yes
431+ fi
432+ if test -z "$ac_cpp_err"; then
433+   ac_header_preproc=yes
434+ else
435+   echo "$as_me: failed program was:" >&5
436+   cat conftest.$ac_ext >&5
437+   ac_header_preproc=no
438+ fi
439+ rm -f conftest.err conftest.$ac_ext
440+ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
441+ echo "${ECHO_T}$ac_header_preproc" >&6
442+
443+ # So?  What about this header?
444+ case $ac_header_compiler:$ac_header_preproc in
445+   yes:no )
446+     { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
447+ echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
448+     { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
449+ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
450+   no:yes )
451+     { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
452+ echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
453+     { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
454+ echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
455+     { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
456+ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
457+ esac
458+ echo "$as_me:$LINENO: checking for $ac_header" >&5
459+ echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
460+ if eval "test \"\${$as_ac_Header+set}\" = set"; then
461+   echo $ECHO_N "(cached) $ECHO_C" >&6
462+ else
463+   eval "$as_ac_Header=$ac_header_preproc"
464+ fi
465+ echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
466+ echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
467+
468+ fi
469+ if test `eval echo '${'$as_ac_Header'}'` = yes; then
470+   cat >>confdefs.h <<_ACEOF
471+ #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
472+ _ACEOF
473+
474+ fi
475+
476+ done
477+
478+
479+ for ac_func in setlocale
480+ do
481+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
482+ echo "$as_me:$LINENO: checking for $ac_func" >&5
483+ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
484+ if eval "test \"\${$as_ac_var+set}\" = set"; then
485+   echo $ECHO_N "(cached) $ECHO_C" >&6
486+ else
487+   cat >conftest.$ac_ext <<_ACEOF
488+ #line $LINENO "configure"
489+ #include "confdefs.h"
490+ /* From autoconf 2.57 */
491+ /* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
492+    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
493+ #define $ac_func innocuous_$ac_func
494+
495+ /* System header to define __stub macros and hopefully few prototypes,
496+     which can conflict with char $ac_func (); below.
497+     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
498+     <limits.h> exists even on freestanding compilers.  */
499+
500+ #ifdef __STDC__
501+ # include <limits.h>
502+ #else
503+ # include <assert.h>
504+ #endif
505+
506+ #undef $ac_func
507+
508+ /* Override any gcc2 internal prototype to avoid an error.  */
509+ #ifdef __cplusplus
510+ extern "C"
511+ {
512+ #endif
513+ /* We use char because int might match the return type of a gcc2
514+    builtin and then its argument prototype would still apply.  */
515+ char $ac_func ();
516+ /* The GNU C library defines this for functions which it implements
517+     to always fail with ENOSYS.  Some functions are actually named
518+     something starting with __ and the normal name is an alias.  */
519+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
520+ choke me
521+ #else
522+ char (*f) () = $ac_func;
523+ #endif
524+ #ifdef __cplusplus
525+ }
526+ #endif
527+
528+ #ifdef F77_DUMMY_MAIN
529+ #  ifdef __cplusplus
530+      extern "C"
531+ #  endif
532+    int F77_DUMMY_MAIN() { return 1; }
533+ #endif
534+ int
535+ main ()
536+ {
537+ return f != $ac_func;
538+   ;
539+   return 0;
540+ }
541+ _ACEOF
542+ rm -f conftest.$ac_objext conftest$ac_exeext
543+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
544+   (eval $ac_link) 2>&5
545+   ac_status=$?
546+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
547+   (exit $ac_status); } &&
548+          { ac_try='test -s conftest$ac_exeext'
549+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
550+   (eval $ac_try) 2>&5
551+   ac_status=$?
552+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
553+   (exit $ac_status); }; }; then
554+   eval "$as_ac_var=yes"
555+ else
556+   echo "$as_me: failed program was:" >&5
557+ cat conftest.$ac_ext >&5
558+ eval "$as_ac_var=no"
559+ fi
560+ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
561+ fi
562+ echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
563+ echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
564+ if test `eval echo '${'$as_ac_var'}'` = yes; then
565+   cat >>confdefs.h <<_ACEOF
566+ #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
567+ _ACEOF
568+
569+ fi
570+ done
571+
572+
573+ #
574  # Substitutions
575  #
576
577***************
578*** 14061,14066 ****
579--- 14371,14377 ----
580  s,@PRINTSTYLE@,$PRINTSTYLE,;t t
581  s,@XMLDCL@,$XMLDCL,;t t
582  s,@DOCBOOK2MANSPEC@,$DOCBOOK2MANSPEC,;t t
583+ s,@IDNLIBS@,$IDNLIBS,;t t
584  s,@BIND9_TOP_BUILDDIR@,$BIND9_TOP_BUILDDIR,;t t
585  s,@BIND9_ISC_BUILDINCLUDE@,$BIND9_ISC_BUILDINCLUDE,;t t
586  s,@BIND9_ISCCC_BUILDINCLUDE@,$BIND9_ISCCC_BUILDINCLUDE,;t t
587Index: configure.in
588diff -c mdn/othersrc/bind9/configure.in:1.1.1.10 mdn/othersrc/bind9/configure.in:1.16
589*** configure.in	Wed Mar  5 17:14:56 2003
590--- configure.in	Wed Mar  5 17:37:08 2003
591***************
592*** 1681,1686 ****
593--- 1681,1762 ----
594  NOM_PATH_FILE(DOCBOOK2MANSPEC, docbook2X/docbook2man-spec.pl, $sgmltrees)
595
596  #
597+ # IDN support
598+ #
599+ AC_ARG_WITH(idn,
600+ 	[  --with-idn[=MPREFIX]   enable IDN support using idnkit [default PREFIX]],
601+ 	use_idn="$withval", use_idn="no")
602+ case "$use_idn" in
603+ yes)
604+ 	if test X$prefix = XNONE ; then
605+ 		idn_path=/usr/local
606+ 	else
607+ 		idn_path=$prefix
608+ 	fi
609+ 	;;
610+ no)
611+ 	;;
612+ *)
613+ 	idn_path="$use_idn"
614+ 	;;
615+ esac
616+
617+ iconvinc=
618+ iconvlib=
619+ AC_ARG_WITH(libiconv,
620+ 	[  --with-libiconv[=IPREFIX]   GNU libiconv are in IPREFIX [default PREFIX]],
621+ 	use_libiconv="$withval", use_libiconv="no")
622+ case "$use_libiconv" in
623+ yes)
624+ 	if test X$prefix = XNONE ; then
625+ 		iconvlib="-L/usr/local/lib -R/usr/local/lib -liconv"
626+ 	else
627+ 		iconvlib="-L$prefix/lib -R$prefix/lib -liconv"
628+ 	fi
629+ 	;;
630+ no)
631+ 	iconvlib=
632+ 	;;
633+ *)
634+ 	iconvlib="-L$use_libiconv/lib -R$use_libiconv/lib -liconv"
635+ 	;;
636+ esac
637+
638+ AC_ARG_WITH(iconv,
639+ 	[  --with-iconv[=LIBSPEC]   specify iconv library [default -liconv]],
640+ 	iconvlib="$withval")
641+ case "$iconvlib" in
642+ no)
643+ 	iconvlib=
644+ 	;;
645+ yes)
646+ 	iconvlib=-liconv
647+ 	;;
648+ esac
649+
650+ AC_ARG_WITH(idnlib,
651+ 	[  --with-idnlib=ARG    specify libidnkit],
652+ 	idnlib="$withval", idnlib="no")
653+ if test "$idnlib" = yes; then
654+ 	AC_MSG_ERROR([You must specify ARG for --with-idnlib.])
655+ fi
656+
657+ IDNLIBS=
658+ if test "$use_idn" != no; then
659+ 	AC_DEFINE(WITH_IDN, 1, [define if idnkit support is to be included.])
660+ 	STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include"
661+ 	if test "$idnlib" != no; then
662+ 		IDNLIBS="$idnlib $iconvlib"
663+ 	else
664+ 		IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib"
665+ 	fi
666+ fi
667+ AC_SUBST(IDNLIBS)
668+
669+ AC_CHECK_HEADERS(locale.h)
670+ AC_CHECK_FUNCS(setlocale)
671+
672+ #
673  # Substitutions
674  #
675  AC_SUBST(BIND9_TOP_BUILDDIR)
676Index: bin/dig/Makefile.in
677diff -c mdn/othersrc/bind9/bin/dig/Makefile.in:1.1.1.6 mdn/othersrc/bind9/bin/dig/Makefile.in:1.3
678*** bin/dig/Makefile.in	Tue Nov 27 16:55:50 2001
679--- bin/dig/Makefile.in	Tue Mar 19 16:45:35 2002
680***************
681*** 36,42 ****
682
683  DEPLIBS =	${DNSDEPLIBS} ${ISCDEPLIBS}
684
685! LIBS =		${DNSLIBS} ${ISCLIBS} @LIBS@
686
687  SUBDIRS =
688
689--- 36,42 ----
690
691  DEPLIBS =	${DNSDEPLIBS} ${ISCDEPLIBS}
692
693! LIBS =		${DNSLIBS} ${ISCLIBS} @IDNLIBS@ @LIBS@
694
695  SUBDIRS =
696
697Index: bin/dig/dig.1
698diff -c mdn/othersrc/bind9/bin/dig/dig.1:1.1.1.3 mdn/othersrc/bind9/bin/dig/dig.1:1.5
699*** bin/dig/dig.1	Wed Mar  5 17:14:57 2003
700--- bin/dig/dig.1	Wed Mar  5 17:42:53 2003
701***************
702*** 349,354 ****
703--- 349,365 ----
704  \fI+noqr\fR which means that \fBdig\fR
705  will not print the initial query when it looks up the NS records for
706  isc.org.
707+ .SH "IDN SUPPORT"
708+ .PP
709+ If \fBdig\fR has been built with IDN (internationalized
710+ domain name) support, it can accept and display non-ASCII domain names.
711+ \fBdig\fR appropriately converts character encoding of
712+ domain name before sending a request to DNS server or displaying a
713+ reply from the server.
714+ If you'd like to turn off the IDN support for some reason, defines
715+ the \fBIDN_DISABLE\fR environment variable.
716+ The IDN support is disabled if the the variable is set when
717+ \fBdig\fR runs.
718  .SH "FILES"
719  .PP
720  \fI/etc/resolv.conf\fR
721Index: bin/dig/dig.docbook
722diff -c mdn/othersrc/bind9/bin/dig/dig.docbook:1.1.1.3 mdn/othersrc/bind9/bin/dig/dig.docbook:1.5
723*** bin/dig/dig.docbook	Wed Mar  5 17:14:57 2003
724--- bin/dig/dig.docbook	Wed Mar  5 17:42:53 2003
725***************
726*** 523,528 ****
727--- 523,543 ----
728  </refsect1>
729
730  <refsect1>
731+ <title>IDN SUPPORT</title>
732+ <para>
733+ If <command>dig</command> has been built with IDN (internationalized
734+ domain name) support, it can accept and display non-ASCII domain names.
735+ <command>dig</command> appropriately converts character encoding of
736+ domain name before sending a request to DNS server or displaying a
737+ reply from the server.
738+ If you'd like to turn off the IDN support for some reason, defines
739+ the <envar>IDN_DISABLE</envar> environment variable.
740+ The IDN support is disabled if the the variable is set when
741+ <command>dig</command> runs.
742+ </para>
743+ </refsect1>
744+
745+ <refsect1>
746  <title>FILES</title>
747  <para>
748  <filename>/etc/resolv.conf</filename>
749Index: bin/dig/dighost.c
750diff -c mdn/othersrc/bind9/bin/dig/dighost.c:1.1.1.13 mdn/othersrc/bind9/bin/dig/dighost.c:1.33
751*** bin/dig/dighost.c	Wed Mar  5 17:14:57 2003
752--- bin/dig/dighost.c	Wed Mar  5 17:42:53 2003
753***************
754*** 32,37 ****
755--- 32,48 ----
756  #include <string.h>
757  #include <limits.h>
758
759+ #ifdef HAVE_LOCALE_H
760+ #include <locale.h>
761+ #endif
762+
763+ #ifdef WITH_IDN
764+ #include <idn/result.h>
765+ #include <idn/log.h>
766+ #include <idn/resconf.h>
767+ #include <idn/api.h>
768+ #endif
769+
770  #include <dns/byaddr.h>
771  #include <dns/fixedname.h>
772  #include <dns/message.h>
773***************
774*** 130,135 ****
775--- 141,158 ----
776  isc_mutex_t lookup_lock;
777  dig_lookup_t *current_lookup = NULL;
778
779+ #ifdef WITH_IDN
780+ static void	      initialize_idn(void);
781+ static isc_result_t   output_filter(isc_buffer_t *buffer,
782+ 				    unsigned int used_org,
783+ 				    isc_boolean_t absolute);
784+ static idn_result_t   append_textname(char *name, const char *origin,
785+ 				      size_t namesize);
786+ static void	      idn_check_result(idn_result_t r, const char *msg);
787+
788+ #define MAXDLEN               256
789+ #endif
790+
791  /*
792   * Apply and clear locks at the event level in global task.
793   * Can I get rid of these using shutdown events?  XXX
794***************
795*** 648,653 ****
796--- 671,680 ----
797  		ISC_LIST_APPEND(server_list, srv, link);
798  	}
799
800+ #ifdef WITH_IDN
801+ 	initialize_idn();
802+ #endif
803+
804  	if (keyfile[0] != 0)
805  		setup_file_key();
806  	else if (keysecret[0] != 0)
807***************
808*** 1168,1173 ****
809--- 1195,1208 ----
810  	isc_buffer_t b;
811  	dns_compress_t cctx;
812  	char store[MXNAME];
813+ #ifdef WITH_IDN
814+ 	idn_result_t mr;
815+ 	char utf8_textname[MXNAME], utf8_origin[MXNAME], idn_textname[MXNAME];
816+ #endif
817+
818+ #ifdef WITH_IDN
819+ 	dns_name_settotextfilter(output_filter);
820+ #endif
821
822  	REQUIRE(lookup != NULL);
823  	INSIST(!free_now);
824***************
825*** 1196,1201 ****
826--- 1231,1247 ----
827  	isc_buffer_init(&lookup->onamebuf, lookup->onamespace,
828  			sizeof(lookup->onamespace));
829
830+ #ifdef WITH_IDN
831+ 	/*
832+ 	 * We cannot convert `textname' and `origin' separately.
833+ 	 * `textname' doesn't contain TLD, but local mapping needs
834+ 	 * TLD.
835+ 	 */
836+ 	mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP, lookup->textname,
837+ 			    utf8_textname, sizeof(utf8_textname));
838+ 	idn_check_result(mr, "convert textname to UTF-8");
839+ #endif
840+
841  	/*
842  	 * If the name has too many dots, force the origin to be NULL
843  	 * (which produces an absolute lookup).  Otherwise, take the origin
844***************
845*** 1204,1215 ****
846--- 1250,1290 ----
847  	 * is TRUE or we got a domain line in the resolv.conf file.
848  	 */
849  	/* XXX New search here? */
850+ #ifdef WITH_IDN
851+ 	if ((count_dots(utf8_textname) >= ndots) || !usesearch)
852+ 		lookup->origin = NULL; /* Force abs lookup */
853+ 	else if (lookup->origin == NULL && lookup->new_search && usesearch) {
854+ 		lookup->origin = ISC_LIST_HEAD(search_list);
855+ 	}
856+ #else
857  	if ((count_dots(lookup->textname) >= ndots) || !usesearch)
858  		lookup->origin = NULL; /* Force abs lookup */
859  	else if (lookup->origin == NULL && lookup->new_search && usesearch) {
860  		lookup->origin = ISC_LIST_HEAD(search_list);
861  	}
862+ #endif
863+
864+ #ifdef WITH_IDN
865  	if (lookup->origin != NULL) {
866+ 		mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP,
867+ 				    lookup->origin->origin, utf8_origin,
868+ 				    sizeof(utf8_origin));
869+ 		idn_check_result(mr, "convert origin to UTF-8");
870+ 		mr = append_textname(utf8_textname, utf8_origin,
871+ 				     sizeof(utf8_textname));
872+ 		idn_check_result(mr, "append origin to textname");
873+ 	}
874+ 	mr = idn_encodename(IDN_LOCALMAP | IDN_NAMEPREP | IDN_ASCCHECK |
875+ 			    IDN_IDNCONV | IDN_LENCHECK, utf8_textname,
876+ 			    idn_textname, sizeof(idn_textname));
877+ 	idn_check_result(mr, "convert UTF-8 textname to IDN encoding");
878+ #endif
879+
880+ #ifdef WITH_IDN
881+ 	if (0) {
882+ #else
883+ 	if (lookup->origin != NULL) {
884+ #endif
885  		debug("trying origin %s", lookup->origin->origin);
886  		result = dns_message_gettempname(lookup->sendmsg,
887  						 &lookup->oname);
888***************
889*** 1254,1259 ****
890--- 1329,1343 ----
891  		if (lookup->trace && lookup->trace_root)
892  			dns_name_clone(dns_rootname, lookup->name);
893  		else {
894+ #ifdef WITH_IDN
895+ 			len = strlen(idn_textname);
896+ 			isc_buffer_init(&b, idn_textname, len);
897+ 			isc_buffer_add(&b, len);
898+ 			result = dns_name_fromtext(lookup->name, &b,
899+ 						   dns_rootname,
900+ 						   ISC_FALSE,
901+ 						   &lookup->namebuf);
902+ #else
903  			len = strlen(lookup->textname);
904  			isc_buffer_init(&b, lookup->textname, len);
905  			isc_buffer_add(&b, len);
906***************
907*** 1261,1266 ****
908--- 1345,1351 ----
909  						   dns_rootname,
910  						   ISC_FALSE,
911  						   &lookup->namebuf);
912+ #endif
913  		}
914  		if (result != ISC_R_SUCCESS) {
915  			dns_message_puttempname(lookup->sendmsg,
916***************
917*** 2663,2665 ****
918--- 2748,2848 ----
919  	if (mctx != NULL)
920  		isc_mem_destroy(&mctx);
921  }
922+
923+ #ifdef WITH_IDN
924+ static void
925+ initialize_idn(void) {
926+ 	idn_result_t r;
927+
928+ #ifdef HAVE_SETLOCALE
929+ 	/* Set locale */
930+ 	(void)setlocale(LC_ALL, "");
931+ #endif
932+ 	/* Create configuration context. */
933+ 	r = idn_nameinit(1);
934+ 	if (r != idn_success)
935+ 		fatal("idn api initialization failed: %s",
936+ 		      idn_result_tostring(r));
937+
938+ 	/* Set domain name -> text post-conversion filter. */
939+ 	dns_name_settotextfilter(output_filter);
940+ }
941+
942+ static isc_result_t
943+ output_filter(isc_buffer_t *buffer, unsigned int used_org,
944+ 	      isc_boolean_t absolute)
945+ {
946+ 	char tmp1[MAXDLEN], tmp2[MAXDLEN];
947+ 	size_t fromlen, tolen;
948+ 	isc_boolean_t end_with_dot;
949+
950+ 	/*
951+ 	 * Copy contents of 'buffer' to 'tmp1', supply trailing dot
952+ 	 * if 'absolute' is true, and terminate with NUL.
953+ 	 */
954+ 	fromlen = isc_buffer_usedlength(buffer) - used_org;
955+ 	if (fromlen >= MAXDLEN)
956+ 		return (ISC_R_SUCCESS);
957+ 	memcpy(tmp1, (char *)isc_buffer_base(buffer) + used_org, fromlen);
958+ 	end_with_dot = (tmp1[fromlen - 1] == '.') ? ISC_TRUE : ISC_FALSE;
959+ 	if (absolute && !end_with_dot) {
960+ 		fromlen++;
961+ 		if (fromlen >= MAXDLEN)
962+ 			return (ISC_R_SUCCESS);
963+ 		tmp1[fromlen - 1] = '.';
964+ 	}
965+ 	tmp1[fromlen] = '\0';
966+
967+ 	/*
968+ 	 * Convert contents of 'tmp1' to local encoding.
969+ 	 */
970+ 	if (idn_decodename(IDN_DECODE_APP, tmp1, tmp2, MAXDLEN) != idn_success)
971+ 		return (ISC_R_SUCCESS);
972+ 	strcpy(tmp1, tmp2);
973+
974+ 	/*
975+ 	 * Copy the converted contents in 'tmp1' back to 'buffer'.
976+ 	 * If we have appended trailing dot, remove it.
977+ 	 */
978+ 	tolen = strlen(tmp1);
979+ 	if (absolute && !end_with_dot && tmp1[tolen - 1] == '.')
980+ 		tolen--;
981+
982+ 	if (isc_buffer_length(buffer) < used_org + tolen)
983+ 		return (ISC_R_NOSPACE);
984+
985+ 	isc_buffer_subtract(buffer, isc_buffer_usedlength(buffer) - used_org);
986+ 	memcpy(isc_buffer_used(buffer), tmp1, tolen);
987+ 	isc_buffer_add(buffer, tolen);
988+
989+ 	return (ISC_R_SUCCESS);
990+ }
991+
992+ static idn_result_t
993+ append_textname(char *name, const char *origin, size_t namesize) {
994+ 	size_t namelen = strlen(name);
995+ 	size_t originlen = strlen(origin);
996+
997+ 	/* Already absolute? */
998+ 	if (namelen > 0 && name[namelen - 1] == '.')
999+ 		return idn_success;
1000+
1001+ 	/* Append dot and origin */
1002+
1003+ 	if (namelen + 1 + originlen >= namesize)
1004+ 		return idn_buffer_overflow;
1005+
1006+ 	name[namelen++] = '.';
1007+ 	(void)strcpy(name + namelen, origin);
1008+ 	return idn_success;
1009+ }
1010+
1011+ static void
1012+ idn_check_result(idn_result_t r, const char *msg) {
1013+ 	if (r != idn_success) {
1014+ 		exitcode = 1;
1015+ 		fatal("%s: %s", msg, idn_result_tostring(r));
1016+ 	}
1017+ }
1018+
1019+ #endif /* WITH_IDN */
1020Index: bin/dig/host.1
1021diff -c mdn/othersrc/bind9/bin/dig/host.1:1.1.1.2 mdn/othersrc/bind9/bin/dig/host.1:1.4
1022*** bin/dig/host.1	Wed Mar  5 17:14:57 2003
1023--- bin/dig/host.1	Wed Mar  5 17:42:53 2003
1024***************
1025*** 120,125 ****
1026--- 120,136 ----
1027  effectively wait forever for a reply. The time to wait for a response
1028  will be set to the number of seconds given by the hardware's maximum
1029  value for an integer quantity.
1030+ .SH "IDN SUPPORT"
1031+ .PP
1032+ If \fBhost\fR has been built with IDN (internationalized
1033+ domain name) support, it can accept and display non-ASCII domain names.
1034+ \fBhost\fR appropriately converts character encoding of
1035+ domain name before sending a request to DNS server or displaying a
1036+ reply from the server.
1037+ If you'd like to turn off the IDN support for some reason, defines
1038+ the \fBIDN_DISABLE\fR environment variable.
1039+ The IDN support is disabled if the the variable is set when
1040+ \fBhost\fR runs.
1041  .SH "FILES"
1042  .PP
1043  \fI/etc/resolv.conf\fR
1044Index: bin/dig/host.docbook
1045diff -c mdn/othersrc/bind9/bin/dig/host.docbook:1.1.1.2 mdn/othersrc/bind9/bin/dig/host.docbook:1.4
1046*** bin/dig/host.docbook	Wed Mar  5 17:14:57 2003
1047--- bin/dig/host.docbook	Wed Mar  5 17:42:53 2003
1048***************
1049*** 181,186 ****
1050--- 181,201 ----
1051  </refsect1>
1052
1053  <refsect1>
1054+ <title>IDN SUPPORT</title>
1055+ <para>
1056+ If <command>host</command> has been built with IDN (internationalized
1057+ domain name) support, it can accept and display non-ASCII domain names.
1058+ <command>host</command> appropriately converts character encoding of
1059+ domain name before sending a request to DNS server or displaying a
1060+ reply from the server.
1061+ If you'd like to turn off the IDN support for some reason, defines
1062+ the <envar>IDN_DISABLE</envar> environment variable.
1063+ The IDN support is disabled if the the variable is set when
1064+ <command>host</command> runs.
1065+ </para>
1066+ </refsect1>
1067+
1068+ <refsect1>
1069  <title>FILES</title>
1070  <para>
1071  <filename>/etc/resolv.conf</filename>
1072Index: lib/dns/name.c
1073diff -c mdn/othersrc/bind9/lib/dns/name.c:1.1.1.11 mdn/othersrc/bind9/lib/dns/name.c:1.15
1074*** lib/dns/name.c	Wed Mar  5 17:16:22 2003
1075--- lib/dns/name.c	Wed Mar  5 17:49:58 2003
1076***************
1077*** 194,199 ****
1078--- 194,206 ----
1079  /* XXXDCL make const? */
1080  dns_name_t *dns_wildcardname = &wild;
1081
1082+ #ifdef WITH_IDN
1083+ /*
1084+  * dns_name_t to text post-conversion procedure.
1085+  */
1086+ static dns_name_totextfilter_t totext_filter_proc = NULL;
1087+ #endif
1088+
1089  static void
1090  set_offsets(const dns_name_t *name, unsigned char *offsets,
1091  	    dns_name_t *set_name);
1092***************
1093*** 1684,1689 ****
1094--- 1691,1699 ----
1095  	unsigned int labels;
1096  	isc_boolean_t saw_root = ISC_FALSE;
1097  	char num[4];
1098+ #ifdef WITH_IDN
1099+ 	unsigned int oused = target->used;
1100+ #endif
1101
1102  	/*
1103  	 * This function assumes the name is in proper uncompressed
1104***************
1105*** 1861,1866 ****
1106--- 1871,1880 ----
1107
1108  	isc_buffer_add(target, tlen - trem);
1109
1110+ #ifdef WITH_IDN
1111+ 	if (totext_filter_proc != NULL)
1112+ 		return ((*totext_filter_proc)(target, oused, saw_root));
1113+ #endif
1114  	return (ISC_R_SUCCESS);
1115  }
1116
1117***************
1118*** 3325,3327 ****
1119--- 3339,3347 ----
1120  	return (ISC_R_SUCCESS);
1121  }
1122
1123+ #ifdef WITH_IDN
1124+ void
1125+ dns_name_settotextfilter(dns_name_totextfilter_t proc) {
1126+ 	totext_filter_proc = proc;
1127+ }
1128+ #endif
1129Index: lib/dns/include/dns/name.h
1130diff -c mdn/othersrc/bind9/lib/dns/include/dns/name.h:1.1.1.7 mdn/othersrc/bind9/lib/dns/include/dns/name.h:1.10
1131*** lib/dns/include/dns/name.h	Wed May 22 17:15:29 2002
1132--- lib/dns/include/dns/name.h	Mon May 27 12:10:15 2002
1133***************
1134*** 219,224 ****
1135--- 219,235 ----
1136   */
1137  #define DNS_NAME_MAXWIRE 255
1138
1139+ #ifdef WITH_IDN
1140+ /*
1141+  * Text output filter procedure.
1142+  * 'target' is the buffer to be converted.  The region to be converted
1143+  * is from 'buffer'->base + 'used_org' to the end of the used region.
1144+  */
1145+ typedef isc_result_t (*dns_name_totextfilter_t)(isc_buffer_t *target,
1146+ 						unsigned int used_org,
1147+ 						isc_boolean_t absolute);
1148+ #endif
1149+
1150  /***
1151   *** Initialization
1152   ***/
1153***************
1154*** 1244,1249 ****
1155--- 1255,1268 ----
1156   *	'size' > 0.
1157   *
1158   */
1159+
1160+ #ifdef WITH_IDN
1161+ void
1162+ dns_name_settotextfilter(dns_name_totextfilter_t proc);
1163+ /*
1164+  * Call 'proc' at the end of dns_name_totext.
1165+  */
1166+ #endif /* WITH_IDN */
1167
1168  #define DNS_NAME_FORMATSIZE (DNS_NAME_MAXTEXT + 1)
1169  /*
1170