X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Ftcpip.c;h=ac0001e8ef222695fc47cea455051fd5f6450c39;hp=60e36068a29bfc9d8a9cf4ece0edff69fae10332;hb=fcc2b1bffbd6dd86fc8f95f1e2e6e8b2a94e731e;hpb=afb64586ca7d3f97d06d867dd4ca0fe2297a1bf5 diff --git a/src/tcpip.c b/src/tcpip.c index 60e3606..ac0001e 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -118,7 +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; + struct addrinfo *ai_connect; #else struct sockaddr_in addr; /* returned by cs_straddr */ #endif @@ -206,6 +206,7 @@ COMSTACK tcpip_type(int s, int flags, int protocol, void *vp) #if HAVE_GETADDRINFO sp->ai = 0; + sp->ai_connect = 0; #endif sp->altbuf = 0; sp->altsize = sp->altlen = 0; @@ -442,8 +443,7 @@ 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; + TRC(fprintf(stderr, "First socket fd=%d\n", s)); assert(ai); h->iofile = s; if (ai->ai_family == AF_INET6 && ipv6_only >= 0 && @@ -499,22 +499,29 @@ static int cont_connect(COMSTACK h) { #if HAVE_GETADDRINFO tcpip_state *sp = (tcpip_state *)h->cprivate; - struct addrinfo *ai = sp->ai_this; + struct addrinfo *ai = sp->ai_connect; while (ai && (ai = ai->ai_next)) { int s; s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s != -1) { +#if HAVE_GNUTLS_H + if (h->type == ssl_type && sp->session) + { + gnutls_bye(sp->session, GNUTLS_SHUT_WR); + gnutls_deinit(sp->session); + sp->session = 0; + } +#endif #ifdef WIN32 closesocket(h->iofile); #else close(h->iofile); #endif - fprintf(stderr, "Other socket call fd=%d\n", s); + TRC(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); } @@ -534,6 +541,7 @@ 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 @@ -547,6 +555,7 @@ int tcpip_connect(COMSTACK h, void *address) } #if HAVE_GETADDRINFO r = connect(h->iofile, ai->ai_addr, ai->ai_addrlen); + sp->ai_connect = ai; #else r = connect(h->iofile, (struct sockaddr *) add, sizeof(*add)); #endif @@ -563,7 +572,7 @@ int tcpip_connect(COMSTACK h, void *address) #else if (yaz_errno() == EINPROGRESS) { - fprintf(stderr, "Pending fd=%d\n", h->iofile); + TRC(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; @@ -615,7 +624,7 @@ int tcpip_rcvconnect(COMSTACK h) { if (ssl_check_error(h, sp, res)) return 1; - return -1; + return cont_connect(h); } } #endif @@ -646,10 +655,7 @@ static int tcpip_bind(COMSTACK h, void *address, int mode) if (h->type == ssl_type && !sp->session) { int res; - gnutls_global_init(); - tcpip_create_cred(h); - res = gnutls_certificate_set_x509_key_file(sp->cred_ptr->xcred, sp->cert_fname, sp->cert_fname,