src/server/util/io.c

changeset 54
3a1d5a52adfc
parent 46
636e05eb48f6
child 64
c7f5b062e622
--- 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) {

mercurial