From 168998ec7f12494c629246f9e7c482f52d7b8ea4 Mon Sep 17 00:00:00 2001 From: Julian Kranz Date: Fri, 27 Jan 2012 17:09:32 +0100 Subject: [PATCH] Iodine: IPv6 --- src/client.c | 58 +++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/client.c b/src/client.c index b2da031..43adde6 100644 --- a/src/client.c +++ b/src/client.c @@ -190,35 +190,41 @@ client_set_nameserver(const char *cp, int port) struct in_addr addr; struct in6_addr ipv6addr; - if(_v6_connect) { - struct addrinfo hints, *servinfo, *p; - int rv; +#ifdef LINUX + if (_v6_connect) { + if (inet_pton(AF_INET6, cp, &ipv6addr) != 1) { + struct addrinfo hints, *servinfo, *p; + int rv; - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_INET6; + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET6; - if ((rv = getaddrinfo(cp, NULL, &hints, &servinfo)) != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); - errx(1, "error resolving nameserver '%s'...", cp); + if ((rv = getaddrinfo(cp, NULL, &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); + errx(1, "error resolving nameserver '%s'...", cp); + } + + for (p = servinfo; p != NULL; p = p->ai_next) { + if (p->ai_family == AF_INET6) + break; + } + + //Resolved ordns.he.net to Segmentation fault + + if (p == NULL) + errx(1, "error resolving nameserver '%s'...", cp); + + memcpy(&ipv6addr, &((struct sockaddr_in6*) p->ai_addr)->sin6_addr, + sizeof(ipv6addr)); + + fprintf(stderr, "Resolved %s to ", cp); + ipv6_print(&ipv6addr, 0); + + freeaddrinfo(servinfo); } - - for(p = servinfo; p != NULL; p = p->ai_next) { - if(p->ai_family == AF_INET6) - break; - } - - //Resolved ordns.he.net to Segmentation fault - - if (p == NULL) - errx(1, "error resolving nameserver '%s'...", cp); - - memcpy(&ipv6addr, &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(ipv6addr)); - - fprintf(stderr, "Resolved %s to ", cp); - ipv6_print(&ipv6addr, 0); - - freeaddrinfo(servinfo); - } else if (inet_aton(cp, &addr) != 1) { + } else +#endif + if (inet_aton(cp, &addr) != 1) { /* try resolving if a domain is given */ struct hostent *host; const char *err;