3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
10 #include <ngx_event.h>
16 ngx_unix_recv(ngx_connection_t
*c
, u_char
*buf
, size_t size
)
24 if (ngx_event_flags
& NGX_USE_KQUEUE_EVENT
) {
25 ngx_log_debug3(NGX_LOG_DEBUG_EVENT
, c
->log
, 0,
26 "recv: eof:%d, avail:%d, err:%d",
27 rev
->pending_eof
, rev
->available
, rev
->kq_errno
);
29 if (rev
->available
== 0) {
30 if (rev
->pending_eof
) {
36 ngx_set_socket_errno(rev
->kq_errno
);
38 return ngx_connection_error(c
, rev
->kq_errno
,
39 "kevent() reported about an closed connection");
52 n
= recv(c
->fd
, buf
, size
, 0);
54 ngx_log_debug3(NGX_LOG_DEBUG_EVENT
, c
->log
, 0,
55 "recv: fd:%d %d of %d", c
->fd
, n
, size
);
58 if (ngx_event_flags
& NGX_USE_KQUEUE_EVENT
) {
62 * rev->available may be negative here because some additional
63 * bytes may be received between kevent() and recv()
66 if (rev
->available
<= 0) {
67 if (!rev
->pending_eof
) {
71 if (rev
->available
< 0) {
79 * on FreeBSD recv() may return 0 on closed socket
80 * even if kqueue reported about available data
90 if ((size_t) n
< size
) {
101 err
= ngx_socket_errno
;
103 if (err
== NGX_EAGAIN
|| err
== NGX_EINTR
) {
104 ngx_log_debug0(NGX_LOG_DEBUG_EVENT
, c
->log
, err
,
109 n
= ngx_connection_error(c
, err
, "recv() failed");
113 } while (err
== NGX_EINTR
);
117 if (n
== NGX_ERROR
) {
124 #else /* ! NGX_HAVE_KQUEUE */
127 ngx_unix_recv(ngx_connection_t
*c
, u_char
*buf
, size_t size
)
136 n
= recv(c
->fd
, buf
, size
, 0);
138 ngx_log_debug3(NGX_LOG_DEBUG_EVENT
, c
->log
, 0,
139 "recv: fd:%d %d of %d", c
->fd
, n
, size
);
148 if ((size_t) n
< size
149 && !(ngx_event_flags
& NGX_USE_GREEDY_EVENT
))
157 err
= ngx_socket_errno
;
159 if (err
== NGX_EAGAIN
|| err
== NGX_EINTR
) {
160 ngx_log_debug0(NGX_LOG_DEBUG_EVENT
, c
->log
, err
,
165 n
= ngx_connection_error(c
, err
, "recv() failed");
169 } while (err
== NGX_EINTR
);
173 if (n
== NGX_ERROR
) {
180 #endif /* NGX_HAVE_KQUEUE */