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 }