+#endif
+
+static int _xcb_open_tcp(char *host, const unsigned short port)
+{
+ int fd = -1;
+ struct addrinfo hints = { 0
+#ifdef AI_ADDRCONFIG
+ | AI_ADDRCONFIG
+#endif
+#ifdef AI_NUMERICSERV
+ | AI_NUMERICSERV
+#endif
+ , AF_UNSPEC, SOCK_STREAM };
+ char service[6]; /* "65535" with the trailing '\0' */
+ struct addrinfo *results, *addr;
+ char *bracket;
+
+ /* Allow IPv6 addresses enclosed in brackets. */
+ if(host[0] == '[' && (bracket = strrchr(host, ']')) && bracket[1] == '\0')
+ {
+ *bracket = '\0';
+ ++host;
+ hints.ai_flags |= AI_NUMERICHOST;
+ hints.ai_family = AF_INET6;
+ }
+
+ snprintf(service, sizeof(service), "%hu", port);
+ if(getaddrinfo(host, service, &hints, &results))
+ /* FIXME: use gai_strerror, and fill in error connection */
+ return -1;
+
+ for(addr = results; addr; addr = addr->ai_next)
+ {
+ fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
+ if(fd >= 0 && connect(fd, addr->ai_addr, addr->ai_addrlen) >= 0)
+ break;
+ fd = -1;
+ }
+ freeaddrinfo(results);
+ return fd;
+}