--- 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);