The following is a patch that demonstrates GNU Libidn's
internationalized domain name features in the GNU InetUtils "ping"
utility.

This is just a teaser, limited by two facts:

1) The real ACE prefix has not been chosen by the RFC editor yet, so
   it uses "iesg--" for now.

2) It is likely that this functionality will be wrapped in a system
   function similar to gethostbyname() so that each and every network
   application does not have to link with GNU Libidn directly.

For more information on GNU Libidn, see:
<http://www.gnu.org/software/libidn/>

Simon Josefsson <simon@josefsson.org> 2003-01-08

latte:/home/jas/src/inetutils/ping# ./ping räksmörgås              
PING räksmörgås [iesg--rksmrgs-5wao1o.josefsson.org] (217.13.230.178): 56 data bytes
64 bytes from 217.13.230.178: icmp_seq=0 ttl=54 time=16.128 ms
64 bytes from 217.13.230.178: icmp_seq=1 ttl=54 time=16.872 ms
64 bytes from 217.13.230.178: icmp_seq=2 ttl=54 time=16.923 ms
64 bytes from 217.13.230.178: icmp_seq=3 ttl=54 time=16.076 ms
64 bytes from 217.13.230.178: icmp_seq=4 ttl=54 time=16.825 ms
--- räksmörgås [iesg--rksmrgs-5wao1o.josefsson.org] ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 16.076/16.565/16.923/0.380 ms
latte:/home/jas/src/inetutils/ping# 

? config.h
? stamp-h1
Index: configure.ac
===================================================================
RCS file: /cvsroot/inetutils/inetutils/configure.ac,v
retrieving revision 1.16
diff -u -p -r1.16 configure.ac
--- configure.ac	23 Dec 2002 05:05:46 -0000	1.16
+++ configure.ac	8 Jan 2003 12:42:17 -0000
@@ -799,6 +799,19 @@ case "$host" in
   ;;
 esac
 
+# Check for GNU Libidn
+AC_ARG_WITH(idn,
+  AC_HELP_STRING([--without-idn],
+		[don't use GNU Libidn for IDN]))
+if test "$with_idn" != "no" ; then
+  PKG_CHECK_MODULES(LIBIDN, libidn >= 0.1.2, with_idn=yes, with_idn=no)
+fi
+if test "$with_idn" != "no" ; then
+  AC_DEFINE(HAVE_IDN, 1, [Define to 1 to use GNU Libidn for IDN.])
+fi
+AC_MSG_CHECKING([if GNU Libidn should be used for IDN])
+AC_MSG_RESULT($with_idn)
+
 AC_CONFIG_FILES([Makefile libinetutils/Makefile libtelnet/Makefile glob/Makefile
 libicmp/Makefile ping/Makefile ftp/Makefile ftpd/Makefile inetd/Makefile
 rcp/Makefile
Index: libicmp/Makefile.am
===================================================================
RCS file: /cvsroot/inetutils/inetutils/libicmp/Makefile.am,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile.am
--- libicmp/Makefile.am	11 Feb 2002 04:17:00 -0000	1.3
+++ libicmp/Makefile.am	8 Jan 2003 12:42:17 -0000
@@ -1,6 +1,6 @@
 AUTOMAKE_OPTIONS = ../ansi2knr
 
-INCLUDES = -I$(top_builddir)/include
+INCLUDES = -I$(top_builddir)/include @LIBIDN_CFLAGS@
 
 noinst_LIBRARIES = libicmp.a
 
Index: libicmp/libping.c
===================================================================
RCS file: /cvsroot/inetutils/inetutils/libicmp/libping.c,v
retrieving revision 1.5
diff -u -p -r1.5 libping.c
--- libicmp/libping.c	11 Aug 2001 08:32:20 -0000	1.5
+++ libicmp/libping.c	8 Jan 2003 12:42:17 -0000
@@ -318,7 +318,17 @@ ping_set_dest (PING *ping, char *host)
     }
   else
     {
-      struct hostent *hp = gethostbyname (host);
+      struct hostent *hp;
+#ifdef HAVE_IDN
+      char *p;
+      int rc;
+
+      rc = idna_locale_to_ace (host, &p);
+      hp = gethostbyname (p);
+      free(p);
+#else
+      hp = gethostbyname (host);
+#endif
       if (!hp)
 	return 1;
 
@@ -327,7 +337,18 @@ ping_set_dest (PING *ping, char *host)
 	hp->h_length = sizeof (s_in->sin_addr);
 
       memcpy (&s_in->sin_addr, hp->h_addr, hp->h_length);
+#ifdef HAVE_IDN
+      ping->ping_hostname = malloc(strlen(host) +
+				   strlen(" [") +
+				   strlen(hp->h_name) +
+				   strlen("]") + 1);
+      strcpy(ping->ping_hostname, host);
+      strcat(ping->ping_hostname, " [");
+      strcat(ping->ping_hostname, hp->h_name);
+      strcat(ping->ping_hostname, "]");
+#else
       ping->ping_hostname = strdup (hp->h_name);
+#endif
     }
   return 0;
 }
Index: ping/Makefile.am
===================================================================
RCS file: /cvsroot/inetutils/inetutils/ping/Makefile.am,v
retrieving revision 1.12
diff -u -p -r1.12 Makefile.am
--- ping/Makefile.am	28 Apr 2002 17:16:30 -0000	1.12
+++ ping/Makefile.am	8 Jan 2003 12:42:17 -0000
@@ -7,7 +7,7 @@ EXTRA_PROGRAMS = ping
 man_MANS = ping.8
 EXTRA_DIST = $(man_MANS)
 
-LDADD = -L../libinetutils -linetutils -lm -L../libicmp -licmp
+LDADD = -L../libinetutils -linetutils -lm -L../libicmp -licmp @LIBIDN_LIBS@
 INCLUDES = -I$(top_srcdir)/libicmp -I$(top_builddir)/include
 
 ping_SOURCES = ping.c \