| 66 #include "pool.h" |
66 #include "pool.h" |
| 67 #include "../daemon/netsite.h" |
67 #include "../daemon/netsite.h" |
| 68 #include "../daemon/event.h" |
68 #include "../daemon/event.h" |
| 69 #include <cx/printf.h> |
69 #include <cx/printf.h> |
| 70 |
70 |
| |
71 #include <openssl/err.h> |
| |
72 |
| 71 IOStream native_io_funcs = { |
73 IOStream native_io_funcs = { |
| 72 (io_write_f)net_sys_write, |
74 (io_write_f)net_sys_write, |
| 73 (io_writev_f)net_sys_writev, |
75 (io_writev_f)net_sys_writev, |
| 74 (io_read_f)net_sys_read, |
76 (io_read_f)net_sys_read, |
| 75 (io_sendfile_f)NET_SYS_SENDFILE, |
77 (io_sendfile_f)NET_SYS_SENDFILE, |
| 862 pool_free(ssl->pool, st); |
865 pool_free(ssl->pool, st); |
| 863 } |
866 } |
| 864 |
867 |
| 865 ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes) { |
868 ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes) { |
| 866 int ret = SSL_write(st->ssl, buf, nbytes); |
869 int ret = SSL_write(st->ssl, buf, nbytes); |
| |
870 log_ereport(LOG_INFORM, "SSL_write(%p, %d) -> %d", buf, (int)nbytes, ret); |
| 867 if(ret <= 0) { |
871 if(ret <= 0) { |
| 868 st->error = SSL_get_error(st->ssl, ret); |
872 st->error = SSL_get_error(st->ssl, ret); |
| 869 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
873 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
| 870 st->st.io_errno = EWOULDBLOCK; |
874 st->st.io_errno = EWOULDBLOCK; |
| 871 } else { |
875 } else { |
| |
876 log_ereport(LOG_FAILURE, "net_ssl_write SSL error: %d , nbytes: %d, ret: %d", st->error, (int)nbytes, ret); |
| |
877 unsigned long e; |
| |
878 while ((e = ERR_get_error())) { |
| |
879 fprintf(stderr, "%s\n", ERR_error_string(e, NULL)); |
| |
880 } |
| 872 st->st.io_errno = -1; |
881 st->st.io_errno = -1; |
| 873 } |
882 } |
| 874 ret = -1; |
883 ret = -1; |
| 875 } |
884 } |
| 876 return ret; |
885 return ret; |
| 877 } |
886 } |
| 878 |
887 |
| 879 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
888 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
| 880 ssize_t r = 0; |
889 ssize_t r = 0; |
| 881 for(int i=0;i<iovcnt;i++) { |
890 for(int i=0;i<iovcnt;i++) { |
| |
891 int ml = iovec[i].iov_len > 10 ? 10 : iovec[i].iov_len; |
| 882 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
892 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
| |
893 log_ereport(LOG_INFORM, "SSL_write(%p {%.*s}, %d) -> %d", iovec[i].iov_base, ml, iovec[i].iov_base, (int)iovec[i].iov_len, ret); |
| 883 if(ret <= 0) { |
894 if(ret <= 0) { |
| 884 if(r == 0) { |
895 if(r == 0) { |
| 885 st->error = SSL_get_error(st->ssl, ret); |
896 st->error = SSL_get_error(st->ssl, ret); |
| |
897 log_ereport(LOG_FAILURE, "net_ssl_write SSL error: %d , iov_len: %d, ret: %d", st->error, (int)iovec[i].iov_len, ret); |
| 886 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
898 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
| 887 st->st.io_errno = EWOULDBLOCK; |
899 st->st.io_errno = EWOULDBLOCK; |
| 888 } else { |
900 } else { |
| 889 st->st.io_errno = -1; |
901 st->st.io_errno = -1; |
| 890 } |
902 } |