src/server/util/io.c

changeset 493
56cf890dd9ed
parent 430
83560f32e7d5
child 498
0d80f8a2b29f
equal deleted inserted replaced
492:07452a54a22b 493:56cf890dd9ed
142 struct iovec trvec; 142 struct iovec trvec;
143 trvec.iov_base = (void*)sfd->trailer; 143 trvec.iov_base = (void*)sfd->trailer;
144 trvec.iov_len = sfd->tlen; 144 trvec.iov_len = sfd->tlen;
145 struct sf_hdtr hdtr; 145 struct sf_hdtr hdtr;
146 hdtr.headers = &hdvec; 146 hdtr.headers = &hdvec;
147 hdtr.hdr_cnt = 1; 147 hdtr.hdr_cnt = sfd->hlen > 0 ? 1 : 0;
148 hdtr.trailers = &trvec; 148 hdtr.trailers = &trvec;
149 hdtr.trl_cnt = 1; 149 hdtr.trl_cnt = sfd->tlen > 0 ? 1 : 0;
150 150
151 off_t len = sfd->len; 151 off_t len = sfd->len;
152 #ifdef OSX 152 #ifdef OSX
153 ret = sendfile(sfd->fd->fd, st->fd, fileoffset, &len, &hdtr, 0); 153 ret = sendfile(sfd->fd->fd, st->fd, fileoffset, &len, &hdtr, 0);
154 #else // BSD 154 #else // BSD
159 sfd->len, 159 sfd->len,
160 &hdtr, 160 &hdtr,
161 NULL, 161 NULL,
162 0); 162 0);
163 #endif 163 #endif
164 if(ret == 0) {
165 ret = sfd->hlen + sfd->tlen + sfd->len;
166 }
167
164 #else // Solaris/Linux 168 #else // Solaris/Linux
165 if(sfd->header) { 169 if(sfd->header) {
166 ret += write(st->fd, sfd->header, sfd->hlen); 170 ret += write(st->fd, sfd->header, sfd->hlen);
167 } 171 }
168 ret += sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); 172 ret += sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len);
608 ret = st->fd->sendfile(st->fd, sfd); 612 ret = st->fd->sendfile(st->fd, sfd);
609 } else { 613 } else {
610 ret = net_fallback_sendfile((IOStream*)st, sfd); 614 ret = net_fallback_sendfile((IOStream*)st, sfd);
611 } 615 }
612 616
617 st->written += ret > 0 ? ret : 0;
618
613 return ret; 619 return ret;
614 } 620 }
615 621
616 void net_http_close(HttpStream *st) { 622 void net_http_close(HttpStream *st) {
617 st->fd->close(st->fd); 623 st->fd->close(st->fd);

mercurial