This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Internationalized domain names teaser
- From: Simon Josefsson <jas at extundo dot com>
- To: bug-inetutils at gnu dot org, libc-alpha at sources dot redhat dot com
- Date: Wed, 08 Jan 2003 13:59:05 +0100
- Subject: Internationalized domain names teaser
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.
This post is intended to start discussion on how to properly support
IDNs on the GNU system. Defining the API for a modified
gethostbyname() function that acts as a IDN enabled wrapper around the
normal gethostbyname() could be one outcome of the discussion.
Is anyone on the GNU Libc list aware of any API standardization in
this area? Any thought or input on this is appreciated.
For more information on GNU Libidn, see:
<http://www.gnu.org/software/libidn/>
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 \