Ignore generated ASM.
[openssl.git] / crypto / bio / bss_dgram.c
index fa6d27adc74547cc0baae4eaf9b9770c4e1ec087..c3da6dc82fa9e9750249b81b97f609ff8a39f04c 100644 (file)
@@ -64,8 +64,6 @@
 #define USE_SOCKETS
 #include "cryptlib.h"
 
-#include <sys/socket.h>
-
 #include <openssl/bio.h>
 
 #define IP_MTU      14 /* linux is lame */
@@ -84,7 +82,7 @@ static int dgram_new(BIO *h);
 static int dgram_free(BIO *data);
 static int dgram_clear(BIO *bio);
 
-int BIO_dgram_should_retry(int s);
+static int BIO_dgram_should_retry(int s);
 
 static BIO_METHOD methods_dgramp=
        {
@@ -174,13 +172,18 @@ static int dgram_read(BIO *b, char *out, int outl)
        bio_dgram_data *data = (bio_dgram_data *)b->ptr;
 
        struct sockaddr peer;
-       socklen_t peerlen = sizeof(peer);
+       int peerlen = sizeof(peer);
 
        if (out != NULL)
                {
                clear_socket_error();
                memset(&peer, 0x00, peerlen);
-               ret=recvfrom(b->num,out,outl,0,&peer,&peerlen);
+               /* Last arg in recvfrom is signed on some platforms and
+                * unsigned on others. It is of type socklen_t on some
+                * but this is not universal. Cast to (void *) to avoid
+                * compiler warnings.
+                */
+               ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen);
 
                if ( ! data->connected  && ret > 0)
                        BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer);
@@ -205,9 +208,13 @@ static int dgram_write(BIO *b, const char *in, int inl)
        clear_socket_error();
 
     if ( data->connected )
-        ret=send(b->num,in,inl,0);
+        ret=writesocket(b->num,in,inl);
     else
+#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
+        ret=sendto(b->num, (char *)in, inl, 0, &data->peer, sizeof(data->peer));
+#else
         ret=sendto(b->num, in, inl, 0, &data->peer, sizeof(data->peer));
+#endif
 
        BIO_clear_retry_flags(b);
        if (ret <= 0)
@@ -303,7 +310,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 #endif
        case BIO_CTRL_DGRAM_QUERY_MTU:
          sockopt_len = sizeof(sockopt_val);
-               if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, &sockopt_val,
+               if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
                        &sockopt_len)) < 0 || sockopt_val < 0)
                        { ret = 0; }
                else
@@ -338,30 +345,90 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 
         memcpy(&(data->peer), to, sizeof(struct sockaddr));
         break;
+#if defined(SO_RCVTIMEO)
        case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
+#ifdef OPENSSL_SYS_WINDOWS
+               {
+               struct timeval *tv = (struct timeval *)ptr;
+               int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
+               if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+                       (void*)&timeout, sizeof(timeout)) < 0)
+                       { perror("setsockopt"); ret = -1; }
+               }
+#else
                if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
                        sizeof(struct timeval)) < 0)
                        { perror("setsockopt"); ret = -1; }
+#endif
                break;
        case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
+#ifdef OPENSSL_SYS_WINDOWS
+               {
+               int timeout, sz = sizeof(timeout);
+               struct timeval *tv = (struct timeval *)ptr;
+               if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+                       (void*)&timeout, &sz) < 0)
+                       { perror("getsockopt"); ret = -1; }
+               else
+                       {
+                       tv->tv_sec = timeout / 1000;
+                       tv->tv_usec = (timeout % 1000) * 1000;
+                       ret = sizeof(*tv);
+                       }
+               }
+#else
                if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 
-                       ptr, (socklen_t *)&ret) < 0)
+                       ptr, (void *)&ret) < 0)
                        { perror("getsockopt"); ret = -1; }
+#endif
                break;
+#endif
+#if defined(SO_SNDTIMEO)
        case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
+#ifdef OPENSSL_SYS_WINDOWS
+               {
+               struct timeval *tv = (struct timeval *)ptr;
+               int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
+               if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
+                       (void*)&timeout, sizeof(timeout)) < 0)
+                       { perror("setsockopt"); ret = -1; }
+               }
+#else
                if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
                        sizeof(struct timeval)) < 0)
                        { perror("setsockopt"); ret = -1; }
+#endif
                break;
        case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
+#ifdef OPENSSL_SYS_WINDOWS
+               {
+               int timeout, sz = sizeof(timeout);
+               struct timeval *tv = (struct timeval *)ptr;
+               if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
+                       (void*)&timeout, &sz) < 0)
+                       { perror("getsockopt"); ret = -1; }
+               else
+                       {
+                       tv->tv_sec = timeout / 1000;
+                       tv->tv_usec = (timeout % 1000) * 1000;
+                       ret = sizeof(*tv);
+                       }
+               }
+#else
                if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 
-                       ptr, (socklen_t *)&ret) < 0)
+                       ptr, (void *)&ret) < 0)
                        { perror("getsockopt"); ret = -1; }
+#endif
                break;
+#endif
        case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
                /* fall-through */
        case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
+#ifdef OPENSSL_SYS_WINDOWS
+               if ( data->_errno == WSAETIMEDOUT)
+#else
                if ( data->_errno == EAGAIN)
+#endif
                        {
                        ret = 1;
                        data->_errno = 0;
@@ -369,6 +436,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
                else
                        ret = 0;
                break;
+#ifdef EMSGSIZE
        case BIO_CTRL_DGRAM_MTU_EXCEEDED:
                if ( data->_errno == EMSGSIZE)
                        {
@@ -378,6 +446,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
                else
                        ret = 0;
                break;
+#endif
        default:
                ret=0;
                break;
@@ -394,7 +463,7 @@ static int dgram_puts(BIO *bp, const char *str)
        return(ret);
        }
 
-int BIO_dgram_should_retry(int i)
+static int BIO_dgram_should_retry(int i)
        {
        int err;