summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/bss_dgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio/bss_dgram.c')
-rw-r--r--src/lib/libcrypto/bio/bss_dgram.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c
index ea2c3fff63..c3da6dc82f 100644
--- a/src/lib/libcrypto/bio/bss_dgram.c
+++ b/src/lib/libcrypto/bio/bss_dgram.c
@@ -82,7 +82,7 @@ static int dgram_new(BIO *h);
82static int dgram_free(BIO *data); 82static int dgram_free(BIO *data);
83static int dgram_clear(BIO *bio); 83static int dgram_clear(BIO *bio);
84 84
85int BIO_dgram_should_retry(int s); 85static int BIO_dgram_should_retry(int s);
86 86
87static BIO_METHOD methods_dgramp= 87static BIO_METHOD methods_dgramp=
88 { 88 {
@@ -345,30 +345,90 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
345 345
346 memcpy(&(data->peer), to, sizeof(struct sockaddr)); 346 memcpy(&(data->peer), to, sizeof(struct sockaddr));
347 break; 347 break;
348#if defined(SO_RCVTIMEO)
348 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: 349 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
350#ifdef OPENSSL_SYS_WINDOWS
351 {
352 struct timeval *tv = (struct timeval *)ptr;
353 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
354 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
355 (void*)&timeout, sizeof(timeout)) < 0)
356 { perror("setsockopt"); ret = -1; }
357 }
358#else
349 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, 359 if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
350 sizeof(struct timeval)) < 0) 360 sizeof(struct timeval)) < 0)
351 { perror("setsockopt"); ret = -1; } 361 { perror("setsockopt"); ret = -1; }
362#endif
352 break; 363 break;
353 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 364 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
365#ifdef OPENSSL_SYS_WINDOWS
366 {
367 int timeout, sz = sizeof(timeout);
368 struct timeval *tv = (struct timeval *)ptr;
369 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
370 (void*)&timeout, &sz) < 0)
371 { perror("getsockopt"); ret = -1; }
372 else
373 {
374 tv->tv_sec = timeout / 1000;
375 tv->tv_usec = (timeout % 1000) * 1000;
376 ret = sizeof(*tv);
377 }
378 }
379#else
354 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 380 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
355 ptr, (void *)&ret) < 0) 381 ptr, (void *)&ret) < 0)
356 { perror("getsockopt"); ret = -1; } 382 { perror("getsockopt"); ret = -1; }
383#endif
357 break; 384 break;
385#endif
386#if defined(SO_SNDTIMEO)
358 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: 387 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
388#ifdef OPENSSL_SYS_WINDOWS
389 {
390 struct timeval *tv = (struct timeval *)ptr;
391 int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
392 if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
393 (void*)&timeout, sizeof(timeout)) < 0)
394 { perror("setsockopt"); ret = -1; }
395 }
396#else
359 if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, 397 if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
360 sizeof(struct timeval)) < 0) 398 sizeof(struct timeval)) < 0)
361 { perror("setsockopt"); ret = -1; } 399 { perror("setsockopt"); ret = -1; }
400#endif
362 break; 401 break;
363 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 402 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
403#ifdef OPENSSL_SYS_WINDOWS
404 {
405 int timeout, sz = sizeof(timeout);
406 struct timeval *tv = (struct timeval *)ptr;
407 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
408 (void*)&timeout, &sz) < 0)
409 { perror("getsockopt"); ret = -1; }
410 else
411 {
412 tv->tv_sec = timeout / 1000;
413 tv->tv_usec = (timeout % 1000) * 1000;
414 ret = sizeof(*tv);
415 }
416 }
417#else
364 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 418 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
365 ptr, (void *)&ret) < 0) 419 ptr, (void *)&ret) < 0)
366 { perror("getsockopt"); ret = -1; } 420 { perror("getsockopt"); ret = -1; }
421#endif
367 break; 422 break;
423#endif
368 case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: 424 case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
369 /* fall-through */ 425 /* fall-through */
370 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: 426 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
427#ifdef OPENSSL_SYS_WINDOWS
428 if ( data->_errno == WSAETIMEDOUT)
429#else
371 if ( data->_errno == EAGAIN) 430 if ( data->_errno == EAGAIN)
431#endif
372 { 432 {
373 ret = 1; 433 ret = 1;
374 data->_errno = 0; 434 data->_errno = 0;
@@ -403,7 +463,7 @@ static int dgram_puts(BIO *bp, const char *str)
403 return(ret); 463 return(ret);
404 } 464 }
405 465
406int BIO_dgram_should_retry(int i) 466static int BIO_dgram_should_retry(int i)
407 { 467 {
408 int err; 468 int err;
409 469