ii-ipv6.diff (1649B)
1 --- ii.c.orig 2007-07-22 11:54:29.061710701 +0100 2 +++ ii.c 2007-07-22 14:08:42.833057387 +0100 3 @@ -153,25 +153,45 @@ 4 5 static int tcpopen(unsigned short port) { 6 int fd; 7 - struct sockaddr_in sin; 8 - struct hostent *hp = gethostbyname(host); 9 - 10 - memset(&sin, 0, sizeof(struct sockaddr_in)); 11 - if(!hp) { 12 - perror("ii: cannot retrieve host information"); 13 + struct addrinfo req, *res, *orig_res; 14 + char service[6]; 15 + char errmsg[512]; 16 + 17 + snprintf(service, 6, "%u", port); 18 + memset(&req, 0, sizeof(req)); 19 + req.ai_flags = AI_NUMERICSERV; 20 + req.ai_socktype = SOCK_STREAM; 21 + int e = getaddrinfo(host, service, &req, &res); 22 + if(e) { 23 + fprintf(stderr, "ii: getaddrinfo() failed : %s\n", gai_strerror(e)); 24 exit(EXIT_FAILURE); 25 } 26 - sin.sin_family = AF_INET; 27 - memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); 28 - sin.sin_port = htons(port); 29 - if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 30 - perror("ii: cannot create socket"); 31 - exit(EXIT_FAILURE); 32 + 33 + orig_res = res; 34 + for (; res; res = res->ai_next ) { 35 + fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 36 + 37 + if(fd < 0) { 38 + snprintf(errmsg, sizeof(errmsg), "ii: socket() failed : %s", strerror(fd)); 39 + continue; 40 + } 41 + 42 + if(connect(fd, res->ai_addr, res->ai_addrlen) != 0) { 43 + snprintf(errmsg, sizeof(errmsg), "ii: connect() failed : %s", strerror(errno)); 44 + fd = -1; 45 + continue; 46 + } 47 + 48 + /* sucessful connection */ 49 + break; 50 } 51 - if(connect(fd, (const struct sockaddr *) &sin, sizeof(sin)) < 0) { 52 - perror("ii: cannot connect to host"); 53 + freeaddrinfo(orig_res); 54 + 55 + if(fd < 0) { 56 + fprintf(stderr, "%s\n", errmsg); 57 exit(EXIT_FAILURE); 58 } 59 + 60 return fd; 61 } 62