Mercurial > hg > nginx
comparison src/os/unix/ngx_recv.c @ 253:b6793bc5034b
nginx-0.0.2-2004-02-09-10:46:43 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 09 Feb 2004 07:46:43 +0000 |
parents | 05592fd7a436 |
children | 8e39cab6abd5 |
comparison
equal
deleted
inserted
replaced
252:84b1c672ec5a | 253:b6793bc5034b |
---|---|
1 | 1 |
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 | |
6 | |
7 static int ngx_unix_recv_error(ngx_event_t *rev, ngx_err_t err); | |
8 | 5 |
9 | 6 |
10 #if (HAVE_KQUEUE) | 7 #if (HAVE_KQUEUE) |
11 | 8 |
12 ssize_t ngx_unix_recv(ngx_connection_t *c, char *buf, size_t size) | 9 ssize_t ngx_unix_recv(ngx_connection_t *c, char *buf, size_t size) |
13 { | 10 { |
14 ssize_t n; | 11 ssize_t n; |
12 ngx_err_t err; | |
15 ngx_event_t *rev; | 13 ngx_event_t *rev; |
16 | 14 |
17 rev = c->read; | 15 rev = c->read; |
18 | 16 |
19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 17 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
24 if (rev->available == 0) { | 22 if (rev->available == 0) { |
25 if (rev->kq_eof) { | 23 if (rev->kq_eof) { |
26 rev->ready = 0; | 24 rev->ready = 0; |
27 rev->eof = 1; | 25 rev->eof = 1; |
28 | 26 |
27 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, | |
28 "kevent() reported about an closed connection"); | |
29 | |
29 if (rev->kq_errno) { | 30 if (rev->kq_errno) { |
30 rev->error = 1; | 31 rev->error = 1; |
31 ngx_set_socket_errno(rev->kq_errno); | 32 ngx_set_socket_errno(rev->kq_errno); |
32 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, | |
33 "kevent() reported about closed connection"); | |
34 | 33 |
35 if (rev->kq_errno == NGX_ECONNRESET | 34 if (rev->kq_errno == NGX_ECONNRESET |
36 && rev->log_error == NGX_ERROR_IGNORE_ECONNRESET) | 35 && rev->log_error == NGX_ERROR_IGNORE_ECONNRESET) |
37 { | 36 { |
38 return 0; | 37 return 0; |
50 } | 49 } |
51 | 50 |
52 do { | 51 do { |
53 n = recv(c->fd, buf, size, 0); | 52 n = recv(c->fd, buf, size, 0); |
54 | 53 |
55 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,"recv: %d:%d", n, size); | 54 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
55 "recv: fd:%d %d of %d", c->fd, n, size); | |
56 | 56 |
57 if (n >= 0) { | 57 if (n >= 0) { |
58 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 58 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
59 rev->available -= n; | 59 rev->available -= n; |
60 | 60 |
85 } | 85 } |
86 | 86 |
87 return n; | 87 return n; |
88 } | 88 } |
89 | 89 |
90 n = ngx_unix_recv_error(rev, ngx_socket_errno); | 90 err = ngx_socket_errno; |
91 | 91 |
92 } while (n == NGX_EINTR); | 92 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
93 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, err, | |
94 "recv() not ready"); | |
95 n = NGX_AGAIN; | |
93 | 96 |
94 /* NGX_ERROR || NGX_AGAIN */ | 97 } else { |
98 n = ngx_connection_error(c, err, "recv() failed"); | |
99 break; | |
100 } | |
101 | |
102 } while (err == NGX_EINTR); | |
95 | 103 |
96 rev->ready = 0; | 104 rev->ready = 0; |
97 | 105 |
98 if (n == NGX_ERROR){ | 106 if (n == NGX_ERROR){ |
99 rev->error = 1; | 107 rev->error = 1; |
105 #else /* ! NAVE_KQUEUE */ | 113 #else /* ! NAVE_KQUEUE */ |
106 | 114 |
107 ssize_t ngx_unix_recv(ngx_connection_t *c, char *buf, size_t size) | 115 ssize_t ngx_unix_recv(ngx_connection_t *c, char *buf, size_t size) |
108 { | 116 { |
109 ssize_t n; | 117 ssize_t n; |
118 ngx_err_t err; | |
110 ngx_event_t *rev; | 119 ngx_event_t *rev; |
111 | 120 |
112 rev = c->read; | 121 rev = c->read; |
113 | 122 |
114 do { | 123 do { |
115 n = recv(c->fd, buf, size, 0); | 124 n = recv(c->fd, buf, size, 0); |
116 | 125 |
117 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,"recv: %d:%d", n, size); | 126 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
127 "recv: fd:%d %d of %d", c->fd, n, size); | |
118 | 128 |
119 if (n >= 0) { | 129 if (n >= 0) { |
120 if ((size_t) n < size) { | 130 if ((size_t) n < size) { |
121 rev->ready = 0; | 131 rev->ready = 0; |
122 } | 132 } |
126 } | 136 } |
127 | 137 |
128 return n; | 138 return n; |
129 } | 139 } |
130 | 140 |
131 n = ngx_unix_recv_error(rev, ngx_socket_errno); | 141 err = ngx_socket_errno; |
132 | 142 |
133 } while (n == NGX_EINTR); | 143 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
144 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, err, | |
145 "recv() not ready"); | |
146 n = NGX_AGAIN; | |
134 | 147 |
135 /* NGX_ERROR || NGX_AGAIN */ | 148 } else { |
149 n = ngx_connection_error(c, err, "recv() failed"); | |
150 break; | |
151 } | |
152 | |
153 } while (err == NGX_EINTR); | |
136 | 154 |
137 rev->ready = 0; | 155 rev->ready = 0; |
138 | 156 |
139 if (n == NGX_ERROR){ | 157 if (n == NGX_ERROR){ |
140 rev->error = 1; | 158 rev->error = 1; |
142 | 160 |
143 return n; | 161 return n; |
144 } | 162 } |
145 | 163 |
146 #endif /* NAVE_KQUEUE */ | 164 #endif /* NAVE_KQUEUE */ |
147 | |
148 | |
149 static int ngx_unix_recv_error(ngx_event_t *rev, ngx_err_t err) | |
150 { | |
151 ngx_int_t level; | |
152 | |
153 if (err == NGX_EAGAIN || err == NGX_EINTR) { | |
154 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, err, "recv() not ready"); | |
155 return NGX_AGAIN; | |
156 } | |
157 | |
158 if (err == NGX_ECONNRESET) { | |
159 | |
160 switch (rev->log_error) { | |
161 case NGX_ERROR_IGNORE_ECONNRESET: | |
162 return 0; | |
163 case NGX_ERROR_INFO: | |
164 level = NGX_LOG_INFO; | |
165 break; | |
166 case NGX_ERROR_ERR: | |
167 level = NGX_LOG_ERR; | |
168 break; | |
169 default: | |
170 level = NGX_LOG_CRIT; | |
171 } | |
172 | |
173 } else { | |
174 level = NGX_LOG_CRIT; | |
175 } | |
176 | |
177 ngx_log_error(level, rev->log, err, "recv() failed"); | |
178 | |
179 return NGX_ERROR; | |
180 } |