=pod

=head1 NAME

BIO_socket_wait,
BIO_wait,
BIO_do_connect_retry
- BIO connection utility functions

=head1 SYNOPSIS

 #include <openssl/bio.h>

 #ifndef OPENSSL_NO_SOCK
 int BIO_socket_wait(int fd, int for_read, time_t max_time);
 #endif
 int BIO_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds);
 int BIO_do_connect_retry(BIO *bio, int timeout, int nap_milliseconds);

=head1 DESCRIPTION

BIO_socket_wait() waits on the socket B<fd> for reading if B<for_read> is not 0,
else for writing, at most until B<max_time>.
It succeeds immediately if B<max_time> == 0 (which means no timeout given).

BIO_wait() waits at most until B<max_time> on the given (typically socket-based)
B<bio>, for reading if B<bio> is supposed to read, else for writing.
It is used by BIO_do_connect_retry() and can be used together L<BIO_read(3)>.
It succeeds immediately if B<max_time> == 0 (which means no timeout given).
If sockets are not available it supports polling by succeeding after sleeping
at most the given B<nap_milliseconds> in order to avoid a tight busy loop.
Via B<nap_milliseconds> the caller determines the polling granularity.

BIO_do_connect_retry() connects via the given B<bio>.
It retries BIO_do_connect() as far as needed to reach a definite outcome,
i.e., connection succeeded, timeout has been reached, or an error occurred.
For non-blocking and potentially even non-socket BIOs it polls
every B<nap_milliseconds> and sleeps in between using BIO_wait().
If B<nap_milliseconds> is < 0 then a default value of 100 ms is used.
If the B<timeout> parameter is > 0 this indicates the maximum number of seconds
to wait until the connection is established or a definite error occurred.
A value of 0 enables waiting indefinitely (i.e, no timeout),
while a value < 0 means that BIO_do_connect() is tried only once.
The function may, directly or indirectly, invoke ERR_clear_error().

=head1 RETURN VALUES

BIO_socket_wait(), BIO_wait(), and BIO_do_connect_retry()
return -1 on error, 0 on timeout, and 1 on success.

=head1 SEE ALSO

L<BIO_do_connect(3)>, L<BIO_read(3)>

=head1 HISTORY

BIO_socket_wait(), BIO_wait(), and BIO_do_connect_retry()
were added in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
