comparison src/os/unix/ngx_recv.c @ 91:637625a2acdb

nginx-0.0.1-2003-05-19-20:39:14 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 19 May 2003 16:39:14 +0000
parents
children 738fe44c70d5
comparison
equal deleted inserted replaced
90:37530da31268 91:637625a2acdb
1
2 #include <ngx_config.h>
3 #include <ngx_core.h>
4 #include <ngx_errno.h>
5 #include <ngx_log.h>
6 #include <ngx_recv.h>
7 #include <ngx_connection.h>
8
9
10 ssize_t ngx_unix_recv(ngx_connection_t *c, char *buf, size_t size)
11 {
12 ssize_t n;
13 ngx_err_t err;
14 ngx_event_t *ev;
15
16 ev = c->read;
17
18 #if (HAVE_KQUEUE) /* DEBUG */
19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
20 ngx_log_debug(c->log, "ngx_recv: eof:%d, avail:%d, err:%d" _
21 ev->eof _ ev->available _ ev->error);
22 }
23 #endif
24
25 #if (HAVE_KQUEUE)
26
27 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)
28 && ev->eof && ev->available == 0) {
29
30 if (ev->error == 0) {
31 return 0;
32 }
33
34 ngx_set_socket_errno(ev->error);
35 err = ev->error;
36 n = -1;
37
38 } else {
39 n = recv(c->fd, buf, size, 0);
40
41 ngx_log_debug(c->log, "ngx_recv: read:%d:%d" _ n _ size);
42
43 if (n == -1) {
44 err = ngx_socket_errno;
45 }
46 }
47
48 #else /* not kqueue */
49
50 n = recv(c->fd, buf, size, 0);
51
52 if (n == -1) {
53 err = ngx_socket_errno;
54 }
55
56 #endif
57
58 if (n == -1) {
59 ev->ready = 0;
60
61 if (err == NGX_ECONNRESET && ev->ignore_econnreset) {
62 return 0;
63 }
64
65 if (err == NGX_EAGAIN) {
66 ngx_log_error(NGX_LOG_INFO, c->log, err, "recv() returned EAGAIN");
67 return NGX_AGAIN;
68 }
69
70 ngx_log_error(NGX_LOG_ERR, c->log, err, "recv() failed");
71 return NGX_ERROR;
72 }
73
74 #if (HAVE_KQUEUE)
75
76 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
77 ev->available -= n;
78 if (ev->available == 0) {
79 ev->ready = 0;
80 }
81
82 return n;
83 }
84
85 #endif
86
87 if ((size_t) n < size) {
88 ev->ready = 0;
89 }
90
91 return n;
92 }