112 lines
2 KiB
C++
112 lines
2 KiB
C++
|
#include "stream_peer_ssl.h"
|
||
|
|
||
|
|
||
|
int StreamPeerSSL::bio_create( BIO *b ) {
|
||
|
b->init = 1;
|
||
|
b->num = 0;
|
||
|
b->ptr = NULL;
|
||
|
b->flags = 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int StreamPeerSSL::bio_destroy( BIO *b ) {
|
||
|
|
||
|
if ( b == NULL ) return 0;
|
||
|
b->ptr = NULL; /* sb_tls_remove() will free it */
|
||
|
b->init = 0;
|
||
|
b->flags = 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int StreamPeerSSL::bio_read( BIO *b, char *buf, int len ) {
|
||
|
|
||
|
if ( buf == NULL || len <= 0 ) return 0;
|
||
|
|
||
|
StreamPeerSSL * sp = (StreamPeerSSL*)b->ptr;
|
||
|
|
||
|
if (sp->base.is_null())
|
||
|
return 0;
|
||
|
|
||
|
|
||
|
|
||
|
BIO_clear_retry_flags( b );
|
||
|
|
||
|
Error err;
|
||
|
int ret=0;
|
||
|
if (sp->block) {
|
||
|
err = sp->base->get_data((const uint8_t*)buf,len);
|
||
|
if (err==OK)
|
||
|
ret=len;
|
||
|
} else {
|
||
|
|
||
|
err = sp->base->get_partial_data((const uint8_t*)buf,len,ret);
|
||
|
if (err==OK && ret!=len) {
|
||
|
BIO_set_retry_write( b );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int StreamPeerSSL::bio_write( BIO *b, const char *buf, int len ) {
|
||
|
|
||
|
if ( buf == NULL || len <= 0 ) return 0;
|
||
|
|
||
|
StreamPeerSSL * sp = (StreamPeerSSL*)b->ptr;
|
||
|
|
||
|
if (sp->base.is_null())
|
||
|
return 0;
|
||
|
|
||
|
BIO_clear_retry_flags( b );
|
||
|
|
||
|
Error err;
|
||
|
int wrote=0;
|
||
|
if (sp->block) {
|
||
|
err = sp->base->put_data((const uint8_t*)buf,len);
|
||
|
if (err==OK)
|
||
|
wrote=len;
|
||
|
} else {
|
||
|
|
||
|
err = sp->base->put_partial_data((const uint8_t*)buf,len,wrote);
|
||
|
if (err==OK && wrote!=len) {
|
||
|
BIO_set_retry_write( b );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return wrote;
|
||
|
}
|
||
|
|
||
|
long StreamPeerSSL::bio_ctrl( BIO *b, int cmd, long num, void *ptr ) {
|
||
|
if ( cmd == BIO_CTRL_FLUSH ) {
|
||
|
/* The OpenSSL library needs this */
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int StreamPeerSSL::bio_gets( BIO *b, char *buf, int len ) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
int StreamPeerSSL::bio_puts( BIO *b, const char *str ) {
|
||
|
return StreamPeerSSL::bio_write( b, str, strlen( str ) );
|
||
|
}
|
||
|
|
||
|
BIO_METHOD StreamPeerSSL::bio_methods =
|
||
|
{
|
||
|
( 100 | 0x400 ), /* it's a source/sink BIO */
|
||
|
"sockbuf glue",
|
||
|
StreamPeerSSL::bio_write,
|
||
|
StreamPeerSSL::bio_read,
|
||
|
StreamPeerSSL::bio_puts,
|
||
|
StreamPeerSSL::bio_gets,
|
||
|
StreamPeerSSL::bio_ctrl,
|
||
|
StreamPeerSSL::bio_create,
|
||
|
StreamPeerSSL::bio_destroy
|
||
|
};
|
||
|
|
||
|
StreamPeerSSL::StreamPeerSSL() {
|
||
|
}
|