=pod

=head1 NAME

BIO_find_type, BIO_next - BIO chain traversal

=head1 SYNOPSIS

 #include <openssl/bio.h>

 BIO *	BIO_find_type(BIO *b,int bio_type);
 BIO *	BIO_next(BIO *b);

 #define BIO_method_type(b)		((b)->method->type)

 #define BIO_TYPE_NONE		0
 #define BIO_TYPE_MEM		(1|0x0400)
 #define BIO_TYPE_FILE		(2|0x0400)

 #define BIO_TYPE_FD		(4|0x0400|0x0100)
 #define BIO_TYPE_SOCKET		(5|0x0400|0x0100)
 #define BIO_TYPE_NULL		(6|0x0400)
 #define BIO_TYPE_SSL		(7|0x0200)
 #define BIO_TYPE_MD		(8|0x0200)
 #define BIO_TYPE_BUFFER		(9|0x0200)
 #define BIO_TYPE_CIPHER		(10|0x0200)
 #define BIO_TYPE_BASE64		(11|0x0200)
 #define BIO_TYPE_CONNECT	(12|0x0400|0x0100)
 #define BIO_TYPE_ACCEPT		(13|0x0400|0x0100)
 #define BIO_TYPE_PROXY_CLIENT	(14|0x0200)
 #define BIO_TYPE_PROXY_SERVER	(15|0x0200)
 #define BIO_TYPE_NBIO_TEST	(16|0x0200)
 #define BIO_TYPE_NULL_FILTER	(17|0x0200)
 #define BIO_TYPE_BER		(18|0x0200)
 #define BIO_TYPE_BIO		(19|0x0400)

 #define BIO_TYPE_DESCRIPTOR	0x0100
 #define BIO_TYPE_FILTER		0x0200
 #define BIO_TYPE_SOURCE_SINK	0x0400

=head1 DESCRIPTION

The BIO_find_type() searches for a BIO of a given type in a chain, starting
at BIO B<b>. If B<type> is a specific type (such as BIO_TYPE_MEM) then a search
is made for a BIO of that type. If B<type> is a general type (such as
B<BIO_TYPE_SOURCE_SINK>) then the next matching BIO of the given general type is
searched for. BIO_find_type() returns the next matching BIO or NULL if none is
found.

Note: not all the B<BIO_TYPE_*> types above have corresponding BIO implementations.

BIO_next() returns the next BIO in a chain. It can be used to traverse all BIOs
in a chain or used in conjunction with BIO_find_type() to find all BIOs of a
certain type.

BIO_method_type() returns the type of a BIO.

=head1 RETURN VALUES

BIO_find_type() returns a matching BIO or NULL for no match.

BIO_next() returns the next BIO in a chain.

BIO_method_type() returns the type of the BIO B<b>.

=head1 NOTES

BIO_next() was added to OpenSSL 0.9.6 to provide a 'clean' way to traverse a BIO
chain or find multiple matches using BIO_find_type(). Previous versions had to
use:

 next = bio->next_bio;

=head1 BUGS

BIO_find_type() in OpenSSL 0.9.5a and earlier could not be safely passed a
NULL pointer for the B<b> argument.

=head1 EXAMPLE

Traverse a chain looking for digest BIOs:

 BIO *btmp;
 btmp = in_bio;	/* in_bio is chain to search through */

 do {
 	btmp = BIO_find_type(btmp, BIO_TYPE_MD);
	if(btmp == NULL) break;	/* Not found */
	/* btmp is a digest BIO, do something with it ...*/
   	...

	btmp = BIO_next(btmp);
 } while(btmp);


=head1 SEE ALSO

TBA
