Updates from stable branch.
This commit is contained in:
parent
e70e417baf
commit
9fce443775
2 changed files with 64 additions and 4 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue