src/server/util/io.c

changeset 69
4a10bc0ee80d
parent 66
74babc0082b7
child 70
4e6e812c1d97
equal deleted inserted replaced
68:f5102a892ed4 69:4a10bc0ee80d
31 #endif 31 #endif
32 32
33 #include <unistd.h> 33 #include <unistd.h>
34 #include <stdlib.h> 34 #include <stdlib.h>
35 #include <sys/uio.h> 35 #include <sys/uio.h>
36 #include <sys/uio.h>
37 #ifndef BSD
36 #include <sys/sendfile.h> 38 #include <sys/sendfile.h>
39 #endif
37 #include <limits.h> /* asprintf */ 40 #include <limits.h> /* asprintf */
38 41
39 #include "../daemon/vfs.h" 42 #include "../daemon/vfs.h"
40 #include "io.h" 43 #include "io.h"
41 #include "pool.h" 44 #include "pool.h"
132 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) { 135 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) {
133 // TODO: header and trailer 136 // TODO: header and trailer
134 ssize_t ret = 0; 137 ssize_t ret = 0;
135 off_t fileoffset = sfd->offset; 138 off_t fileoffset = sfd->offset;
136 if(sfd->fd->fd != -1) { 139 if(sfd->fd->fd != -1) {
140 #ifdef OSX
141 struct iovec hdvec;
142 hdvec.iov_base = (void*)sfd->header;
143 hdvec.iov_len = sfd->hlen;
144 struct iovec trvec;
145 trvec.iov_base = (void*)sfd->trailer;
146 trvec.iov_len = sfd->tlen;
147 struct sf_hdtr hdtr;
148 hdtr.headers = &hdvec;
149 hdtr.hdr_cnt = 1;
150 hdtr.trailers = &trvec;
151 hdtr.trl_cnt = 1;
152
153 ret = sendfile(sfd->fd->fd, st->fd, sfd->offset, (off_t*)&sfd->len, &hdtr, 0);
154 #else
137 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); 155 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len);
156 #endif
138 } else { 157 } else {
139 // TODO: regular copy 158 // TODO: regular copy
140 fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); 159 fprintf(stderr, "sendfile not implemented for SYS_FILE\n");
141 } 160 }
142 161

mercurial