comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 163:fb61ba77beba

nginx-0.0.1-2003-10-28-18:45:41 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 28 Oct 2003 15:45:41 +0000
parents 46eb23d9471d
children c42be4185301
comparison
equal deleted inserted replaced
162:96993d4d5067 163:fb61ba77beba
23 23
24 ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) 24 ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in)
25 { 25 {
26 int rc, eintr, eagain; 26 int rc, eintr, eagain;
27 char *prev; 27 char *prev;
28 off_t sent, fprev;
28 ssize_t hsize, fsize, size; 29 ssize_t hsize, fsize, size;
29 off_t sent, fprev;
30 struct iovec *iov; 30 struct iovec *iov;
31 struct sf_hdtr hdtr; 31 struct sf_hdtr hdtr;
32 ngx_err_t err; 32 ngx_err_t err;
33 ngx_array_t header, trailer; 33 ngx_array_t header, trailer;
34 ngx_hunk_t *file; 34 ngx_hunk_t *file;
65 break; 65 break;
66 } 66 }
67 67
68 if (prev == cl->hunk->pos) { 68 if (prev == cl->hunk->pos) {
69 iov->iov_len += cl->hunk->last - cl->hunk->pos; 69 iov->iov_len += cl->hunk->last - cl->hunk->pos;
70 prev = cl->hunk->last;
71 70
72 } else { 71 } else {
73 ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR); 72 ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR);
74 iov->iov_base = cl->hunk->pos; 73 iov->iov_base = cl->hunk->pos;
75 iov->iov_len = cl->hunk->last - cl->hunk->pos; 74 iov->iov_len = cl->hunk->last - cl->hunk->pos;
76 prev = cl->hunk->last; 75 }
77 } 76
78 77 prev = cl->hunk->last;
79 hsize += cl->hunk->last - cl->hunk->pos; 78 hsize += cl->hunk->last - cl->hunk->pos;
80 } 79 }
81 80
82 /* get the file hunk */ 81 /* get the file hunk */
83 82
116 break; 115 break;
117 } 116 }
118 117
119 if (prev == cl->hunk->pos) { 118 if (prev == cl->hunk->pos) {
120 iov->iov_len += cl->hunk->last - cl->hunk->pos; 119 iov->iov_len += cl->hunk->last - cl->hunk->pos;
121 prev = cl->hunk->last;
122 120
123 } else { 121 } else {
124 ngx_test_null(iov, ngx_push_array(&trailer), NGX_CHAIN_ERROR); 122 ngx_test_null(iov, ngx_push_array(&trailer), NGX_CHAIN_ERROR);
125 iov->iov_base = cl->hunk->pos; 123 iov->iov_base = cl->hunk->pos;
126 iov->iov_len = cl->hunk->last - cl->hunk->pos; 124 iov->iov_len = cl->hunk->last - cl->hunk->pos;
127 prev = cl->hunk->last; 125 }
128 } 126
127 prev = cl->hunk->last;
129 } 128 }
130 129
131 /* 130 /*
132 * the tail is the rest of the chain that exceeded 131 * the tail is the rest of the chain that exceeded
133 * a single sendfile() capability 132 * a single sendfile() capability
180 if (err == NGX_EAGAIN || err == NGX_EINTR) { 179 if (err == NGX_EAGAIN || err == NGX_EINTR) {
181 ngx_log_error(NGX_LOG_INFO, c->log, err, 180 ngx_log_error(NGX_LOG_INFO, c->log, err,
182 "sendfile() sent only %qd bytes", sent); 181 "sendfile() sent only %qd bytes", sent);
183 182
184 } else { 183 } else {
184 c->write->error = 1;
185 ngx_log_error(NGX_LOG_CRIT, c->log, err, 185 ngx_log_error(NGX_LOG_CRIT, c->log, err,
186 "sendfile() failed"); 186 "sendfile() failed");
187 return NGX_CHAIN_ERROR; 187 return NGX_CHAIN_ERROR;
188 } 188 }
189 } 189 }
204 } else if (err == NGX_EINTR) { 204 } else if (err == NGX_EINTR) {
205 eintr = 1; 205 eintr = 1;
206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); 206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
207 207
208 } else { 208 } else {
209 c->write->error = 1;
209 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); 210 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed");
210 return NGX_CHAIN_ERROR; 211 return NGX_CHAIN_ERROR;
211 } 212 }
212 } 213 }
213 214