Updates from stable branch.

This commit is contained in:
Dr. Stephen Henson 2008-09-14 19:35:53 +00:00
parent e70e417baf
commit 9fce443775
2 changed files with 64 additions and 4 deletions

View file

@ -82,7 +82,7 @@ static int dgram_new(BIO *h);
static int dgram_free(BIO *data); static int dgram_free(BIO *data);
static int dgram_clear(BIO *bio); 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= static BIO_METHOD methods_dgramp=
{ {
@ -345,30 +345,90 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
memcpy(&(data->peer), to, sizeof(struct sockaddr)); memcpy(&(data->peer), to, sizeof(struct sockaddr));
break; break;
#if defined(SO_RCVTIMEO)
case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: 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_RCVTIME0,
(void*)&timeout, sizeof(timeout)) < 0)
{ perror("setsockopt"); ret = -1; }
}
#else
if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
sizeof(struct timeval)) < 0) sizeof(struct timeval)) < 0)
{ perror("setsockopt"); ret = -1; } { perror("setsockopt"); ret = -1; }
#endif
break; break;
case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 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_RCVTIME0,
(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, if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
ptr, (void *)&ret) < 0) ptr, (void *)&ret) < 0)
{ perror("getsockopt"); ret = -1; } { perror("getsockopt"); ret = -1; }
#endif
break; break;
#endif
#if defined(SO_SNDTIMEO)
case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: 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_SNDTIME0,
(void*)&timeout, sizeof(timeout)) < 0)
{ perror("setsockopt"); ret = -1; }
}
#else
if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
sizeof(struct timeval)) < 0) sizeof(struct timeval)) < 0)
{ perror("setsockopt"); ret = -1; } { perror("setsockopt"); ret = -1; }
#endif
break; break;
case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 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_SNDTIME0,
(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, if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
ptr, (void *)&ret) < 0) ptr, (void *)&ret) < 0)
{ perror("getsockopt"); ret = -1; } { perror("getsockopt"); ret = -1; }
#endif
break; break;
#endif
case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
/* fall-through */ /* fall-through */
case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
#ifdef OPENSSL_SYS_WINDOWS
if ( data->_errno == ETIMEDOUT)
#else
if ( data->_errno == EAGAIN) if ( data->_errno == EAGAIN)
#endif
{ {
ret = 1; ret = 1;
data->_errno = 0; data->_errno = 0;
@ -403,7 +463,7 @@ static int dgram_puts(BIO *bp, const char *str)
return(ret); return(ret);
} }
int BIO_dgram_should_retry(int i) static int BIO_dgram_should_retry(int i)
{ {
int err; int err;

View file

@ -1172,13 +1172,13 @@ int ssl3_send_server_hello(SSL *s)
*(d++)=SSL3_MT_SERVER_HELLO; *(d++)=SSL3_MT_SERVER_HELLO;
l2n3(l,d); l2n3(l,d);
s->state=SSL3_ST_SW_CLNT_HELLO_B; s->state=SSL3_ST_SW_SRVR_HELLO_B;
/* number of bytes to write */ /* number of bytes to write */
s->init_num=p-buf; s->init_num=p-buf;
s->init_off=0; s->init_off=0;
} }
/* SSL3_ST_SW_CLNT_HELLO_B */ /* SSL3_ST_SW_SRVR_HELLO_B */
return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
} }