comparison src/event/ngx_event_wsarecv.c @ 59:e8cdc2989cee

nginx-0.0.1-2003-02-06-20:21:13 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 06 Feb 2003 17:21:13 +0000
parents
children 8dee38ea9117
comparison
equal deleted inserted replaced
58:6b13b1cadabe 59:e8cdc2989cee
1
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
11 ssize_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
35 #if (HAVE_IOCP_EVENT) /* iocp */
36
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
88 #if (HAVE_IOCP_EVENT) /* iocp */
89
90 if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
91 return NGX_AGAIN;
92 }
93
94 #endif
95
96 return bytes;
97 }