src/server/util/io.c

changeset 502
11ac3761c0e3
parent 500
077aa138e8fb
child 513
9a49c245a49c
--- 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;

mercurial