src/server/util/io.c

changeset 70
4e6e812c1d97
parent 69
4a10bc0ee80d
child 71
069c152f6272
equal deleted inserted replaced
69:4a10bc0ee80d 70:4e6e812c1d97
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

mercurial