summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_recv.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/event/ngx_event_recv.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c
index 4b01a4c68..4fa95c3ae 100644
--- a/src/event/ngx_event_recv.c
+++ b/src/event/ngx_event_recv.c
@@ -6,7 +6,7 @@
#include <ngx_recv.h>
#include <ngx_connection.h>
-int ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
+ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
{
int n;
ngx_err_t err;
@@ -20,9 +20,23 @@ int ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
#if (HAVE_KQUEUE)
ngx_log_debug(c->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _
c->read->eof _ c->read->available _ c->read->error);
-#if !(USE_KQUEUE)
- if (ngx_event_type == NGX_KQUEUE_EVENT)
#endif
+
+#if (USE_KQUEUE)
+
+ if (c->read->eof && c->read->available == 0) {
+ if (c->read->error) {
+ ngx_log_error(NGX_LOG_ERR, c->log, c->read->error,
+ "recv() failed");
+ return NGX_ERROR;
+ }
+
+ return 0;
+ }
+
+#elif (HAVE_KQUEUE)
+
+ if (ngx_event_type == NGX_KQUEUE_EVENT) {
if (c->read->eof && c->read->available == 0) {
if (c->read->error) {
ngx_log_error(NGX_LOG_ERR, c->log, c->read->error,
@@ -32,6 +46,8 @@ int ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
return 0;
}
+ }
+
#endif
n = ngx_recv(c->fd, buf, size, 0);
@@ -48,11 +64,16 @@ int ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size)
return NGX_ERROR;
}
-#if (HAVE_KQUEUE)
-#if !(USE_KQUEUE)
- if (ngx_event_type == NGX_KQUEUE_EVENT)
-#endif
+#if (USE_KQUEUE)
+
+ c->read->available -= n;
+
+#elif (HAVE_KQUEUE)
+
+ if (ngx_event_type == NGX_KQUEUE_EVENT) {
c->read->available -= n;
+ }
+
#endif
return n;