=pod

=head1 NAME

BIO_set_data, BIO_get_data, BIO_set_init, BIO_get_init, BIO_set_shutdown,
BIO_get_shutdown - functions for managing BIO state information

=head1 SYNOPSIS

 #include <openssl/bio.h>

 void BIO_set_data(BIO *a, void *ptr);
 void *BIO_get_data(BIO *a);
 void BIO_set_init(BIO *a, int init);
 int BIO_get_init(BIO *a);
 void BIO_set_shutdown(BIO *a, int shut);
 int BIO_get_shutdown(BIO *a);

=head1 DESCRIPTION

These functions are mainly useful when implementing a custom BIO.

The BIO_set_data() function associates the custom data pointed to by B<ptr> with
the BIO. This data can subsequently be retrieved via a call to BIO_get_data().
This can be used by custom BIOs for storing implementation specific information.

The BIO_set_init() function sets the value of the BIO's "init" flag to indicate
whether initialisation has been completed for this BIO or not. A non-zero value
indicates that initialisation is complete, whilst zero indicates that it is not.
Often initialisation will complete during initial construction of the BIO. For
some BIOs however, initialisation may not complete until after additional steps
have occurred (for example through calling custom ctrls). The BIO_get_init()
function returns the value of the "init" flag.

The BIO_set_shutdown() and BIO_get_shutdown() functions set and get the state of
this BIO's shutdown (i.e. BIO_CLOSE) flag. If set then the underlying resource
is also closed when the BIO is freed.

=head1 RETURN VALUES

BIO_get_data() returns a pointer to the implementation specific custom data
associated with this BIO, or NULL if none has been set.

BIO_get_init() returns the state of the BIO's init flag.

BIO_get_shutdown() returns the stat of the BIO's shutdown (i.e. BIO_CLOSE) flag.

=head1 SEE ALSO

L<bio>, L<BIO_meth_new>

=head1 HISTORY

The functions described here were added in OpenSSL version 1.1.0.

=head1 COPYRIGHT

Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the OpenSSL license (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
