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 |
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 } |