sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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