src/server/util/io.c

changeset 126
631aaa01b2b5
parent 112
b962d83124bc
child 133
87b405d61f64
--- a/src/server/util/io.c	Sun Oct 30 10:22:00 2016 +0100
+++ b/src/server/util/io.c	Sun Oct 30 11:44:04 2016 +0100
@@ -35,13 +35,17 @@
 #include <sys/uio.h>
 #include <sys/uio.h>
 
-#ifndef BSD
+#if defined(LINUX) || defined(SOLARIS)
 #include <sys/sendfile.h>
-#else
+#define WS_SENDFILE
+#elif defined(BSD)
 #if defined(__NetBSD__) || defined(__OpenBSD__)
-#define WS_NO_SENDFILE
 #define net_sys_sendfile net_fallback_sendfile
+#else
+#define WS_SENDFILE
 #endif
+#else
+#define net_sys_sendfile net_fallback_sendfile
 #endif
 
 #include "../daemon/vfs.h"
@@ -101,7 +105,7 @@
     return read(st->fd, buf, nbytes);
 }
 
-#ifndef WS_NO_SENDFILE
+#ifdef WS_SENDFILE
 ssize_t net_sys_sendfile(SysStream *st, sendfiledata *sfd) {
     ssize_t ret = 0;
     off_t fileoffset = sfd->offset;
@@ -142,8 +146,7 @@
         }
 #endif
     } else {
-        // TODO: regular copy
-        fprintf(stderr, "sendfile not implemented for SYS_FILE\n");
+        return net_fallback_sendfile((IOStream*)st, sfd);
     }
     
     return ret;
@@ -206,13 +209,15 @@
     IOStream *fd = st->fd;
     if(st->chunked_enc) {
         // TODO: on some plattforms iov_len is smaller than size_t
-        struct iovec io[2];
+        struct iovec io[3];
         char chunk_len[16];
         io[0].iov_base = chunk_len;
-        io[0].iov_len = snprintf(chunk_len, 16, "\r\n%zx\r\n", nbytes);
+        io[0].iov_len = snprintf(chunk_len, 16, "%zx\r\n", nbytes);
         io[1].iov_base = buf;
         io[1].iov_len = nbytes;
-        ssize_t r = fd->writev(fd, io, 2);
+        io[2].iov_base = "\r\n";
+        io[2].iov_len = 2;
+        ssize_t r = fd->writev(fd, io, 3);
         return r - io[0].iov_len;
     } else {
         return fd->write(fd, buf, nbytes);

mercurial