X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ftcpip.c;h=416b707cb6b529375d782297174b7b83199768eb;hb=50910e85f05204a853e7e6975b1e3ef0adf1dbe6;hp=8df1e814671a767b7fe3a84cce65398921977e73;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7;p=yaz-moved-to-github.git diff --git a/src/tcpip.c b/src/tcpip.c index 8df1e81..416b707 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -68,7 +68,7 @@ #include #include -#include +#include static int tcpip_close(COMSTACK h); static int tcpip_put(COMSTACK h, char *buf, int size); @@ -419,26 +419,6 @@ int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add, } #if HAVE_GETADDRINFO -/** \brief Creates socket using particular address family (AF_) - \param ai getaddrinfo result - \param mask family mask - \returns socket or -1 if none could be created - -*/ -static int create_socket_family(struct addrinfo *ai, unsigned mask) -{ - for (; ai; ai = ai->ai_next) - { - if ((ai->ai_family & mask) == mask) - { - int s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (s != -1) - return s; - } - } - return -1; -} - void *tcpip_straddr(COMSTACK h, const char *str) { tcpip_state *sp = (tcpip_state *)h->cprivate; @@ -453,13 +433,34 @@ void *tcpip_straddr(COMSTACK h, const char *str) sp->ai = tcpip_getaddrinfo(str, port); if (sp->ai && h->state == CS_ST_UNBND) { - /* The getaddrinfo call may return multiple addresses when passive - flags are used (AI_PASSIVE). This function picks the IPV6 if a - socket can be created for it. Otherwise IPV4 is used. - See also bug #2350 */ - int s = create_socket_family(sp->ai, AF_INET6); + int s = -1; + struct addrinfo *ai; + /* try to make IPV6 socket first */ + for (ai = sp->ai; ai; ai = ai->ai_next) + { + if (ai->ai_family == AF_INET6) + { + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (s != -1) + { + sp->ai = ai; + break; + } + } + } if (s == -1) - s = create_socket_family(sp->ai, AF_INET); + { + /* no IPV6 could be made.. Try them all */ + for (ai = sp->ai; ai; ai = ai->ai_next) + { + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (s != -1) + { + sp->ai = ai; + break; + } + } + } if (s == -1) return 0; h->iofile = s; @@ -626,8 +627,10 @@ int tcpip_rcvconnect(COMSTACK h) gnutls_credentials_set (sp->session, GNUTLS_CRD_CERTIFICATE, sp->cred_ptr->xcred); - gnutls_transport_set_ptr(sp->session, (gnutls_transport_ptr_t) h->iofile); - + /* cast to intermediate size_t to avoid GCC warning. */ + gnutls_transport_set_ptr(sp->session, + (gnutls_transport_ptr_t) + (size_t) h->iofile); res = gnutls_handshake(sp->session); if (res < 0) { @@ -829,7 +832,11 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, h->cerrno = CSOUTSTATE; return -1; } +#ifdef WIN32 + h->newfd = accept(h->iofile, 0, 0); +#else h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len); +#endif if (h->newfd < 0) { if ( @@ -977,8 +984,10 @@ COMSTACK tcpip_accept(COMSTACK h) xfree(state); return 0; } + /* cast to intermediate size_t to avoid GCC warning. */ gnutls_transport_set_ptr(state->session, - (gnutls_transport_ptr_t) cnew->iofile); + (gnutls_transport_ptr_t) + (size_t) cnew->iofile); } #elif HAVE_OPENSSL_SSL_H state->ctx = st->ctx; @@ -1062,8 +1071,8 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) TRC(fprintf(stderr, "tcpip_get: bufsize=%d\n", *bufsize)); if (sp->altlen) /* switch buffers */ { - TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen, - (unsigned) sp->altbuf)); + TRC(fprintf(stderr, " %d bytes in altbuf (%p)\n", sp->altlen, + sp->altbuf)); tmpc = *buf; tmpi = *bufsize; *buf = sp->altbuf; @@ -1168,8 +1177,8 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) h->cerrno = CSYSERR; return -1; } - TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove, - (unsigned) sp->altbuf)); + TRC(fprintf(stderr, " Moving %d bytes to altbuf(%p)\n", tomove, + sp->altbuf)); memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove); } if (berlen < CS_TCPIP_BUFCHUNK - 1) @@ -1193,8 +1202,8 @@ int ssl_get(COMSTACK h, char **buf, int *bufsize) TRC(fprintf(stderr, "ssl_get: bufsize=%d\n", *bufsize)); if (sp->altlen) /* switch buffers */ { - TRC(fprintf(stderr, " %d bytes in altbuf (0x%x)\n", sp->altlen, - (unsigned) sp->altbuf)); + TRC(fprintf(stderr, " %d bytes in altbuf (%p)\n", sp->altlen, + sp->altbuf)); tmpc = *buf; tmpi = *bufsize; *buf = sp->altbuf; @@ -1252,8 +1261,8 @@ int ssl_get(COMSTACK h, char **buf, int *bufsize) } else if (sp->altsize < req) if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req))) return -1; - TRC(fprintf(stderr, " Moving %d bytes to altbuf(0x%x)\n", tomove, - (unsigned) sp->altbuf)); + TRC(fprintf(stderr, " Moving %d bytes to altbuf(%p)\n", tomove, + sp->altbuf)); memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove); } if (berlen < CS_TCPIP_BUFCHUNK - 1) @@ -1685,6 +1694,7 @@ static int tcpip_get_connect(COMSTACK h, char **buf, int *bufsize) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab