diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2003-11-16 21:49:42 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2003-11-16 21:49:42 +0000 |
| commit | f2e676aa1585de170b39cf3e9d71b88db47e4b1b (patch) | |
| tree | 3553b3481de51b2321b201ae34024f178af894c1 /src/os/win32/ngx_wsarecv_chain.c | |
| parent | 297c0487518d4b974a548dfd3d5d2f10c250177c (diff) | |
| download | nginx-f2e676aa1585de170b39cf3e9d71b88db47e4b1b.tar.gz nginx-f2e676aa1585de170b39cf3e9d71b88db47e4b1b.tar.bz2 | |
nginx-0.0.1-2003-11-17-00:49:42 import
Diffstat (limited to '')
| -rw-r--r-- | src/os/win32/ngx_wsarecv_chain.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/os/win32/ngx_wsarecv_chain.c b/src/os/win32/ngx_wsarecv_chain.c new file mode 100644 index 000000000..edc4421dd --- /dev/null +++ b/src/os/win32/ngx_wsarecv_chain.c @@ -0,0 +1,72 @@ + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_event.h> + + +ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain) +{ + int rc; + char *prev; + u_int flags; + size_t bytes, size; + WSABUF *wsabuf; + ngx_err_t err; + ngx_array_t io; + ngx_event_t *rev; + + prev = NULL; + wsabuf = NULL; + flags = 0; + size = 0; + bytes = 0; + + ngx_init_array(io, c->pool, 10, sizeof(WSABUF), NGX_ERROR); + + /* coalesce the neighbouring hunks */ + + while (chain) { + if (prev == chain->hunk->last) { + wsabuf->len += chain->hunk->end - chain->hunk->last; + + } else { + ngx_test_null(wsabuf, ngx_push_array(&io), NGX_ERROR); + wsabuf->buf = chain->hunk->last; + wsabuf->len = chain->hunk->end - chain->hunk->last; + } + + size += chain->hunk->end - chain->hunk->last; + prev = chain->hunk->end; + chain = chain->next; + } + +ngx_log_debug(c->log, "WSARecv: %d:%d" _ io.nelts _ wsabuf->len); + + rc = WSARecv(c->fd, io.elts, io.nelts, &bytes, &flags, NULL, NULL); + + rev = c->read; + + if (rc == -1) { + rev->ready = 0; + err = ngx_socket_errno; + + if (err == WSAEWOULDBLOCK) { + ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN"); + return NGX_AGAIN; + } + + rev->error = 1; + ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed"); + return NGX_ERROR; + } + + if (bytes < size) { + rev->ready = 0; + } + + if (bytes == 0) { + rev->eof = 1; + } + + return bytes; +} |
