X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ftcpip.c;h=50c0622cde5973244f54bca7f7e46e7cda725b5d;hb=8f826c92f2bfb303409fbfc67cd8e34049caa125;hp=8df1e814671a767b7fe3a84cce65398921977e73;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7;p=yaz-moved-to-github.git diff --git a/src/tcpip.c b/src/tcpip.c index 8df1e81..50c0622 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,30 +419,11 @@ 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; const char *port = "210"; + struct addrinfo *ai; if (h->protocol == PROTO_HTTP) port = "80"; if (!tcpip_init()) @@ -453,21 +434,36 @@ 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; + /* 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) + 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) + break; + } + } if (s == -1) return 0; + assert(ai); h->iofile = s; if (!tcpip_set_blocking(h, h->flags)) return 0; } - return sp->ai; + return ai; } #else void *tcpip_straddr(COMSTACK h, const char *str) @@ -511,15 +507,12 @@ int tcpip_more(COMSTACK h) 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 int r; -#ifdef __sun__ - int recbuflen; - YAZ_SOCKLEN_T rbufsize = sizeof(recbuflen); -#endif TRC(fprintf(stderr, "tcpip_connect\n")); h->io_pending = 0; if (h->state != CS_ST_UNBND) @@ -528,41 +521,7 @@ int tcpip_connect(COMSTACK h, void *address) return -1; } #if HAVE_GETADDRINFO - if (sp->ai != (struct addrinfo *) address) - { - h->cerrno = CSOUTSTATE; - return -1; - } -#endif -#ifdef __sun__ - /* On Suns, you must set a bigger Receive Buffer BEFORE a call to connect - * This gives the connect a chance to negotiate with the other side - * (see 'man tcp') - */ - if (getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) < 0 ) - { - h->cerrno = CSYSERR; - return -1; - } - TRC(fprintf( stderr, "Current Size of TCP Receive Buffer= %d\n", - recbuflen )); - recbuflen *= 10; /* lets be optimistic */ - if (setsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, rbufsize ) < 0 ) - { - h->cerrno = CSYSERR; - return -1; - } - if (getsockopt(h->iofile, SOL_SOCKET, SO_RCVBUF, (void *)&recbuflen, &rbufsize ) ) - { - h->cerrno = CSYSERR; - return -1; - } - TRC(fprintf(stderr, "New Size of TCP Receive Buffer = %d\n", - recbuflen )); -#endif - -#if HAVE_GETADDRINFO - r = connect(h->iofile, sp->ai->ai_addr, sp->ai->ai_addrlen); + r = connect(h->iofile, ai->ai_addr, ai->ai_addrlen); freeaddrinfo(sp->ai); sp->ai = 0; #else @@ -626,8 +585,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) { @@ -700,7 +661,8 @@ static int tcpip_bind(COMSTACK h, void *address, int mode) { int r; tcpip_state *sp = (tcpip_state *)h->cprivate; -#if HAVE_GETADDRINFO +#if HAVE_GETADDRINFO + struct addrinfo *ai = (struct addrinfo *) address; #else struct sockaddr *addr = (struct sockaddr *)address; #endif @@ -710,14 +672,6 @@ static int tcpip_bind(COMSTACK h, void *address, int mode) int one = 1; #endif -#if HAVE_GETADDRINFO - if (sp->ai != (struct addrinfo *) address) - { - h->cerrno = CSOUTSTATE; - return -1; - } -#endif - #if HAVE_GNUTLS_H if (h->type == ssl_type && !sp->session) { @@ -794,7 +748,7 @@ static int tcpip_bind(COMSTACK h, void *address, int mode) #endif tcpip_setsockopt(h->iofile); #if HAVE_GETADDRINFO - r = bind(h->iofile, sp->ai->ai_addr, sp->ai->ai_addrlen); + r = bind(h->iofile, ai->ai_addr, ai->ai_addrlen); freeaddrinfo(sp->ai); sp->ai = 0; #else @@ -829,7 +783,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 +935,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 +1022,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 +1128,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 +1153,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 +1212,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 +1645,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