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 }