Prefer IPV6 addresses over IPV4 - should refix bug #2350.
[yaz-moved-to-github.git] / src / tcpip.c
index ffbcf44..416b707 100644 (file)
@@ -434,14 +434,31 @@ void *tcpip_straddr(COMSTACK h, const char *str)
     if (sp->ai && h->state == CS_ST_UNBND)
     {
         int s = -1;
-        struct addrinfo *ai = sp->ai;
-        for (; ai; ai = ai->ai_next)
+        struct addrinfo *ai;
+        /* try to make IPV6 socket first */
+        for (ai = sp->ai; ai; ai = ai->ai_next)
         {
-            s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
-            if (s != -1)
+            if (ai->ai_family == AF_INET6)
             {
-                sp->ai = ai;
-                break;
+                s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+                if (s != -1)
+                {
+                    sp->ai = ai;
+                    break;
+                }
+            }
+        }
+        if (s == -1)
+        {
+            /* 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)
@@ -610,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)
         {
@@ -965,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;