+ }
+ freeaddrinfo(ai);
+ }
+ if (!tcpip_set_blocking(h, h->flags))
+ return 0;
+ return ai;
+}
+
+#if RESOLVER_THREAD
+
+void *resolver_thread(void *arg)
+{
+ COMSTACK h = (COMSTACK) arg;
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+
+ sp->ipv6_only = 0;
+ if (sp->ai)
+ freeaddrinfo(sp->ai);
+ sp->ai = tcpip_getaddrinfo(sp->hoststr, sp->port, &sp->ipv6_only);
+ write(sp->pipefd[1], "1", 1);
+ return 0;
+}
+
+static struct addrinfo *wait_resolver_thread(COMSTACK h)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ char buf;
+
+ read(sp->pipefd[0], &buf, 1);
+ yaz_thread_join(&sp->thread_id, 0);
+ close(sp->pipefd[0]);
+ close(sp->pipefd[1]);
+ sp->pipefd[0] = -1;
+ h->iofile = -1;
+ return create_net_socket(h);
+}
+
+#endif
+
+void *tcpip_straddr(COMSTACK h, const char *str)
+{
+ tcpip_state *sp = (tcpip_state *)h->cprivate;
+ const char *port = "210";
+
+ if (!tcpip_init())
+ return 0;
+
+ if (h->protocol == PROTO_HTTP)
+ {
+ if (h->type == ssl_type)
+ port = "443";
+ else
+ port = "80";
+ }
+#if RESOLVER_THREAD
+ if (h->flags & CS_FLAGS_DNS_NO_BLOCK)
+ {
+ if (sp->pipefd[0] != -1)
+ return 0;
+ if (pipe(sp->pipefd) == -1)
+ return 0;
+
+ sp->port = port;
+ xfree(sp->hoststr);
+ sp->hoststr = xstrdup(str);
+ sp->thread_id = yaz_thread_create(resolver_thread, h);
+ return sp->hoststr;
+ }
+#endif
+ if (sp->ai)
+ freeaddrinfo(sp->ai);
+ sp->ai = tcpip_getaddrinfo(str, port, &sp->ipv6_only);
+ if (sp->ai && h->state == CS_ST_UNBND)
+ {
+ return create_net_socket(h);