From 9bcd4b407ccf30418d9375da8907a6552313738a Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Tue, 24 Jan 2017 08:55:06 +0100 Subject: tools: depend on gnutls_idna_map() instead of using directly libidn/libidn2 Signed-off-by: Nikos Mavrogiannopoulos --- src/socket.c | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/src/socket.c b/src/socket.c index 2c7e9009c1..a8fd3652b9 100644 --- a/src/socket.c +++ b/src/socket.c @@ -385,10 +385,12 @@ socket_open(socket_st * hd, const char *hostname, const char *service, struct addrinfo hints, *res, *ptr; int sd, err = 0; int udp = flags & SOCKET_FLAG_UDP; + int ret; int fastopen = flags & SOCKET_FLAG_FASTOPEN; char buffer[MAX_BUF + 1]; char portname[16] = { 0 }; - char *a_hostname = (char*)hostname; + gnutls_datum_t idna; + char *a_hostname; memset(hd, 0, sizeof(*hd)); @@ -400,37 +402,17 @@ socket_open(socket_st * hd, const char *hostname, const char *service, hd->rdata.size = rdata->size; } -#ifdef HAVE_LIBIDN2 -#if IDN2_VERSION_NUMBER >= 0x00140000 - /* IDN2_NONTRANSITIONAL automatically converts to lowercase - * IDN2_NFC_INPUT converts to NFC before toASCII conversion - * - * Since IDN2_NONTRANSITIONAL implicitely does NFC conversion, we don't need - * the additional IDN2_NFC_INPUT. But just for the unlikely case that the linked - * library is not matching the headers when building and it doesn't support TR46, - * we provide IDN2_NFC_INPUT. */ - - err = idn2_lookup_u8((uint8_t *)hostname, (uint8_t **)&a_hostname, IDN2_NFC_INPUT | IDN2_NONTRANSITIONAL); -#else - err = idn2_lookup_u8((uint8_t *)hostname, (uint8_t **)&a_hostname, IDN2_NFC_INPUT); -#endif - if (err != IDN2_OK) { - fprintf(stderr, "Cannot convert %s to IDNA: %s\n", hostname, - idn2_strerror(err)); - exit(1); - } -#elif defined HAVE_LIBIDN - err = idna_to_ascii_8z(hostname, &a_hostname, IDNA_ALLOW_UNASSIGNED); - if (err != IDNA_SUCCESS) { - fprintf(stderr, "Cannot convert %s to IDNA: %s\n", hostname, - idna_strerror(err)); + ret = gnutls_idna_map(hostname, strlen(hostname), &idna, 0); + if (ret < 0) { + fprintf(stderr, "Cannot convert %s to IDNA: %s\n", hostname, gnutls_strerror(ret)); exit(1); } -#endif + hd->hostname = strdup(hostname); + a_hostname = (char*)idna.data; if (msg != NULL) - printf("Resolving '%s:%s'...\n", a_hostname,service); + printf("Resolving '%s:%s'...\n", a_hostname, service); /* get server name */ memset(&hints, 0, sizeof(hints)); @@ -551,9 +533,7 @@ socket_open(socket_st * hd, const char *hostname, const char *service, hd->ptr = ptr; hd->addr_info = res; hd->rdata.data = NULL; -#ifdef HAVE_LIBIDN - idn_free(a_hostname); -#endif + gnutls_free(idna.data); return; } -- cgit v1.2.1