comparison src/os/win32/ngx_wsarecv.c @ 184:1bf718ce0dde

nginx-0.0.1-2003-11-14-10:20:34 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 14 Nov 2003 07:20:34 +0000
parents ef8c87afcfc5
children 0ba4821f4460
comparison
equal deleted inserted replaced
183:4c698194c56d 184:1bf718ce0dde
1 1
2 #include <ngx_config.h> 2 #include <ngx_config.h>
3 #include <ngx_core.h> 3 #include <ngx_core.h>
4 #include <ngx_event.h> 4 #include <ngx_event.h>
5 5
6
7 ssize_t ngx_wsarecv(ngx_connection_t *c, char *buf, size_t size)
8 {
9 int rc;
10 u_int flags;
11 size_t bytes;
12 WSABUF wsabuf[1];
13 ngx_err_t err;
14 ngx_event_t *rev;
15
16 wsabuf[0].buf = buf;
17 wsabuf[0].len = size;
18 flags = 0;
19 bytes = 0;
20
21 rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);
22
23 ngx_log_debug(c->log, "WSARecv: %d:%d" _ rc _ bytes);
24
25 rev = c->read;
26
27 if (rc == -1) {
28 rev->ready = 0;
29 err = ngx_socket_errno;
30
31 if (err == WSAEWOULDBLOCK) {
32 ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN");
33 return NGX_AGAIN;
34 }
35
36 rev->error = 1;
37 ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed");
38 return NGX_ERROR;
39 }
40
41 if (bytes < size) {
42 rev->ready = 0;
43 }
44
45 if (bytes == 0) {
46 rev->eof = 1;
47 }
48
49 return bytes;
50 }
51
52
53 ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, char *buf, size_t size)
54 {
55 int rc;
56 u_int flags;
57 size_t bytes;
58 WSABUF wsabuf[1];
59 ngx_err_t err;
60 ngx_event_t *rev;
61 LPWSAOVERLAPPED ovlp;
62
63 rev = c->read;
64
65 if (!rev->ready) {
66 ngx_log_error(NGX_LOG_ALERT, rev->log, 0, "SECOND WSA POST");
67 return NGX_AGAIN;
68 }
69
70 ngx_log_debug(c->log, "rev->complete: %d" _ rev->complete);
71
72 if (rev->complete) {
73 rev->complete = 0;
74
75 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
76 if (rev->ovlp.error) {
77 ngx_log_error(NGX_LOG_ERR, c->log, rev->ovlp.error,
78 "WSARecv() failed");
79 return NGX_ERROR;
80 }
81
82 return rev->available;
83 }
84
85 if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,
86 &bytes, 0, NULL) == 0) {
87 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
88 "WSARecv() or WSAGetOverlappedResult() failed");
89
90 return NGX_ERROR;
91 }
92
93 return bytes;
94 }
95
96 ovlp = (LPWSAOVERLAPPED) &rev->ovlp;
97 ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));
98 wsabuf[0].buf = buf;
99 wsabuf[0].len = size;
100 flags = 0;
101 bytes = 0;
102
103 rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);
104
105 rev->complete = 0;
106
107 ngx_log_debug(c->log, "WSARecv: %d:%d" _ rc _ bytes);
108
109 if (rc == -1) {
110 err = ngx_socket_errno;
111 if (err == WSA_IO_PENDING) {
112 rev->active = 1;
113 return NGX_AGAIN;
114 }
115
116 rev->error = 1;
117 ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed");
118 return NGX_ERROR;
119 }
120
121 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
122
123 /*
124 * if a socket was bound with I/O completion port
125 * then GetQueuedCompletionStatus() would anyway return its status
126 * despite that WSARecv() was already complete
127 */
128
129 rev->active = 1;
130 return NGX_AGAIN;
131 }
132
133 if (bytes == 0) {
134 rev->eof = 1;
135 rev->ready = 0;
136
137 } else {
138 rev->ready = 1;
139 }
140
141 rev->active = 0;
142
143 return bytes;
144 }
145
146 #if 0
147
148 /* DELELTE IT WHEN ABOVE FUNC WOULD BE TESTED */
6 149
7 ssize_t ngx_wsarecv(ngx_connection_t *c, char *buf, size_t size) 150 ssize_t ngx_wsarecv(ngx_connection_t *c, char *buf, size_t size)
8 { 151 {
9 int rc; 152 int rc;
10 u_int flags; 153 u_int flags;
86 return NGX_AGAIN; 229 return NGX_AGAIN;
87 } 230 }
88 231
89 return bytes; 232 return bytes;
90 } 233 }
234
235 #endif