comparison src/os/unix/ngx_recv.c @ 163:fb61ba77beba

nginx-0.0.1-2003-10-28-18:45:41 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 28 Oct 2003 15:45:41 +0000
parents 5afee0074707
children 1bf718ce0dde
comparison
equal deleted inserted replaced
162:96993d4d5067 163:fb61ba77beba
16 16
17 rev = c->read; 17 rev = c->read;
18 18
19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { 19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
20 ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _ 20 ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _
21 rev->eof _ rev->available _ rev->error); 21 rev->kq_eof _ rev->available _ rev->kq_errno);
22 22
23 if (rev->available == 0) { 23 if (rev->available == 0) {
24 if (rev->eof) { 24 if (rev->kq_eof) {
25 rev->ready = 0; 25 rev->ready = 0;
26 if (rev->error) { 26 rev->eof = 1;
27 ngx_set_socket_errno(rev->error); 27
28 return ngx_unix_recv_error(rev, rev->error); 28 if (rev->kq_errno) {
29 rev->error = 1;
30 ngx_set_socket_errno(rev->kq_errno);
31 return ngx_unix_recv_error(rev, rev->kq_errno);
29 } 32 }
33
30 return 0; 34 return 0;
31 35
32 } else { 36 } else {
33 return NGX_AGAIN; 37 return NGX_AGAIN;
34 } 38 }
41 ngx_log_debug(c->log, "recv: %d:%d" _ n _ size); 45 ngx_log_debug(c->log, "recv: %d:%d" _ n _ size);
42 46
43 if (n >= 0) { 47 if (n >= 0) {
44 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { 48 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
45 rev->available -= n; 49 rev->available -= n;
50
51 /*
52 * rev->available can be negative here because some additional
53 * bytes can be received between kevent() and recv()
54 */
55
46 if (rev->available <= 0) { 56 if (rev->available <= 0) {
47 if (!rev->eof) { 57 if (!rev->kq_eof) {
48 rev->ready = 0; 58 rev->ready = 0;
49 } 59 }
50 60
51 if (rev->available < 0) { 61 if (rev->available < 0) {
52 rev->available = 0; 62 rev->available = 0;
58 68
59 if ((size_t) n < size) { 69 if ((size_t) n < size) {
60 rev->ready = 0; 70 rev->ready = 0;
61 } 71 }
62 72
73 if (n == 0) {
74 rev->eof = 1;
75 }
76
63 return n; 77 return n;
64 } 78 }
65 79
66 rev->ready = 0; 80 rev->ready = 0;
81 rev->error = 1;
67 n = ngx_unix_recv_error(rev, ngx_socket_errno); 82 n = ngx_unix_recv_error(rev, ngx_socket_errno);
68 83
69 } while (n == NGX_EINTR); 84 } while (n == NGX_EINTR);
70 85
71 return n; 86 return n;
87 102
88 if (n >= 0) { 103 if (n >= 0) {
89 if ((size_t) n < size) { 104 if ((size_t) n < size) {
90 rev->ready = 0; 105 rev->ready = 0;
91 } 106 }
107
108 if (n == 0) {
109 rev->eof = 1;
110 }
111
92 return n; 112 return n;
93 } 113 }
94 114
95 rev->ready = 0; 115 rev->ready = 0;
116 rev->error = 1;
96 n = ngx_unix_recv_error(rev, ngx_socket_errno); 117 n = ngx_unix_recv_error(rev, ngx_socket_errno);
97 118
98 } while (n == NGX_EINTR); 119 } while (n == NGX_EINTR);
99 120
100 return n; 121 return n;