src/os/unix/ngx_send.c - nginx-1.7.10

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_unix_send(ngx_connection_t *c, u_char *buf, size_t size)
  10. {
  11.     ssize_t       n;
  12.     ngx_err_t     err;
  13.     ngx_event_t  *wev;

  14.     wev = c->write;

  15. #if (NGX_HAVE_KQUEUE)

  16.     if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {
  17.         (void) ngx_connection_error(c, wev->kq_errno,
  18.                                "kevent() reported about an closed connection");
  19.         wev->error = 1;
  20.         return NGX_ERROR;
  21.     }

  22. #endif

  23.     for ( ;; ) {
  24.         n = send(c->fd, buf, size, 0);

  25.         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
  26.                        "send: fd:%d %d of %d", c->fd, n, size);

  27.         if (n > 0) {
  28.             if (n < (ssize_t) size) {
  29.                 wev->ready = 0;
  30.             }

  31.             c->sent += n;

  32.             return n;
  33.         }

  34.         err = ngx_socket_errno;

  35.         if (n == 0) {
  36.             ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero");
  37.             wev->ready = 0;
  38.             return n;
  39.         }

  40.         if (err == NGX_EAGAIN || err == NGX_EINTR) {
  41.             wev->ready = 0;

  42.             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
  43.                            "send() not ready");

  44.             if (err == NGX_EAGAIN) {
  45.                 return NGX_AGAIN;
  46.             }

  47.         } else {
  48.             wev->error = 1;
  49.             (void) ngx_connection_error(c, err, "send() failed");
  50.             return NGX_ERROR;
  51.         }
  52.     }
  53. }