src/server/util/io.c

changeset 106
b122f34ddc80
parent 104
a8acbb12f27c
child 110
43a746e905f6
child 111
c93be34fde76
--- 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) {

mercurial