=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>

 #define BIO_set_callback(b,cb)         ((b)->callback=(cb))
 #define BIO_get_callback(b)            ((b)->callback)
 #define BIO_set_callback_arg(b,arg)    ((b)->cb_arg=(char *)(arg))
 #define BIO_get_callback_arg(b)                ((b)->cb_arg)

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

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

=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 if is interpreted as a BIO to send the information
to, otherwise stderr is used.

callback() is the callback function itself. The meaning of each
argument is described below.

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

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.

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.

B<retvalue> 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 retvalue, if
the return value is not positive it will be immediately returned to
the application and the BIO operation will not be performed.

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

=head1 CALLBACK OPERATIONS

=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
