PR: 2050
[openssl.git] / crypto / bio / bss_dgram.c
index b2b4a4a993d6d121e9c0d63bba2b14b827e26a1e..5cd6342598146d27264cadf8d019066e7e0691f1 100644 (file)
@@ -290,11 +290,11 @@ static int dgram_read(BIO *b, char *out, int outl)
                ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen);
                dgram_reset_rcv_timeout(b);
 
-               if ( ! data->connected  && ret > 0)
-                       BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer);
+               if ( ! data->connected  && ret >= 0)
+                       BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &peer);
 
                BIO_clear_retry_flags(b);
-               if (ret <= 0)
+               if (ret < 0)
                        {
                        if (BIO_dgram_should_retry(ret))
                                {
@@ -324,7 +324,7 @@ static int dgram_write(BIO *b, const char *in, int inl)
        BIO_clear_retry_flags(b);
        if (ret <= 0)
                {
-               if (BIO_sock_should_retry(ret))
+               if (BIO_dgram_should_retry(ret))
                        {
                        BIO_set_retry_write(b);  
                        data->_errno = get_last_socket_error();
@@ -518,6 +518,12 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
                        memset(&(data->peer), 0x00, sizeof(struct sockaddr));
                        }
                break;
+    case BIO_CTRL_DGRAM_GET_PEER:
+        to = (struct sockaddr *) ptr;
+
+        memcpy(to, &(data->peer), sizeof(struct sockaddr));
+               ret = sizeof(struct sockaddr);
+        break;
     case BIO_CTRL_DGRAM_SET_PEER:
         to = (struct sockaddr *) ptr;
 
@@ -688,10 +694,6 @@ int BIO_dgram_non_fatal_error(int err)
 # endif
 #endif
 
-#if defined(ENOTCONN)
-       case ENOTCONN:
-#endif
-
 #ifdef EINTR
        case EINTR:
 #endif
@@ -714,11 +716,6 @@ int BIO_dgram_non_fatal_error(int err)
        case EALREADY:
 #endif
 
-/* DF bit set, and packet larger than MTU */
-#ifdef EMSGSIZE
-       case EMSGSIZE:
-#endif
-
                return(1);
                /* break; */
        default: