=pod

=head1 NAME

SSL_want, SSL_want_nothing, SSL_want_read, SSL_want_write, SSL_want_x509_lookup - obtain state information TLS/SSL I/O operation

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 int SSL_want(const SSL *ssl);
 int SSL_want_nothing(const SSL *ssl);
 int SSL_want_read(const SSL *ssl);
 int SSL_want_write(const SSL *ssl);
 int SSL_want_x509_lookup(const SSL *ssl);

=head1 DESCRIPTION

SSL_want() returns state information for the SSL object B<ssl>.

The other SSL_want_*() calls are shortcuts for the possible states returned
by SSL_want().

=head1 NOTES

SSL_want() examines the internal state information of the SSL object. Its
return values are similar to that of L<SSL_get_error(3)|SSL_get_error(3)>.
Unlike L<SSL_get_error(3)|SSL_get_error(3)>, which also evaluates the
error queue, the results are obtained by examining an internal state flag
only. The information must therefore only be used for normal operation under
non-blocking I/O. Error conditions are not handled and must be treated
using L<SSL_get_error(3)|SSL_get_error(3)>.

The result returned by SSL_want() should always be consistent with
the result of L<SSL_get_error(3)|SSL_get_error(3)>.

=head1 RETURN VALUES

The following return values can currently occur for SSL_want():

=over 4

=item SSL_NOTHING

There is no data to be written or to be read.

=item SSL_WRITING

There are data in the SSL buffer that must be written to the underlying
B<BIO> layer in order to complete the actual SSL_*() operation.
A call to L<SSL_get_error(3)|SSL_get_error(3)> should return
SSL_ERROR_WANT_WRITE.

=item SSL_READING

More data must be read from the underlying B<BIO> layer in order to
complete the actual SSL_*() operation.
A call to L<SSL_get_error(3)|SSL_get_error(3)> should return
SSL_ERROR_WANT_READ.

=item SSL_X509_LOOKUP

The operation did not complete because an application callback set by
SSL_CTX_set_client_cert_cb() has asked to be called again.
A call to L<SSL_get_error(3)|SSL_get_error(3)> should return
SSL_ERROR_WANT_X509_LOOKUP.

=back

SSL_want_nothing(), SSL_want_read(), SSL_want_write(), SSL_want_x509_lookup()
return 1, when the corresponding condition is true or 0 otherwise.

=head1 SEE ALSO

L<ssl(3)|ssl(3)>, L<err(3)|err(3)>, L<SSL_get_error(3)|SSL_get_error(3)>

=cut
