comparison src/event/ngx_event_acceptex.c @ 461:a88a3e4e158f release-0.1.5

nginx-0.1.5-RELEASE import *) Bugfix: on Solaris and Linux there may be too many "recvmsg() returned not enough data" alerts. *) Bugfix: there were the "writev() failed (22: Invalid argument)" errors on Solaris in proxy mode without sendfile. On other platforms that do not support sendfile at all the process got caught in an endless loop. *) Bugfix: segmentation fault on Solaris in proxy mode and using sendfile. *) Bugfix: segmentation fault on Solaris. *) Bugfix: on-line upgrade did not work on Linux. *) Bugfix: the ngx_http_autoindex_module module did not escape the spaces, the quotes, and the percent signs in the directory listing. *) Change: the decrease of the copy operations. *) Feature: the userid_p3p directive.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 11 Nov 2004 14:07:14 +0000
parents 42d11f017717
children c52408583801
comparison
equal deleted inserted replaced
460:5f8319142dfc 461:a88a3e4e158f
12 12
13 void ngx_event_acceptex(ngx_event_t *rev) 13 void ngx_event_acceptex(ngx_event_t *rev)
14 { 14 {
15 ngx_connection_t *c; 15 ngx_connection_t *c;
16 16
17 c = (ngx_connection_t *) rev->data; 17 c = rev->data;
18
19 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd);
18 20
19 if (rev->ovlp.error) { 21 if (rev->ovlp.error) {
20 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, 22 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,
21 "AcceptEx() %s failed", c->listening->addr_text.data); 23 "AcceptEx() %V failed", &c->listening->addr_text);
22 return; 24 return;
23 } 25 }
24 26
25 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ 27 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */
26 28
27 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, 29 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
28 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) 30 (char *) &c->listening->fd, sizeof(ngx_socket_t)) == -1)
29 { 31 {
30 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, 32 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
31 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", 33 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V",
32 c->addr_text.data); 34 &c->addr_text);
33 } else { 35 } else {
34 c->accept_context_updated = 1; 36 c->accept_context_updated = 1;
35 } 37 }
36 38
37 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size, 39 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size,
45 c->buffer->end = c->buffer->start 47 c->buffer->end = c->buffer->start
46 + c->listening->post_accept_buffer_size; 48 + c->listening->post_accept_buffer_size;
47 49
48 } else { 50 } else {
49 c->buffer = NULL; 51 c->buffer = NULL;
52 }
53
54 if (c->listening->addr_ntop) {
55 c->addr_text.data = ngx_palloc(c->pool,
56 c->listening->addr_text_max_len);
57 if (c->addr_text.data == NULL) {
58 /* TODO: close socket */
59 return;
60 }
61
62 c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr,
63 c->addr_text.data,
64 c->listening->addr_text_max_len);
65 if (c->addr_text.len == 0) {
66 /* TODO: close socket */
67 return;
68 }
50 } 69 }
51 70
52 ngx_event_post_acceptex(c->listening, 1); 71 ngx_event_post_acceptex(c->listening, 1);
53 72
54 c->number = ngx_atomic_inc(ngx_connection_counter); 73 c->number = ngx_atomic_inc(ngx_connection_counter);
71 90
72 for (i = 0; i < n; i++) { 91 for (i = 0; i < n; i++) {
73 92
74 /* TODO: look up reused sockets */ 93 /* TODO: look up reused sockets */
75 94
76 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); 95 s = ngx_socket(ls->family, ls->type, ls->protocol);
77 96
78 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ls->log, 0, 97 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ls->log, 0,
79 ngx_socket_n " s:%d fl:%d", s, ls->flags); 98 ngx_socket_n " s:%d", s);
80 99
81 if (s == -1) { 100 if (s == -1) {
82 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, 101 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno,
83 ngx_socket_n " for AcceptEx() %s post failed", 102 ngx_socket_n " for AcceptEx() %s post failed",
84 ls->addr_text.data); 103 ls->addr_text.data);
105 124
106 ngx_memzero(c, sizeof(ngx_connection_t)); 125 ngx_memzero(c, sizeof(ngx_connection_t));
107 ngx_memzero(rev, sizeof(ngx_event_t)); 126 ngx_memzero(rev, sizeof(ngx_event_t));
108 ngx_memzero(wev, sizeof(ngx_event_t)); 127 ngx_memzero(wev, sizeof(ngx_event_t));
109 128
110 rev->index = wev->index = NGX_INVALID_INDEX; 129 c->listening = ls;
130
131 rev->index = NGX_INVALID_INDEX;
132 wev->index = NGX_INVALID_INDEX;
111 133
112 rev->ovlp.event = rev; 134 rev->ovlp.event = rev;
113 wev->ovlp.event = wev; 135 wev->ovlp.event = wev;
114 136 rev->event_handler = ngx_event_acceptex;
115 rev->data = wev->data = c; 137
138 rev->data = c;
139 wev->data = c;
140
116 c->read = rev; 141 c->read = rev;
117 c->write = wev; 142 c->write = wev;
118 143
119 c->listening = ls;
120 c->fd = s; 144 c->fd = s;
145 c->unexpected_eof = 1;
146
147 rev->ready = 1;
148 wev->write = 1;
149 wev->ready = 1;
121 150
122 c->ctx = ls->ctx; 151 c->ctx = ls->ctx;
123 c->servers = ls->servers; 152 c->servers = ls->servers;
124 153
125 c->unexpected_eof = 1; 154 c->recv = ngx_recv;
126 wev->write = 1; 155 c->send_chain = ngx_send_chain;
127 rev->event_handler = ngx_event_acceptex; 156
128 157 if (!(c->pool = ngx_create_pool(ls->pool_size, ls->log))) {
129 rev->ready = 1; 158 return NGX_ERROR;
130 wev->ready = 1; 159 }
131 160
132 ngx_test_null(c->pool, 161 c->buffer = ngx_create_temp_buf(c->pool,
133 ngx_create_pool(ls->pool_size, ls->log), 162 ls->post_accept_buffer_size
134 NGX_ERROR); 163 + 2 * (c->listening->socklen + 16));
135 164 if (c->buffer == NULL) {
136 ngx_test_null(c->buffer, 165 return NGX_ERROR;
137 ngx_create_temp_buf(c->pool, 166 }
138 ls->post_accept_buffer_size 167
139 + 2 * (c->listening->socklen + 16)), 168 if (!(c->local_sockaddr = ngx_palloc(c->pool, ls->socklen))) {
140 NGX_ERROR); 169 return NGX_ERROR;
141 170 }
142 ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen), 171
143 NGX_ERROR); 172 if (!(c->sockaddr = ngx_palloc(c->pool, ls->socklen))) {
144 173 return NGX_ERROR;
145 ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen), 174 }
146 NGX_ERROR); 175
147 176 if (!(c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)))) {
148 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), 177 return NGX_ERROR;
149 NGX_ERROR); 178 }
150 179
151 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); 180 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t));
152 c->read->log = c->write->log = c->log; 181 c->read->log = c->log;
182 c->write->log = c->log;
153 183
154 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { 184 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {
155 return NGX_ERROR; 185 return NGX_ERROR;
156 } 186 }
157 187