--- a/src/server/util/io.c Fri Mar 01 22:44:54 2013 +0100 +++ b/src/server/util/io.c Sat Mar 16 23:11:34 2013 +0100 @@ -33,20 +33,23 @@ #include <unistd.h> #include <stdlib.h> #include <sys/uio.h> - +#include <sys/sendfile.h> #include <limits.h> /* asprintf */ +#include "../daemon/vfs.h" #include "io.h" #include "pool.h" IOStream native_io_funcs = { system_write, - system_read + system_read, + NULL }; IOStream net_io_funcs = { net_stream_write, - net_stream_read + net_stream_read, + net_stream_sendfile }; @@ -76,7 +79,7 @@ } ssize_t net_stream_write(IOStream *st, void *buf, size_t nbytes) { - // TODO: implement + return write(((NetIOStream*)st)->fd, buf, nbytes); } ssize_t net_stream_read(IOStream *st, void *buf, size_t nbytes) { @@ -89,6 +92,21 @@ return r; } +ssize_t net_stream_sendfile(IOStream *st, sendfiledata *sfd) { + NetIOStream *io = (NetIOStream*)st; + // TODO: header and trailer + ssize_t ret = 0; + off_t fileoffset = sfd->offset; + if(sfd->fd->fd != -1) { + ret = sendfile(io->fd, sfd->fd->fd, &fileoffset, sfd->len); + } else { + // TODO: regular copy + fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); + } + + return ret; +} + ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) { ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes); @@ -116,6 +134,19 @@ return len; } +ssize_t net_sendfile(SYS_NETFD fd, sendfiledata *sfd) { + IOStream *out = fd; + if(out->sendfile) { + ssize_t r = ((IOStream*)fd)->sendfile(fd, sfd); + if(r < 0) { + return IO_ERROR; + } + } else { + fprintf(stderr, "stream does not support sendfile\n"); + } + return IO_ERROR; +} + /* iovec buffer */ iovec_buf_t *iovec_buf_create(pool_handle_t *pool) {