- initaddr(&tmpaddr);
- parseaddr(connhost, 0, paf_parse, &tmpaddr);
- if ((fd = socket(tmpaddr.sa.sa_family, SOCK_STREAM, IPPROTO_TCP)) < 0 ||
- (DA_LEN(&bindhosts) &&
- bind(fd, &bindaddr.sa, addrsz(&bindaddr))) ||
- connect(fd, &tmpaddr.sa, addrsz(&tmpaddr)))
- die(1, "couldn't connect to TCP server: %s", strerror(errno));
+ aihint.ai_socktype = SOCK_STREAM;
+ aihint.ai_protocol = IPPROTO_TCP;
+ aihint.ai_flags = AI_ADDRCONFIG;
+ parseaddr(&aihint, connhost, 0, paf_parse, &ailist);
+
+ for (ai = ailist; ai; ai = ai->ai_next) {
+ if ((fd = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP)) >= 0 &&
+ (!DA_LEN(&bindhosts) ||
+ !bind(fd, &bindaddr.sa, addrsz(&bindaddr))) &&
+ !connect(fd, ai->ai_addr, ai->ai_addrlen))
+ goto conn_tcp;
+ if (fd >= 0) close(fd);
+ }
+ die(1, "couldn't connect to TCP server: %s", strerror(errno));
+ conn_tcp: