summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_recv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_recv.c')
-rw-r--r--src/event/ngx_event_recv.c130
1 files changed, 88 insertions, 42 deletions
diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c
index 46c165af1..c083e8f61 100644
--- a/src/event/ngx_event_recv.c
+++ b/src/event/ngx_event_recv.c
@@ -8,18 +8,13 @@
ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
{
- int n;
- ngx_err_t err;
- ngx_event_t *ev;
+ ssize_t n;
+ ngx_err_t err;
+ ngx_event_t *ev;
ev = c->read;
- if (ev->timedout) {
- ngx_set_socket_errno(NGX_ETIMEDOUT);
- ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "recv() failed");
- return NGX_ERROR;
- }
-
+/* DEBUG */
#if (HAVE_KQUEUE)
if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _
@@ -30,54 +25,77 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
#if (USE_KQUEUE)
if (ev->eof && ev->available == 0) {
- if (ev->error) {
- ngx_set_socket_errno(ev->error);
- if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) {
- return 0;
- }
+ if (ev->error == 0) {
+ return 0;
+ }
+
+ ngx_set_socket_errno(ev->error);
+ err = ev->error;
+ n = -1;
+
+ } else {
+ n = ngx_recv(c->fd, buf, size, 0);
+
+ if (n == -1) {
+ err = ngx_socket_errno;
+ }
+ }
+
+ if (n == -1) {
+ ev->ready = 0;
- ngx_log_error(NGX_LOG_ERR, c->log, ev->error,
- "recv() failed");
- return NGX_ERROR;
+ if (err == NGX_ECONNRESET && ev->ignore_econnreset) {
+ return 0;
}
- return 0;
+ if (err == NGX_EAGAIN) {
+ ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN");
+ return NGX_AGAIN;
+ }
+
+ ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed");
+ return NGX_ERROR;
}
-#elif (HAVE_KQUEUE)
+ ev->available -= n;
+ if (ev->available == 0) {
+ ev->ready = 0;
+ }
- if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
- if (ev->eof && ev->available == 0) {
- if (ev->error) {
- ngx_set_socket_errno(ev->error);
+ return n;
- if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) {
- return 0;
- }
+#elif (HAVE_KQUEUE)
- ngx_log_error(NGX_LOG_ERR, c->log, ev->error,
- "recv() failed");
- return NGX_ERROR;
- }
+ if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)
+ && ev->eof && ev->available == 0) {
+ if (ev->error == 0) {
return 0;
}
- }
-#endif
+ ngx_set_socket_errno(ev->error);
+ err = ev->error;
+ n = -1;
- n = ngx_recv(c->fd, buf, size, 0);
+ } else {
+ n = ngx_recv(c->fd, buf, size, 0);
+ngx_log_debug(c->log, "ngx_event_recv: read:%d:%d" _ n _ size);
+
+ if (n == -1) {
+ err = ngx_socket_errno;
+ }
+ }
if (n == -1) {
- err = ngx_socket_errno;
+ ev->ready = 0;
- if (ev->error == NGX_ECONNRESET && ev->ignore_econnreset) {
+ if (err == NGX_ECONNRESET && ev->ignore_econnreset) {
return 0;
}
if (err == NGX_EAGAIN) {
- ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returns EAGAIN");
+ ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN");
return NGX_AGAIN;
}
@@ -85,17 +103,45 @@ ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
return NGX_ERROR;
}
-#if (USE_KQUEUE)
+ if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
+ ev->available -= n;
+ if (ev->available == 0) {
+ ev->ready = 0;
+ }
- ev->available -= n;
+ } else if ((size_t) n < size) {
+ ev->ready = 0;
+ }
-#elif (HAVE_KQUEUE)
+ return n;
- if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
- ev->available -= n;
+#else /* not kqueue */
+
+ n = ngx_recv(c->fd, buf, size, 0);
+
+ if (n == -1) {
+ err = ngx_socket_errno;
+
+ ev->ready = 0;
+
+ if (err == NGX_ECONNRESET && ev->ignore_econnreset) {
+ return 0;
+ }
+
+ if (err == NGX_EAGAIN) {
+ ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN");
+ return NGX_AGAIN;
+ }
+
+ ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed");
+ return NGX_ERROR;
}
-#endif
+ if ((size_t) n < size) {
+ ev->ready = 0;
+ }
return n;
+
+#endif
}