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 }