mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
Use poll() in BIO_socket_wait() if available
Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/25055)
This commit is contained in:
parent
99548cd16e
commit
38e8392ba0
@ -430,15 +430,16 @@ int BIO_sock_info(int sock,
|
|||||||
*/
|
*/
|
||||||
int BIO_socket_wait(int fd, int for_read, time_t max_time)
|
int BIO_socket_wait(int fd, int for_read, time_t max_time)
|
||||||
{
|
{
|
||||||
|
# if defined(OPENSSL_SYS_WINDOWS) || !defined(POLLIN)
|
||||||
fd_set confds;
|
fd_set confds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
#ifdef _WIN32
|
# ifdef _WIN32
|
||||||
if ((SOCKET)fd == INVALID_SOCKET)
|
if ((SOCKET)fd == INVALID_SOCKET)
|
||||||
#else
|
# else
|
||||||
if (fd < 0 || fd >= FD_SETSIZE)
|
if (fd < 0 || fd >= FD_SETSIZE)
|
||||||
#endif
|
# endif
|
||||||
return -1;
|
return -1;
|
||||||
if (max_time == 0)
|
if (max_time == 0)
|
||||||
return 1;
|
return 1;
|
||||||
@ -453,5 +454,22 @@ int BIO_socket_wait(int fd, int for_read, time_t max_time)
|
|||||||
tv.tv_sec = (long)(max_time - now); /* might overflow */
|
tv.tv_sec = (long)(max_time - now); /* might overflow */
|
||||||
return select(fd + 1, for_read ? &confds : NULL,
|
return select(fd + 1, for_read ? &confds : NULL,
|
||||||
for_read ? NULL : &confds, NULL, &tv);
|
for_read ? NULL : &confds, NULL, &tv);
|
||||||
|
# else
|
||||||
|
struct pollfd confds;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -1;
|
||||||
|
if (max_time == 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
now = time(NULL);
|
||||||
|
if (max_time < now)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
confds.fd = fd;
|
||||||
|
confds.events = for_read ? POLLIN : POLLOUT;
|
||||||
|
return poll(&confds, 1, (int)(max_time - now) * 1000);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
#endif /* !defined(OPENSSL_NO_SOCK) */
|
#endif /* !defined(OPENSSL_NO_SOCK) */
|
||||||
|
@ -97,6 +97,7 @@ typedef size_t socklen_t; /* Currently appears to be missing on VMS */
|
|||||||
# include <in.h>
|
# include <in.h>
|
||||||
# include <inet.h>
|
# include <inet.h>
|
||||||
# else
|
# else
|
||||||
|
# include <poll.h>
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
# if !defined(NO_SYS_UN_H) && defined(AF_UNIX) && !defined(OPENSSL_NO_UNIX_SOCK)
|
# if !defined(NO_SYS_UN_H) && defined(AF_UNIX) && !defined(OPENSSL_NO_UNIX_SOCK)
|
||||||
# include <sys/un.h>
|
# include <sys/un.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user