annotate src/os/win32/ngx_wsasend.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents 53eb1e67e432
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 2725
diff changeset
4 * Copyright (C) Nginx, Inc.
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 ssize_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 int n;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 u_long sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 ngx_err_t err;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 ngx_event_t *wev;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 WSABUF wsabuf;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 wev = c->write;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 if (!wev->ready) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 return NGX_AGAIN;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 * WSABUF must be 4-byte aligned otherwise
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 * WSASend() will return undocumented WSAEINVAL error.
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 wsabuf.buf = (char *) buf;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 wsabuf.len = size;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 sent = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 n = WSASend(c->fd, &wsabuf, 1, &sent, 0, NULL, NULL);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 if (sent < size) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 wev->ready = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 c->sent += sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 return sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 err = ngx_socket_errno;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 if (err == WSAEWOULDBLOCK) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, "WSASend() not ready");
5232
53eb1e67e432 Win32: added missing reset of wev->ready on WSAEWOULDBLOCK.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
57 wev->ready = 0;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 return NGX_AGAIN;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 wev->error = 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 ngx_connection_error(c, err, "WSASend() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 return NGX_ERROR;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 ssize_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 int n;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 u_long sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 ngx_err_t err;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_event_t *wev;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 LPWSAOVERLAPPED ovlp;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 WSABUF wsabuf;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 wev = c->write;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 if (!wev->ready) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 return NGX_AGAIN;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 "wev->complete: %d", wev->complete);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 if (!wev->complete) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 /* post the overlapped WSASend() */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 * WSABUFs must be 4-byte aligned otherwise
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 * WSASend() will return undocumented WSAEINVAL error.
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 wsabuf.buf = (char *) buf;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 wsabuf.len = size;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 sent = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 ovlp = (LPWSAOVERLAPPED) &c->write->ovlp;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 n = WSASend(c->fd, &wsabuf, 1, &sent, 0, ovlp, NULL);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 wev->complete = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 * if a socket was bound with I/O completion port then
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 * GetQueuedCompletionStatus() would anyway return its status
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 * despite that WSASend() was already complete
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 wev->active = 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 return NGX_AGAIN;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 if (sent < size) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 wev->ready = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 c->sent += sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 return sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 err = ngx_socket_errno;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 if (err == WSA_IO_PENDING) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 "WSASend() posted");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 wev->active = 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 return NGX_AGAIN;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 wev->error = 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_connection_error(c, err, "WSASend() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 return NGX_ERROR;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 /* the overlapped WSASend() complete */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 wev->complete = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 wev->active = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 if (wev->ovlp.error) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 return NGX_ERROR;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 sent = wev->available;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 &sent, 0, NULL)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 ngx_connection_error(c, ngx_socket_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 "WSASend() or WSAGetOverlappedResult() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 return NGX_ERROR;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 "WSAGetOverlappedResult: fd:%d, %ul of %uz",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 c->fd, sent, size);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 if (sent < size) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 wev->ready = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 c->sent += sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 return sent;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 }