diff options
Diffstat (limited to 'sysdeps/posix/getaddrinfo.c')
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 4885a53118..372bc9de4a 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -62,6 +62,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define UNIX_PATH_MAX 108 #endif +extern int idna_to_ascii_lz (const char *input, char **output, int flags); +#define IDNA_SUCCESS 0 +#ifdef HAVE_LIBIDN +# define SUPPORTED_IDN_FLAGS AI_IDN|AI_CANONIDN +#else +# define SUPPORTED_IDN_FLAGS 0 +#endif + struct gaih_service { const char *name; @@ -539,6 +547,18 @@ gaih_inet (const char *name, const struct gaih_service *service, at->scopeid = 0; at->next = NULL; +#if 0 + if (req->ai_flags & AI_IDN) + { + char *p; + rc = idna_to_ascii_lz (name, &p, 0); + if (rc != IDNA_SUCCESS) + return -EAI_IDN_ENCODE; + name = strdupa (p); + free (p); + } +#endif + if (inet_pton (AF_INET, name, at->addr) > 0) { if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET) @@ -1049,7 +1069,7 @@ match_prefix (const struct sockaddr_storage *ss, const struct prefixlist *list, if (bits < 8) { - if ((*mask & (0xff >> bits)) == (*val & (0xff >> bits))) + if ((*mask & (0xff00 >> bits)) == (*val & (0xff00 >> bits))) /* Match! */ break; } @@ -1250,10 +1270,10 @@ getaddrinfo (const char *name, const char *service, if (hints->ai_flags & ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|AI_ADDRCONFIG|AI_V4MAPPED - |AI_ALL)) + |SUPPORTED_IDN_FLAGS|AI_ALL)) return EAI_BADFLAGS; - if ((hints->ai_flags & AI_CANONNAME) && name == NULL) + if ((hints->ai_flags & (AI_CANONNAME|AI_CANONIDN)) && name == NULL) return EAI_BADFLAGS; if (hints->ai_flags & AI_ADDRCONFIG) |