--- a/src/server/util/io.c Wed Oct 28 17:59:34 2015 +0100 +++ b/src/server/util/io.c Sat Oct 31 15:01:07 2015 +0100 @@ -61,6 +61,15 @@ (io_finish_f)net_stream_finish }; +IOStream ssl_io_funcs = { + (io_write_f)net_ssl_write, + (io_writev_f)net_ssl_writev, + (io_read_f)net_ssl_read, + NULL, + (io_close_f)net_ssl_close, + (io_finish_f)net_ssl_finish +}; + IOStream* stream_new_from_fd(pool_handle_t *pool, int fd) { SystemIOStream *st = pool_malloc(pool, sizeof(SystemIOStream)); @@ -194,6 +203,44 @@ } +/* ssl stream */ +IOStream* net_ssl_stream(pool_handle_t *pool, SSL *ssl) { + SSLStream *st = pool_malloc(pool, sizeof(SSLStream)); + st->st = ssl_io_funcs; + st->ssl = ssl; + return (IOStream*)st; +} + +ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes) { + return SSL_write(st->ssl, buf, nbytes); +} + +ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { + ssize_t r = 0; + for(int i=0;i<iovcnt;i++) { + int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); + if(ret <= 0) { + return 0; + } + r += ret; + } + return r; +} + +ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { + return SSL_read(st->ssl, buf, nbytes); +} + +void net_ssl_close(SSLStream *st) { + SSL_shutdown(st->ssl); + close(SSL_get_fd(st->ssl)); +} + +void net_ssl_finish(SSLStream *st) { + +} + + ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) { ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes); if(r == 0) {