93 if(st->chunked_enc) { |
93 if(st->chunked_enc) { |
94 // TODO: on some plattforms iov_len is smaller than size_t |
94 // TODO: on some plattforms iov_len is smaller than size_t |
95 struct iovec io[2]; |
95 struct iovec io[2]; |
96 char chunk_len[16]; |
96 char chunk_len[16]; |
97 io[0].iov_base = chunk_len; |
97 io[0].iov_base = chunk_len; |
98 io[0].iov_len = snprintf(chunk_len, 16, "\n%x\r\n", nbytes); |
98 io[0].iov_len = snprintf(chunk_len, 16, "\n%zx\r\n", nbytes); |
99 io[1].iov_base = buf; |
99 io[1].iov_base = buf; |
100 io[1].iov_len = nbytes; |
100 io[1].iov_len = nbytes; |
101 ssize_t r = writev(st->fd, io, 2); |
101 ssize_t r = writev(st->fd, io, 2); |
102 return r - io[0].iov_len; |
102 return r - io[0].iov_len; |
103 } else { |
103 } else { |
112 io[0].iov_base = chunk_len; |
112 io[0].iov_base = chunk_len; |
113 size_t len = 0; |
113 size_t len = 0; |
114 for(int i=0;i<iovcnt;i++) { |
114 for(int i=0;i<iovcnt;i++) { |
115 len += iovec[i].iov_len; |
115 len += iovec[i].iov_len; |
116 } |
116 } |
117 io[0].iov_len = snprintf(chunk_len, 16, "\n%x\r\n", len); |
117 io[0].iov_len = snprintf(chunk_len, 16, "\n%zx\r\n", len); |
118 memcpy(io + 1, iovec, iovcnt * sizeof(struct iovec)); |
118 memcpy(io + 1, iovec, iovcnt * sizeof(struct iovec)); |
119 ssize_t r = writev(st->fd, io, iovcnt + 1); |
119 ssize_t r = writev(st->fd, io, iovcnt + 1); |
120 return r - io[0].iov_len; |
120 return r - io[0].iov_len; |
121 } else { |
121 } else { |
122 return writev(st->fd, iovec, iovcnt); |
122 return writev(st->fd, iovec, iovcnt); |
148 hdtr.headers = &hdvec; |
148 hdtr.headers = &hdvec; |
149 hdtr.hdr_cnt = 1; |
149 hdtr.hdr_cnt = 1; |
150 hdtr.trailers = &trvec; |
150 hdtr.trailers = &trvec; |
151 hdtr.trl_cnt = 1; |
151 hdtr.trl_cnt = 1; |
152 |
152 |
153 ret = sendfile(sfd->fd->fd, st->fd, sfd->offset, (off_t*)&sfd->len, &hdtr, 0); |
153 off_t len = sfd->len; |
|
154 ret = sendfile(sfd->fd->fd, st->fd, sfd->offset, &len, &hdtr, 0); |
154 #else |
155 #else |
155 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
156 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
156 #endif |
157 #endif |
157 } else { |
158 } else { |
158 // TODO: regular copy |
159 // TODO: regular copy |