view 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
line wrap: on
line source


#include <ngx_config.h>

#include <ngx_core.h>
#include <ngx_errno.h>
#include <ngx_log.h>
#include <ngx_connection.h>
#include <ngx_event.h>


ssize_t ngx_event_wsarecv(ngx_connection_t *c, char *buf, size_t size)
{
    int           rc;
    u_int         flags;
    size_t        bytes;
    ngx_err_t     err;
    WSABUF        wsabuf[1];
    ngx_event_t  *ev;
    LPWSAOVERLAPPED_COMPLETION_ROUTINE  handler;

    ev = c->read;

/* DEBUG */ bytes = 0;

    if (ev->timedout) {
        ngx_set_socket_errno(NGX_ETIMEDOUT);
        ngx_log_error(NGX_LOG_ERR, ev->log, 0, "WSARecv() timed out");

        return NGX_ERROR;
    }

    if (ev->ready) {
        ev->ready = 0;

#if (HAVE_IOCP_EVENT) /* iocp */

        if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
            if (ev->ovlp.error) {
                ngx_log_error(NGX_LOG_ERR, c->log, ev->ovlp.error,
                              "WSARecv() failed");
                return NGX_ERROR;
            }

            return ev->available;
        }

#endif

        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &ev->ovlp,
                                   &bytes, 0, NULL) == 0) {
            err = ngx_socket_errno;
            ngx_log_error(NGX_LOG_CRIT, ev->log, err,
                         "WSARecv() or WSAGetOverlappedResult() failed");

            return NGX_ERROR;
        }

        return bytes;
    }

    ngx_memzero(&ev->ovlp, sizeof(WSAOVERLAPPED));
    wsabuf[0].buf = buf;
    wsabuf[0].len = size;
    flags = 0;

#if 0
    handler = ev->handler;
#else
    handler = NULL;
#endif

    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags,
                 (LPWSAOVERLAPPED) &ev->ovlp, handler);

    ngx_log_debug(ev->log, "WSARecv: %d:%d" _ rc _ bytes);

    if (rc == -1) {
        err = ngx_socket_errno;
        if (err == WSA_IO_PENDING) {
            return NGX_AGAIN;

        } else {
            ngx_log_error(NGX_LOG_CRIT, ev->log, err, "WSARecv() failed");
            return NGX_ERROR;
        }
    }

#if (HAVE_IOCP_EVENT) /* iocp */

    if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
        return NGX_AGAIN;
    }

#endif

    return bytes;
}