src/os/win32/ngx_wsarecv.c - nginx-1.31.9 nginx/ @ 2a3a19c6f

Functions defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>
  7. #include <ngx_event.h>


  8. ssize_t
  9. ‌ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)
  10. {
  11.     int           rc;
  12.     u_long        bytes, flags;
  13.     WSABUF        wsabuf[1];
  14.     ngx_err_t     err;
  15.     ngx_int_t     n;
  16.     ngx_event_t  *rev;

  17.     wsabuf[0].buf = (char *) buf;
  18.     wsabuf[0].len = size;
  19.     flags = 0;
  20.     bytes = 0;

  21.     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);

  22.     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
  23.                    "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);

  24.     rev = c->read;

  25.     if (rc == -1) {
  26.         rev->ready = 0;
  27.         err = ngx_socket_errno;

  28.         if (err == WSAEWOULDBLOCK) {
  29.             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
  30.                            "WSARecv() not ready");
  31.             return NGX_AGAIN;
  32.         }

  33.         n = ngx_connection_error(c, err, "WSARecv() failed");

  34.         if (n == NGX_ERROR) {
  35.             rev->error = 1;
  36.         }

  37.         return n;
  38.     }

  39. #if (NGX_HAVE_FIONREAD)

  40.     if (rev->available >= 0 && bytes > 0) {
  41.         rev->available -= bytes;

  42.         /*
  43.          * negative rev->available means some additional bytes
  44.          * were received between kernel notification and WSARecv(),
  45.          * and therefore ev->ready can be safely reset even for
  46.          * edge-triggered event methods
  47.          */

  48.         if (rev->available < 0) {
  49.             rev->available = 0;
  50.             rev->ready = 0;
  51.         }

  52.         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
  53.                        "WSARecv: avail:%d", rev->available);

  54.     } else if (bytes == size) {

  55.         if (ngx_socket_nread(c->fd, &rev->available) == -1) {
  56.             n = ngx_connection_error(c, ngx_socket_errno,
  57.                                      ngx_socket_nread_n " failed");

  58.             if (n == NGX_ERROR) {
  59.                 rev->ready = 0;
  60.                 rev->error = 1;
  61.             }

  62.             return n;
  63.         }

  64.         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
  65.                        "WSARecv: avail:%d", rev->available);
  66.     }

  67. #endif

  68.     if (bytes < size) {
  69.         rev->ready = 0;
  70.     }

  71.     if (bytes == 0) {
  72.         rev->ready = 0;
  73.         rev->eof = 1;
  74.     }

  75.     return bytes;
  76. }