src/server/util/io.c

changeset 502
11ac3761c0e3
parent 500
077aa138e8fb
child 513
9a49c245a49c
equal deleted inserted replaced
501:2aa6bd9f166f 502:11ac3761c0e3
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;
175 } 181 }
176 #endif 182 #endif
177 } else { 183 } else {
178 return net_fallback_sendfile((IOStream*)st, sfd); 184 return net_fallback_sendfile((IOStream*)st, sfd);
179 } 185 }
180 186 st->st.io_errno = errno;
181 return ret; 187 return ret;
182 } 188 }
183 #endif 189 #endif
184 190
185 void net_sys_close(Sysstream *st) { 191 void net_sys_close(Sysstream *st) {
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;
455 wv -= wlen; 463 wv -= wlen;
456 i++; 464 i++;
457 } 465 }
458 466
459 st->written += ret_w; 467 st->written += ret_w;
468 if(ret_w == 0) {
469 st->st.io_errno = EWOULDBLOCK; // not sure if this is really correct
470 ret_w = -1;
471 }
460 return ret_w; 472 return ret_w;
461 } 473 }
462 } 474 }
463 475
464 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) { 476 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) {
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) {
851 } 876 }
852 877
853 ssize_t net_write(SYS_NETFD fd, const void *buf, size_t nbytes) { 878 ssize_t net_write(SYS_NETFD fd, const void *buf, size_t nbytes) {
854 ssize_t r = ((IOStream*)fd)->write(fd, buf, nbytes); 879 ssize_t r = ((IOStream*)fd)->write(fd, buf, nbytes);
855 if(r < 0) { 880 if(r < 0) {
856 ((IOStream*)fd)->io_errno = errno;
857 return IO_ERROR; 881 return IO_ERROR;
858 } 882 }
859 return r; 883 return r;
860 } 884 }
861 885

mercurial