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=-c Merge branch 'master' into yaz-743 --- afb64586ca7d3f97d06d867dd4ca0fe2297a1bf5 diff --combined src/tcpip.c index 0fde196,3c448dd..60e3606 --- a/src/tcpip.c +++ b/src/tcpip.c @@@ -60,7 -60,6 +60,6 @@@ #if HAVE_GNUTLS_H #include #include - #define ENABLE_SSL 1 #endif #include @@@ -81,7 -80,7 +80,7 @@@ static int tcpip_listen(COMSTACK h, cha void *cd); static int tcpip_set_blocking(COMSTACK p, int blocking); - #if ENABLE_SSL + #if HAVE_GNUTLS_H static int ssl_get(COMSTACK h, char **buf, int *bufsize); static int ssl_put(COMSTACK h, char *buf, int size); #endif @@@ -119,7 -118,6 +118,7 @@@ typedef struct tcpip_stat 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 @@@ -256,9 -254,7 +255,7 @@@ static void tcpip_create_cred(COMSTACK COMSTACK ssl_type(int s, int flags, int protocol, void *vp) { - #if !ENABLE_SSL - return 0; - #else + #if HAVE_GNUTLS_H tcpip_state *sp; COMSTACK p; @@@ -270,18 -266,17 +267,17 @@@ p->type = ssl_type; sp = (tcpip_state *) p->cprivate; - #if HAVE_GNUTLS_H sp->session = (gnutls_session_t) vp; - #endif /* note: we don't handle already opened socket in SSL mode - yet */ return p; + #else + return 0; #endif } - #if ENABLE_SSL + #if HAVE_GNUTLS_H static int ssl_check_error(COMSTACK h, tcpip_state *sp, int res) { - #if HAVE_GNUTLS_H TRC(fprintf(stderr, "ssl_check_error error=%d fatal=%d msg=%s\n", res, gnutls_error_is_fatal(res), @@@ -293,7 -288,6 +289,6 @@@ h->io_pending = dir ? CS_WANT_WRITE : CS_WANT_READ; return 1; } - #endif h->cerrno = CSERRORSSL; return 0; } @@@ -424,16 -418,13 +419,16 @@@ void *tcpip_straddr(COMSTACK h, const c 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) @@@ -447,8 -438,6 +442,8 @@@ } 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 && @@@ -500,36 -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 @@@ -539,6 -498,7 +534,6 @@@ int tcpip_connect(COMSTACK h, void *add { #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 @@@ -552,6 -512,8 +547,6 @@@ } #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 @@@ -568,14 -530,14 +563,14 @@@ #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; @@@ -588,7 -550,7 +583,7 @@@ */ int tcpip_rcvconnect(COMSTACK h) { - #if ENABLE_SSL + #if HAVE_GNUTLS_H tcpip_state *sp = (tcpip_state *)h->cprivate; #endif TRC(fprintf(stderr, "tcpip_rcvconnect\n")); @@@ -661,6 -623,7 +656,7 @@@ static int tcpip_bind(COMSTACK h, void GNUTLS_X509_FMT_PEM); if (res != GNUTLS_E_SUCCESS) { + fprintf(stderr, "Error 1\n"); h->cerrno = CSERRORSSL; return -1; } @@@ -1047,7 -1010,7 +1043,7 @@@ int tcpip_get(COMSTACK h, char **buf, i } - #if ENABLE_SSL + #if HAVE_GNUTLS_H /* * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer, * 0=connection closed. @@@ -1084,7 -1047,6 +1080,6 @@@ int ssl_get(COMSTACK h, char **buf, in else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK) if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2))) return -1; - #if HAVE_GNUTLS_H res = gnutls_record_recv(sp->session, *buf + hasread, CS_TCPIP_BUFCHUNK); if (res == 0) @@@ -1098,16 -1060,6 +1093,6 @@@ break; return -1; } - #else - res = SSL_read(sp->ssl, *buf + hasread, CS_TCPIP_BUFCHUNK); - TRC(fprintf(stderr, " SSL_read res=%d, hasread=%d\n", res, hasread)); - if (res <= 0) - { - if (ssl_check_error(h, sp, res)) - break; - return -1; - } - #endif hasread += res; } TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n", @@@ -1192,7 -1144,8 +1177,7 @@@ int tcpip_put(COMSTACK h, char *buf, in 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", @@@ -1204,7 -1157,7 +1189,7 @@@ } - #if ENABLE_SSL + #if HAVE_GNUTLS_H /* * Returns 1, 0 or -1 * In nonblocking mode, you must call again with same buffer while @@@ -1230,7 -1183,6 +1215,6 @@@ int ssl_put(COMSTACK h, char *buf, int } while (state->towrite > state->written) { - #if HAVE_GNUTLS_H res = gnutls_record_send(state->session, buf + state->written, size - state->written); if (res <= 0) @@@ -1239,16 -1191,6 +1223,6 @@@ return 1; return -1; } - #else - res = SSL_write(state->ssl, buf + state->written, - size - state->written); - if (res <= 0) - { - if (ssl_check_error(h, state, res)) - return 1; - return -1; - } - #endif state->written += res; TRC(fprintf(stderr, " Wrote %d, written=%d, nbytes=%d\n", res, state->written, size)); @@@ -1513,7 -1455,7 +1487,7 @@@ void *cs_get_ssl(COMSTACK cs int cs_set_ssl_ctx(COMSTACK cs, void *ctx) { - #if ENABLE_SSL + #if HAVE_GNUTLS_H if (cs && cs->type == ssl_type) { /* doesn't do anything for GNUTLS */ @@@ -1525,7 -1467,7 +1499,7 @@@ int cs_set_ssl_certificate_file(COMSTACK cs, const char *fname) { - #if ENABLE_SSL + #if HAVE_GNUTLS_H if (cs && cs->type == ssl_type) { struct tcpip_state *sp = (struct tcpip_state *) cs->cprivate;