117 return (IOStream*)st; |
117 return (IOStream*)st; |
118 } |
118 } |
119 |
119 |
120 #ifdef XP_UNIX |
120 #ifdef XP_UNIX |
121 ssize_t net_sys_write(Sysstream *st, const void *buf, size_t nbytes) { |
121 ssize_t net_sys_write(Sysstream *st, const void *buf, size_t nbytes) { |
122 return write(st->fd, buf, nbytes); |
122 ssize_t r = write(st->fd, buf, nbytes); |
|
123 st->st.io_errno = errno; |
|
124 return r; |
123 } |
125 } |
124 |
126 |
125 ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt) { |
127 ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt) { |
126 return writev(st->fd, iovec, iovcnt); |
128 ssize_t r = writev(st->fd, iovec, iovcnt); |
|
129 st->st.io_errno = errno; |
|
130 return r; |
127 } |
131 } |
128 |
132 |
129 ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes) { |
133 ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes) { |
130 return read(st->fd, buf, nbytes); |
134 ssize_t r = read(st->fd, buf, nbytes); |
|
135 st->st.io_errno = errno; |
|
136 return r; |
131 } |
137 } |
132 |
138 |
133 #ifdef WS_SENDFILE |
139 #ifdef WS_SENDFILE |
134 ssize_t net_sys_sendfile(Sysstream *st, sendfiledata *sfd) { |
140 ssize_t net_sys_sendfile(Sysstream *st, sendfiledata *sfd) { |
135 ssize_t ret = 0; |
141 ssize_t ret = 0; |
367 st->current_trailer -= written; |
373 st->current_trailer -= written; |
368 return 0; |
374 return 0; |
369 } |
375 } |
370 |
376 |
371 ssize_t net_http_write(HttpStream *st, const void *buf, size_t nbytes) { |
377 ssize_t net_http_write(HttpStream *st, const void *buf, size_t nbytes) { |
|
378 st->st.io_errno = 0; |
372 if(st->write_eof) return 0; |
379 if(st->write_eof) return 0; |
373 IOStream *fd = st->fd; |
380 IOStream *fd = st->fd; |
374 if(!st->chunked_enc) { |
381 if(!st->chunked_enc) { |
375 ssize_t w = fd->write(fd, buf, nbytes); |
382 ssize_t w = fd->write(fd, buf, nbytes); |
376 st->written += w > 0 ? w : 0; |
383 st->written += w > 0 ? w : 0; |
440 iovec_len++; |
447 iovec_len++; |
441 } |
448 } |
442 |
449 |
443 ssize_t wv = fd->writev(fd, io, iovec_len); |
450 ssize_t wv = fd->writev(fd, io, iovec_len); |
444 if(wv <= 0) { |
451 if(wv <= 0) { |
|
452 st->st.io_errno = net_errno(st->fd); |
445 return wv; |
453 return wv; |
446 } |
454 } |
447 |
455 |
448 size_t ret_w = 0; |
456 ssize_t ret_w = 0; |
449 int i = 0; |
457 int i = 0; |
450 while(wv > 0) { |
458 while(wv > 0) { |
451 char *base = io[i].iov_base; |
459 char *base = io[i].iov_base; |
452 size_t len = io[i].iov_len; |
460 size_t len = io[i].iov_len; |
453 size_t wlen = wv > len ? len : wv; |
461 size_t wlen = wv > len ? len : wv; |
769 |
781 |
770 ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes) { |
782 ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes) { |
771 int ret = SSL_write(st->ssl, buf, nbytes); |
783 int ret = SSL_write(st->ssl, buf, nbytes); |
772 if(ret <= 0) { |
784 if(ret <= 0) { |
773 st->error = SSL_get_error(st->ssl, ret); |
785 st->error = SSL_get_error(st->ssl, ret); |
|
786 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
|
787 st->st.io_errno = EWOULDBLOCK; |
|
788 } else { |
|
789 st->st.io_errno = -1; |
|
790 } |
|
791 ret = -1; |
774 } |
792 } |
775 return ret; |
793 return ret; |
776 } |
794 } |
777 |
795 |
778 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
796 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
779 ssize_t r = 0; |
797 ssize_t r = 0; |
780 for(int i=0;i<iovcnt;i++) { |
798 for(int i=0;i<iovcnt;i++) { |
781 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
799 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
782 if(ret <= 0) { |
800 if(ret <= 0) { |
783 st->error = SSL_get_error(st->ssl, ret); |
801 if(r == 0) { |
784 return 0; |
802 st->error = SSL_get_error(st->ssl, ret); |
|
803 if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { |
|
804 st->st.io_errno = EWOULDBLOCK; |
|
805 } else { |
|
806 st->st.io_errno = -1; |
|
807 } |
|
808 } |
|
809 break; |
785 } |
810 } |
786 r += ret; |
811 r += ret; |
787 } |
812 } |
788 return r; |
813 return r == 0 ? -1 : r; |
789 } |
814 } |
790 |
815 |
791 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { |
816 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { |
792 int ret = SSL_read(st->ssl, buf, nbytes); |
817 int ret = SSL_read(st->ssl, buf, nbytes); |
793 if(ret <= 0) { |
818 if(ret <= 0) { |