blob: b97f97da48e93954efa02c79b03c33e581dec604 [file] [log] [blame]
Igor Sysoev73009772003-02-06 17:21:13 +00001
2#include <ngx_config.h>
3
4#include <ngx_core.h>
5#include <ngx_errno.h>
6#include <ngx_log.h>
7#include <ngx_connection.h>
8#include <ngx_event.h>
9
10
11ssize_t ngx_event_wsarecv(ngx_connection_t *c, char *buf, size_t size)
12{
13 int rc;
14 u_int flags;
15 size_t bytes;
16 ngx_err_t err;
17 WSABUF wsabuf[1];
18 ngx_event_t *ev;
19 LPWSAOVERLAPPED_COMPLETION_ROUTINE handler;
20
21 ev = c->read;
22
23/* DEBUG */ bytes = 0;
24
25 if (ev->timedout) {
26 ngx_set_socket_errno(NGX_ETIMEDOUT);
27 ngx_log_error(NGX_LOG_ERR, ev->log, 0, "WSARecv() timed out");
28
29 return NGX_ERROR;
30 }
31
32 if (ev->ready) {
33 ev->ready = 0;
34
Igor Sysoeva8fa0a62003-11-25 20:44:56 +000035#if (HAVE_IOCP) /* iocp */
Igor Sysoev73009772003-02-06 17:21:13 +000036
37 if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
38 if (ev->ovlp.error) {
39 ngx_log_error(NGX_LOG_ERR, c->log, ev->ovlp.error,
40 "WSARecv() failed");
41 return NGX_ERROR;
42 }
43
44 return ev->available;
45 }
46
47#endif
48
49 if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &ev->ovlp,
50 &bytes, 0, NULL) == 0) {
51 err = ngx_socket_errno;
52 ngx_log_error(NGX_LOG_CRIT, ev->log, err,
53 "WSARecv() or WSAGetOverlappedResult() failed");
54
55 return NGX_ERROR;
56 }
57
58 return bytes;
59 }
60
61 ngx_memzero(&ev->ovlp, sizeof(WSAOVERLAPPED));
62 wsabuf[0].buf = buf;
63 wsabuf[0].len = size;
64 flags = 0;
65
66#if 0
67 handler = ev->handler;
68#else
69 handler = NULL;
70#endif
71
72 rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags,
73 (LPWSAOVERLAPPED) &ev->ovlp, handler);
74
75 ngx_log_debug(ev->log, "WSARecv: %d:%d" _ rc _ bytes);
76
77 if (rc == -1) {
78 err = ngx_socket_errno;
79 if (err == WSA_IO_PENDING) {
80 return NGX_AGAIN;
81
82 } else {
83 ngx_log_error(NGX_LOG_CRIT, ev->log, err, "WSARecv() failed");
84 return NGX_ERROR;
85 }
86 }
87
Igor Sysoeva8fa0a62003-11-25 20:44:56 +000088#if (HAVE_IOCP) /* iocp */
Igor Sysoev73009772003-02-06 17:21:13 +000089
90 if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
91 return NGX_AGAIN;
92 }
93
94#endif
95
96 return bytes;
97}