--- a/src/server/util/io.c Sat Jun 10 18:12:04 2023 +0200 +++ b/src/server/util/io.c Sun Jun 11 15:53:55 2023 +0200 @@ -119,15 +119,21 @@ #ifdef XP_UNIX ssize_t net_sys_write(Sysstream *st, const void *buf, size_t nbytes) { - return write(st->fd, buf, nbytes); + ssize_t r = write(st->fd, buf, nbytes); + st->st.io_errno = errno; + return r; } ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt) { - return writev(st->fd, iovec, iovcnt); + ssize_t r = writev(st->fd, iovec, iovcnt); + st->st.io_errno = errno; + return r; } ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes) { - return read(st->fd, buf, nbytes); + ssize_t r = read(st->fd, buf, nbytes); + st->st.io_errno = errno; + return r; } #ifdef WS_SENDFILE @@ -177,7 +183,7 @@ } else { return net_fallback_sendfile((IOStream*)st, sfd); } - + st->st.io_errno = errno; return ret; } #endif @@ -369,6 +375,7 @@ } ssize_t net_http_write(HttpStream *st, const void *buf, size_t nbytes) { + st->st.io_errno = 0; if(st->write_eof) return 0; IOStream *fd = st->fd; if(!st->chunked_enc) { @@ -442,10 +449,11 @@ ssize_t wv = fd->writev(fd, io, iovec_len); if(wv <= 0) { + st->st.io_errno = net_errno(st->fd); return wv; } - size_t ret_w = 0; + ssize_t ret_w = 0; int i = 0; while(wv > 0) { char *base = io[i].iov_base; @@ -457,6 +465,10 @@ } st->written += ret_w; + if(ret_w == 0) { + st->st.io_errno = EWOULDBLOCK; // not sure if this is really correct + ret_w = -1; + } return ret_w; } } @@ -771,6 +783,12 @@ int ret = SSL_write(st->ssl, buf, nbytes); if(ret <= 0) { st->error = SSL_get_error(st->ssl, ret); + if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { + st->st.io_errno = EWOULDBLOCK; + } else { + st->st.io_errno = -1; + } + ret = -1; } return ret; } @@ -780,12 +798,19 @@ for(int i=0;i<iovcnt;i++) { int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); if(ret <= 0) { - st->error = SSL_get_error(st->ssl, ret); - return 0; + if(r == 0) { + st->error = SSL_get_error(st->ssl, ret); + if(st->error == SSL_ERROR_WANT_WRITE || st->error == SSL_ERROR_WANT_READ) { + st->st.io_errno = EWOULDBLOCK; + } else { + st->st.io_errno = -1; + } + } + break; } r += ret; } - return r; + return r == 0 ? -1 : r; } ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { @@ -853,7 +878,6 @@ ssize_t net_write(SYS_NETFD fd, const void *buf, size_t nbytes) { ssize_t r = ((IOStream*)fd)->write(fd, buf, nbytes); if(r < 0) { - ((IOStream*)fd)->io_errno = errno; return IO_ERROR; } return r;