comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 153:c71aeb75c071

nginx-0.0.1-2003-10-21-20:49:56 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 21 Oct 2003 16:49:56 +0000
parents fb48bf4fea1c
children eac26585476e
comparison
equal deleted inserted replaced
152:fb48bf4fea1c 153:c71aeb75c071
152 hdtr.headers = (struct iovec *) header.elts; 152 hdtr.headers = (struct iovec *) header.elts;
153 hdtr.hdr_cnt = header.nelts; 153 hdtr.hdr_cnt = header.nelts;
154 hdtr.trailers = (struct iovec *) trailer.elts; 154 hdtr.trailers = (struct iovec *) trailer.elts;
155 hdtr.trl_cnt = trailer.nelts; 155 hdtr.trl_cnt = trailer.nelts;
156 156
157 /*
158 * the old sendfile() "nbytes bug":
159 * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771
160 */
161
157 if (ngx_freebsd_sendfile_nbytes_bug == 0) { 162 if (ngx_freebsd_sendfile_nbytes_bug == 0) {
158 hsize = 0; 163 hsize = 0;
159 } 164 }
160 165
161 rc = sendfile(file->file->fd, c->fd, file->file_pos, 166 rc = sendfile(file->file->fd, c->fd, file->file_pos,
192 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts); 197 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts);
193 198
194 if (rc == -1) { 199 if (rc == -1) {
195 err = ngx_errno; 200 err = ngx_errno;
196 if (err == NGX_EAGAIN) { 201 if (err == NGX_EAGAIN) {
197 eagain = 1;
198 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); 202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
199 203
200 } else if (err == NGX_EINTR) { 204 } else if (err == NGX_EINTR) {
201 eintr = 1; 205 eintr = 1;
202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); 206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
254 } 258 }
255 259
256 in = ce; 260 in = ce;
257 261
258 if (eagain) { 262 if (eagain) {
263 /*
264 * sendfile() can return EAGAIN even if it has sent
265 * a whole file part and successive sendfile() would
266 * return EAGAIN right away and would not send anything.
267 */
259 c->write->ready = 0; 268 c->write->ready = 0;
260 break; 269 break;
261 } 270 }
262 271
263 /* "tail == in" means that a single sendfile() is complete */ 272 /* "tail == in" means that a single sendfile() is complete */