=pod

=head1 NAME

BIO_set_callback, BIO_get_callback, BIO_set_callback_arg, BIO_get_callback_arg,
BIO_debug_callback - BIO callback functions

=head1 SYNOPSIS

 #include <openssl/bio.h>


 typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi,
                                 long argl, long ret);

 void BIO_set_callback(BIO *b, BIO_callack_fn cb);
 BIO_callack_fn BIO_get_callback(BIO *b);
 void BIO_set_callback_arg(BIO *b, char *arg);
 char *BIO_get_callback_arg(const BIO *b);

 long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi,
                         long argl, long ret);

=head1 DESCRIPTION

BIO_set_callback() and BIO_get_callback() set and retrieve the BIO callback,
they are both macros. The callback is called during most high level BIO
operations. It can be used for debugging purposes to trace operations on
a BIO or to modify its operation.

BIO_set_callback_arg() and BIO_get_callback_arg() are macros which can be
used to set and retrieve an argument for use in the callback.

BIO_debug_callback() is a standard debugging callback which prints
out information relating to each BIO operation. If the callback
argument is set it is interpreted as a BIO to send the information
to, otherwise stderr is used.

BIO_callback_fn() is the type of the callback function. The meaning of each
argument is described below:

=over

=item B<b>

The BIO the callback is attached to is passed in B<b>.

=item B<oper>

B<oper> is set to the operation being performed. For some operations
the callback is called twice, once before and once after the actual
operation, the latter case has B<oper> or'ed with BIO_CB_RETURN.

=item B<argp> B<argi> B<argl>

The meaning of the arguments B<argp>, B<argi> and B<argl> depends on
the value of B<oper>, that is the operation being performed.

=item B<ret>

B<ret> is the return value that would be returned to the
application if no callback were present. The actual value returned
is the return value of the callback itself. In the case of callbacks
called before the actual BIO operation 1 is placed in B<ret>, if
the return value is not positive it will be immediately returned to
the application and the BIO operation will not be performed.

=back

The callback should normally simply return B<ret> when it has
finished processing, unless it specifically wishes to modify the
value returned to the application.

=head1 CALLBACK OPERATIONS

In the notes below, B<callback> defers to the actual callback
function that is called.

=over 4

=item B<BIO_free(b)>

callback(b, BIO_CB_FREE, NULL, 0L, 0L, 1L) is called before the
free operation.

=item B<BIO_read(b, out, outl)>

callback(b, BIO_CB_READ, out, outl, 0L, 1L) is called before
the read and callback(b, BIO_CB_READ|BIO_CB_RETURN, out, outl, 0L, retvalue)
after.

=item B<BIO_write(b, in, inl)>

callback(b, BIO_CB_WRITE, in, inl, 0L, 1L) is called before
the write and callback(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl, 0L, retvalue)
after.

=item B<BIO_gets(b, out, outl)>

callback(b, BIO_CB_GETS, out, outl, 0L, 1L) is called before
the operation and callback(b, BIO_CB_GETS|BIO_CB_RETURN, out, outl, 0L, retvalue)
after.

=item B<BIO_puts(b, in)>

callback(b, BIO_CB_WRITE, in, 0, 0L, 1L) is called before
the operation and callback(b, BIO_CB_WRITE|BIO_CB_RETURN, in, 0, 0L, retvalue)
after.

=item B<BIO_ctrl(BIO *b, int cmd, long larg, void *parg)>

callback(b, BIO_CB_CTRL, parg, cmd, larg, 1L) is called before the call and
callback(b, BIO_CB_CTRL|BIO_CB_RETURN, parg, cmd, larg, ret) after.

=back

=head1 EXAMPLE

The BIO_debug_callback() function is a good example, its source is
in crypto/bio/bio_cb.c

=head1 COPYRIGHT

Copyright 2000-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
