src/server/util/io.c

changeset 126
631aaa01b2b5
parent 112
b962d83124bc
child 133
87b405d61f64
equal deleted inserted replaced
125:c913d515be1e 126:631aaa01b2b5
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> 36 #include <sys/uio.h>
37 37
38 #ifndef BSD 38 #if defined(LINUX) || defined(SOLARIS)
39 #include <sys/sendfile.h> 39 #include <sys/sendfile.h>
40 #define WS_SENDFILE
41 #elif defined(BSD)
42 #if defined(__NetBSD__) || defined(__OpenBSD__)
43 #define net_sys_sendfile net_fallback_sendfile
40 #else 44 #else
41 #if defined(__NetBSD__) || defined(__OpenBSD__) 45 #define WS_SENDFILE
42 #define WS_NO_SENDFILE 46 #endif
47 #else
43 #define net_sys_sendfile net_fallback_sendfile 48 #define net_sys_sendfile net_fallback_sendfile
44 #endif
45 #endif 49 #endif
46 50
47 #include "../daemon/vfs.h" 51 #include "../daemon/vfs.h"
48 #include "io.h" 52 #include "io.h"
49 #include "pool.h" 53 #include "pool.h"
99 103
100 ssize_t net_sys_read(SysStream *st, void *buf, size_t nbytes) { 104 ssize_t net_sys_read(SysStream *st, void *buf, size_t nbytes) {
101 return read(st->fd, buf, nbytes); 105 return read(st->fd, buf, nbytes);
102 } 106 }
103 107
104 #ifndef WS_NO_SENDFILE 108 #ifdef WS_SENDFILE
105 ssize_t net_sys_sendfile(SysStream *st, sendfiledata *sfd) { 109 ssize_t net_sys_sendfile(SysStream *st, sendfiledata *sfd) {
106 ssize_t ret = 0; 110 ssize_t ret = 0;
107 off_t fileoffset = sfd->offset; 111 off_t fileoffset = sfd->offset;
108 if(sfd->fd->fd != -1) { 112 if(sfd->fd->fd != -1) {
109 #ifdef BSD 113 #ifdef BSD
140 if(sfd->trailer) { 144 if(sfd->trailer) {
141 ret += write(st->fd, sfd->trailer, sfd->tlen); 145 ret += write(st->fd, sfd->trailer, sfd->tlen);
142 } 146 }
143 #endif 147 #endif
144 } else { 148 } else {
145 // TODO: regular copy 149 return net_fallback_sendfile((IOStream*)st, sfd);
146 fprintf(stderr, "sendfile not implemented for SYS_FILE\n");
147 } 150 }
148 151
149 return ret; 152 return ret;
150 } 153 }
151 #endif 154 #endif
204 207
205 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes) { 208 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes) {
206 IOStream *fd = st->fd; 209 IOStream *fd = st->fd;
207 if(st->chunked_enc) { 210 if(st->chunked_enc) {
208 // TODO: on some plattforms iov_len is smaller than size_t 211 // TODO: on some plattforms iov_len is smaller than size_t
209 struct iovec io[2]; 212 struct iovec io[3];
210 char chunk_len[16]; 213 char chunk_len[16];
211 io[0].iov_base = chunk_len; 214 io[0].iov_base = chunk_len;
212 io[0].iov_len = snprintf(chunk_len, 16, "\r\n%zx\r\n", nbytes); 215 io[0].iov_len = snprintf(chunk_len, 16, "%zx\r\n", nbytes);
213 io[1].iov_base = buf; 216 io[1].iov_base = buf;
214 io[1].iov_len = nbytes; 217 io[1].iov_len = nbytes;
215 ssize_t r = fd->writev(fd, io, 2); 218 io[2].iov_base = "\r\n";
219 io[2].iov_len = 2;
220 ssize_t r = fd->writev(fd, io, 3);
216 return r - io[0].iov_len; 221 return r - io[0].iov_len;
217 } else { 222 } else {
218 return fd->write(fd, buf, nbytes); 223 return fd->write(fd, buf, nbytes);
219 } 224 }
220 } 225 }

mercurial