Mercurial > hg > nginx-quic
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 } |