Mercurial > hg > nginx
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 |