Winsock handles SO_RCVTIMEO in unique manner... [from HEAD].
PR: 1648
This commit is contained in:
		@@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user