From: Adam Dickmeiss Date: Fri, 28 Feb 2014 12:29:53 +0000 (+0100) Subject: COMSTACK flag CS_FLAGS_DNS_NO_BLOCK X-Git-Tag: v5.0.19~14 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=e33389ee14d909d3a1b9874a40aa1b53c3fe42be;hp=84ace86c8329403df98997b634cd022565914c14 COMSTACK flag CS_FLAGS_DNS_NO_BLOCK which will enable non-blocking getaddrinfo . This flag is passed to macro cs_create and cs_create_host, cs_create_host_proxy functions. --- diff --git a/include/yaz/comstack.h b/include/yaz/comstack.h index e4237e6..2b4b4d5 100644 --- a/include/yaz/comstack.h +++ b/include/yaz/comstack.h @@ -161,6 +161,7 @@ YAZ_EXPORT int cs_parse_host(const char *uri, const char **host, #define CS_FLAGS_BLOCKING 1 #define CS_FLAGS_NUMERICHOST 2 +#define CS_FLAGS_DNS_NO_BLOCK 4 YAZ_END_CDECL diff --git a/src/tcpip.c b/src/tcpip.c index c3e477d..bc5c6ad 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -67,7 +67,9 @@ #include #include +#ifndef WIN32 #define RESOLVER_THREAD 1 +#endif static void tcpip_close(COMSTACK h); static int tcpip_put(COMSTACK h, char *buf, int size); @@ -479,6 +481,7 @@ static struct addrinfo *wait_resolver_thread(COMSTACK h) close(sp->pipefd[0]); close(sp->pipefd[1]); sp->pipefd[0] = -1; + h->iofile = -1; return create_net_socket(h); } @@ -500,17 +503,20 @@ void *tcpip_straddr(COMSTACK h, const char *str) port = "80"; } #if RESOLVER_THREAD - if (sp->pipefd[0] != -1) - return 0; - if (pipe(sp->pipefd) == -1) - return 0; + 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; -#else + 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); @@ -519,7 +525,6 @@ void *tcpip_straddr(COMSTACK h, const char *str) return create_net_socket(h); } return sp->ai; -#endif } #else @@ -1347,6 +1352,17 @@ void tcpip_close(COMSTACK h) tcpip_state *sp = (struct tcpip_state *)h->cprivate; TRC(fprintf(stderr, "tcpip_close: h=%p pid=%d\n", h, getpid())); +#if HAVE_GETADDRINFO +#if RESOLVER_THREAD + if (sp->pipefd[0] != -1) + { + yaz_thread_join(&sp->thread_id, 0); + close(sp->pipefd[0]); + close(sp->pipefd[1]); + h->iofile = -1; + } +#endif +#endif if (h->iofile != -1) { #if HAVE_GNUTLS_H