Mercurial > hg > nginx
comparison src/event/ngx_event_recv.c @ 69:e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 20 Mar 2003 16:09:44 +0000 |
parents | 5a7d1aaa1618 |
children |
comparison
equal
deleted
inserted
replaced
68:d549fdc17d7e | 69:e43f406e4525 |
---|---|
6 #include <ngx_recv.h> | 6 #include <ngx_recv.h> |
7 #include <ngx_connection.h> | 7 #include <ngx_connection.h> |
8 | 8 |
9 ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) | 9 ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size) |
10 { | 10 { |
11 int n; | 11 ssize_t n; |
12 ngx_err_t err; | 12 ngx_err_t err; |
13 ngx_event_t *ev; | 13 ngx_event_t *ev; |
14 | 14 |
15 ev = c->read; | 15 ev = c->read; |
16 | 16 |
17 if (ev->timedout) { | 17 /* DEBUG */ |
18 ngx_set_socket_errno(NGX_ETIMEDOUT); | |
19 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "recv() failed"); | |
20 return NGX_ERROR; | |
21 } | |
22 | |
23 #if (HAVE_KQUEUE) | 18 #if (HAVE_KQUEUE) |
24 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
25 ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ | 20 ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ |
26 ev->eof _ ev->available _ ev->error); | 21 ev->eof _ ev->available _ ev->error); |
27 } | 22 } |
28 #endif | 23 #endif |
29 | 24 |
30 #if (USE_KQUEUE) | 25 #if (USE_KQUEUE) |
31 | 26 |
32 if (ev->eof && ev->available == 0) { | 27 if (ev->eof && ev->available == 0) { |
33 if (ev->error) { | |
34 ngx_set_socket_errno(ev->error); | |
35 | 28 |
36 if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { | 29 if (ev->error == 0) { |
37 return 0; | 30 return 0; |
38 } | |
39 | |
40 ngx_log_error(NGX_LOG_ERR, c->log, ev->error, | |
41 "recv() failed"); | |
42 return NGX_ERROR; | |
43 } | 31 } |
44 | 32 |
45 return 0; | 33 ngx_set_socket_errno(ev->error); |
46 } | 34 err = ev->error; |
35 n = -1; | |
47 | 36 |
48 #elif (HAVE_KQUEUE) | 37 } else { |
38 n = ngx_recv(c->fd, buf, size, 0); | |
49 | 39 |
50 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 40 if (n == -1) { |
51 if (ev->eof && ev->available == 0) { | 41 err = ngx_socket_errno; |
52 if (ev->error) { | |
53 ngx_set_socket_errno(ev->error); | |
54 | |
55 if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { | |
56 return 0; | |
57 } | |
58 | |
59 ngx_log_error(NGX_LOG_ERR, c->log, ev->error, | |
60 "recv() failed"); | |
61 return NGX_ERROR; | |
62 } | |
63 | |
64 return 0; | |
65 } | 42 } |
66 } | 43 } |
67 | 44 |
68 #endif | 45 if (n == -1) { |
46 ev->ready = 0; | |
69 | 47 |
70 n = ngx_recv(c->fd, buf, size, 0); | 48 if (err == NGX_ECONNRESET && ev->ignore_econnreset) { |
71 | |
72 if (n == -1) { | |
73 err = ngx_socket_errno; | |
74 | |
75 if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) { | |
76 return 0; | 49 return 0; |
77 } | 50 } |
78 | 51 |
79 if (err == NGX_EAGAIN) { | 52 if (err == NGX_EAGAIN) { |
80 ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returns EAGAIN"); | 53 ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN"); |
81 return NGX_AGAIN; | 54 return NGX_AGAIN; |
82 } | 55 } |
83 | 56 |
84 ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed"); | 57 ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed"); |
85 return NGX_ERROR; | 58 return NGX_ERROR; |
86 } | 59 } |
87 | 60 |
88 #if (USE_KQUEUE) | 61 ev->available -= n; |
62 if (ev->available == 0) { | |
63 ev->ready = 0; | |
64 } | |
89 | 65 |
90 ev->available -= n; | 66 return n; |
91 | 67 |
92 #elif (HAVE_KQUEUE) | 68 #elif (HAVE_KQUEUE) |
93 | 69 |
70 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) | |
71 && ev->eof && ev->available == 0) { | |
72 | |
73 if (ev->error == 0) { | |
74 return 0; | |
75 } | |
76 | |
77 ngx_set_socket_errno(ev->error); | |
78 err = ev->error; | |
79 n = -1; | |
80 | |
81 } else { | |
82 n = ngx_recv(c->fd, buf, size, 0); | |
83 ngx_log_debug(c->log, "ngx_event_recv: read:%d:%d" _ n _ size); | |
84 | |
85 if (n == -1) { | |
86 err = ngx_socket_errno; | |
87 } | |
88 } | |
89 | |
90 if (n == -1) { | |
91 ev->ready = 0; | |
92 | |
93 if (err == NGX_ECONNRESET && ev->ignore_econnreset) { | |
94 return 0; | |
95 } | |
96 | |
97 if (err == NGX_EAGAIN) { | |
98 ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN"); | |
99 return NGX_AGAIN; | |
100 } | |
101 | |
102 ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed"); | |
103 return NGX_ERROR; | |
104 } | |
105 | |
94 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 106 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
95 ev->available -= n; | 107 ev->available -= n; |
108 if (ev->available == 0) { | |
109 ev->ready = 0; | |
110 } | |
111 | |
112 } else if ((size_t) n < size) { | |
113 ev->ready = 0; | |
96 } | 114 } |
97 | 115 |
98 #endif | 116 return n; |
117 | |
118 #else /* not kqueue */ | |
119 | |
120 n = ngx_recv(c->fd, buf, size, 0); | |
121 | |
122 if (n == -1) { | |
123 err = ngx_socket_errno; | |
124 | |
125 ev->ready = 0; | |
126 | |
127 if (err == NGX_ECONNRESET && ev->ignore_econnreset) { | |
128 return 0; | |
129 } | |
130 | |
131 if (err == NGX_EAGAIN) { | |
132 ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN"); | |
133 return NGX_AGAIN; | |
134 } | |
135 | |
136 ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed"); | |
137 return NGX_ERROR; | |
138 } | |
139 | |
140 if ((size_t) n < size) { | |
141 ev->ready = 0; | |
142 } | |
99 | 143 |
100 return n; | 144 return n; |
145 | |
146 #endif | |
101 } | 147 } |