From: Adam Dickmeiss Date: Tue, 25 Feb 2014 07:33:57 +0000 (+0100) Subject: Merge branch 'master' into yaz-743 X-Git-Tag: v5.0.16~2 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=afb64586ca7d3f97d06d867dd4ca0fe2297a1bf5;hp=4341559a11eeaa00d60efbefd0b3538abb2ef622 Merge branch 'master' into yaz-743 --- diff --git a/src/tcpip.c b/src/tcpip.c index 3c448dd..60e3606 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -118,6 +118,7 @@ typedef struct tcpip_state int (*complete)(const char *buf, int len); /* length/complete. */ #if HAVE_GETADDRINFO struct addrinfo *ai; + struct addrinfo *ai_this; #else struct sockaddr_in addr; /* returned by cs_straddr */ #endif @@ -418,13 +419,16 @@ void *tcpip_straddr(COMSTACK h, const char *str) if (sp->ai && h->state == CS_ST_UNBND) { int s = -1; - for (ai = sp->ai; ai; ai = ai->ai_next) + if (ipv6_only >= 0) { - if (ai->ai_family == AF_INET6) + for (ai = sp->ai; ai; ai = ai->ai_next) { - s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (s != -1) - break; + if (ai->ai_family == AF_INET6) + { + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (s != -1) + break; + } } } if (s == -1) @@ -438,6 +442,8 @@ void *tcpip_straddr(COMSTACK h, const char *str) } if (s == -1) return 0; + fprintf(stderr, "First socket fd=%d\n", s); + sp->ai_this = ai; assert(ai); h->iofile = s; if (ai->ai_family == AF_INET6 && ipv6_only >= 0 && @@ -489,6 +495,36 @@ int tcpip_more(COMSTACK h) return sp->altlen && (*sp->complete)(sp->altbuf, sp->altlen); } +static int cont_connect(COMSTACK h) +{ +#if HAVE_GETADDRINFO + tcpip_state *sp = (tcpip_state *)h->cprivate; + struct addrinfo *ai = sp->ai_this; + while (ai && (ai = ai->ai_next)) + { + int s; + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (s != -1) + { +#ifdef WIN32 + closesocket(h->iofile); +#else + close(h->iofile); +#endif + fprintf(stderr, "Other socket call fd=%d\n", s); + h->state = CS_ST_UNBND; + h->iofile = s; + sp->ai_this = ai; + tcpip_set_blocking(h, h->flags); + return tcpip_connect(h, ai); + } +#endif + } + h->cerrno = CSYSERR; + return -1; +} + + /* * connect(2) will block (sometimes) - nothing we can do short of doing * weird things like spawning subprocesses or threading or some weird junk @@ -498,7 +534,6 @@ int tcpip_connect(COMSTACK h, void *address) { #if HAVE_GETADDRINFO struct addrinfo *ai = (struct addrinfo *) address; - tcpip_state *sp = (tcpip_state *)h->cprivate; #else struct sockaddr_in *add = (struct sockaddr_in *) address; #endif @@ -512,8 +547,6 @@ int tcpip_connect(COMSTACK h, void *address) } #if HAVE_GETADDRINFO r = connect(h->iofile, ai->ai_addr, ai->ai_addrlen); - freeaddrinfo(sp->ai); - sp->ai = 0; #else r = connect(h->iofile, (struct sockaddr *) add, sizeof(*add)); #endif @@ -530,14 +563,14 @@ int tcpip_connect(COMSTACK h, void *address) #else if (yaz_errno() == EINPROGRESS) { + fprintf(stderr, "Pending fd=%d\n", h->iofile); h->event = CS_CONNECT; h->state = CS_ST_CONNECTING; h->io_pending = CS_WANT_WRITE|CS_WANT_READ; return 1; } #endif - h->cerrno = CSYSERR; - return -1; + return cont_connect(h); } h->event = CS_CONNECT; h->state = CS_ST_CONNECTING; @@ -1144,8 +1177,7 @@ int tcpip_put(COMSTACK h, char *buf, int size) h->io_pending = CS_WANT_WRITE; return 1; } - h->cerrno = CSYSERR; - return -1; + return cont_connect(h); } state->written += res; TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n",