comparison src/os/unix/ngx_send.c @ 0:f0b350454894 NGINX_0_1_0

nginx 0.1.0 *) The first public version.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Oct 2004 00:00:00 +0400
parents
children 4b2dafa26fe2
comparison
equal deleted inserted replaced
-1:000000000000 0:f0b350454894
1
2 /*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9 #include <ngx_event.h>
10
11
12 ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size)
13 {
14 ssize_t n;
15 ngx_err_t err;
16 ngx_event_t *wev;
17
18 wev = c->write;
19
20 #if (HAVE_KQUEUE)
21
22 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->pending_eof) {
23 ngx_log_error(NGX_LOG_INFO, c->log, wev->kq_errno,
24 "kevent() reported about an closed connection");
25
26 wev->error = 1;
27 return NGX_ERROR;
28 }
29
30 #endif
31
32 for ( ;; ) {
33 n = send(c->fd, buf, size, 0);
34
35 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
36 "send: fd:%d %d of %d", c->fd, n, size);
37
38 if (n > 0) {
39 if (n < (ssize_t) size) {
40 wev->ready = 0;
41 }
42
43 return n;
44 }
45
46 err = ngx_socket_errno;
47
48 if (n == 0) {
49 ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero");
50 wev->ready = 0;
51 return n;
52 }
53
54 if (err == NGX_EAGAIN || err == NGX_EINTR) {
55 wev->ready = 0;
56
57 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
58 "send() not ready");
59
60 if (err == NGX_EAGAIN) {
61 return NGX_AGAIN;
62 }
63
64 } else {
65 wev->error = 1;
66 ngx_connection_error(c, err, "recv() failed");
67 return NGX_ERROR;
68 }
69 }
70 }