diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-03-13 22:57:24 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2014-03-13 22:57:24 -0300 |
commit | 31ce3c5fd0300aac1e86bced1efc5f9ec94bdb6b (patch) | |
tree | b6d3a290333c72940b49ed4c930ff6858a59515e /drivers/openssl | |
parent | a65edb4caabec21654c56552e11aacf0fd9291de (diff) |
-fix bug in cache for atlas import/export
-fix some menus
-fixed bug in out transition curves
-detect and remove file:/// in collada
-remove multiscript for now
-remove dependencies on mouse in OS, moved to Input
-avoid fscache from screwing up (fix might make it slower, but it works)
-funcref was missing, it's there now
Diffstat (limited to 'drivers/openssl')
-rw-r--r-- | drivers/openssl/stream_peer_ssl.cpp | 111 | ||||
-rw-r--r-- | drivers/openssl/stream_peer_ssl.h | 26 |
2 files changed, 137 insertions, 0 deletions
diff --git a/drivers/openssl/stream_peer_ssl.cpp b/drivers/openssl/stream_peer_ssl.cpp new file mode 100644 index 0000000000..aaedd7dde9 --- /dev/null +++ b/drivers/openssl/stream_peer_ssl.cpp @@ -0,0 +1,111 @@ +#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() { +} diff --git a/drivers/openssl/stream_peer_ssl.h b/drivers/openssl/stream_peer_ssl.h new file mode 100644 index 0000000000..a126f6122c --- /dev/null +++ b/drivers/openssl/stream_peer_ssl.h @@ -0,0 +1,26 @@ +#ifndef STREAM_PEER_SSL_H +#define STREAM_PEER_SSL_H + +#include "io/stream_peer.h" + +class StreamPeerSSL : public StreamPeer { + + OBJ_TYPE(StreamPeerSSL,StreamPeer); + + Ref<StreamPeer> base; + bool block; + static BIO_METHOD bio_methods; + + static int bio_create( BIO *b ); + static int bio_destroy( BIO *b ); + static int bio_read( BIO *b, char *buf, int len ); + static int bio_write( BIO *b, const char *buf, int len ); + static long bio_ctrl( BIO *b, int cmd, long num, void *ptr ); + static int bio_gets( BIO *b, char *buf, int len ); + static int bio_puts( BIO *b, const char *str ); + +public: + StreamPeerSSL(); +}; + +#endif // STREAM_PEER_SSL_H |