Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_readv_chain.c @ 164:84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 29 Oct 2003 08:30:44 +0000 |
parents | fb61ba77beba |
children | 0061d1f0908d |
comparison
equal
deleted
inserted
replaced
163:fb61ba77beba | 164:84036764e215 |
---|---|
5 | 5 |
6 | 6 |
7 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) | 7 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) |
8 { | 8 { |
9 char *prev; | 9 char *prev; |
10 ssize_t n; | 10 ssize_t n, size; |
11 struct iovec *iov; | 11 struct iovec *iov; |
12 ngx_err_t err; | 12 ngx_err_t err; |
13 ngx_array_t io; | 13 ngx_array_t io; |
14 | 14 |
15 prev = NULL; | 15 prev = NULL; |
16 iov = NULL; | 16 iov = NULL; |
17 size = 0; | |
17 | 18 |
18 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_ERROR); | 19 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_ERROR); |
19 | 20 |
20 /* coalesce the neighbouring hunks */ | 21 /* coalesce the neighbouring hunks */ |
21 | 22 |
27 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR); | 28 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR); |
28 iov->iov_base = chain->hunk->last; | 29 iov->iov_base = chain->hunk->last; |
29 iov->iov_len = chain->hunk->end - chain->hunk->last; | 30 iov->iov_len = chain->hunk->end - chain->hunk->last; |
30 } | 31 } |
31 | 32 |
33 size += chain->hunk->end - chain->hunk->last; | |
32 prev = chain->hunk->end; | 34 prev = chain->hunk->end; |
33 chain = chain->next; | 35 chain = chain->next; |
34 } | 36 } |
35 | 37 |
36 ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len); | 38 ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len); |
40 if (n == 0) { | 42 if (n == 0) { |
41 c->read->eof = 1; | 43 c->read->eof = 1; |
42 | 44 |
43 } else if (n == -1) { | 45 } else if (n == -1) { |
44 c->read->ready = 0; | 46 c->read->ready = 0; |
45 c->read->error = 1; | |
46 | 47 |
47 err = ngx_errno; | 48 err = ngx_errno; |
48 if (err == NGX_EAGAIN) { | 49 if (err == NGX_EAGAIN) { |
49 ngx_log_error(NGX_LOG_INFO, c->log, err, "readv() returned EAGAIN"); | 50 ngx_log_error(NGX_LOG_INFO, c->log, err, "readv() returned EAGAIN"); |
50 return NGX_AGAIN; | 51 return NGX_AGAIN; |
51 } | 52 } |
52 | 53 |
54 c->read->error = 1; | |
53 ngx_log_error(NGX_LOG_ERR, c->log, err, "readv() failed"); | 55 ngx_log_error(NGX_LOG_ERR, c->log, err, "readv() failed"); |
54 return NGX_ERROR; | 56 return NGX_ERROR; |
57 | |
58 } else if (n < size) { | |
59 c->read->ready = 0; | |
55 } | 60 } |
56 | 61 |
57 return n; | 62 return n; |
58 } | 63 } |