src/server/util/io.c

changeset 734
a5f3e1e5e744
parent 719
c4c2b8e8ddc5
child 735
902b417ab6d2
equal deleted inserted replaced
733:66bde992ebd0 734:a5f3e1e5e744
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,
488 iovec_len++; 490 iovec_len++;
489 } 491 }
490 492
491 ssize_t wv = fd->writev(fd, io, iovec_len); 493 ssize_t wv = fd->writev(fd, io, iovec_len);
492 if(wv <= 0) { 494 if(wv <= 0) {
495 log_ereport(LOG_INFORM, "net_http_write chunk writev ret %d", (int)wv);
493 st->st.io_errno = net_errno(st->fd); 496 st->st.io_errno = net_errno(st->fd);
494 return wv; 497 return wv;
495 } 498 }
496 499
497 ssize_t ret_w = 0; 500 ssize_t ret_w = 0;
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 }

mercurial