comparison src/core/ngx_connection.c @ 10:46833bd150cb NGINX_0_1_5

nginx 0.1.5 *) 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 <http://sysoev.ru>
date Thu, 11 Nov 2004 00:00:00 +0300
parents cc9f381affaa
children 74b1868dd3cd
comparison
equal deleted inserted replaced
9:77eee314ddbd 10:46833bd150cb
28 28
29 if (!(addr_in = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)))) { 29 if (!(addr_in = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)))) {
30 return NULL; 30 return NULL;
31 } 31 }
32 32
33 #if (HAVE_SIN_LEN)
34 addr_in->sin_len = sizeof(struct sockaddr_in);
35 #endif
36 addr_in->sin_family = AF_INET; 33 addr_in->sin_family = AF_INET;
37 addr_in->sin_addr.s_addr = addr; 34 addr_in->sin_addr.s_addr = addr;
38 addr_in->sin_port = htons(port); 35 addr_in->sin_port = htons(port);
39 36
40 if (!(ls->addr_text.data = ngx_palloc(cf->pool, INET_ADDRSTRLEN + 6))) { 37
38 ls->addr_text.data = ngx_palloc(cf->pool,
39 INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
40 if (ls->addr_text.data == NULL) {
41 return NULL; 41 return NULL;
42 } 42 }
43 43
44 len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN); 44 len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN);
45 ls->addr_text.len = ngx_snprintf((char *) ls->addr_text.data + len, 45
46 6, ":%d", port); 46 ls->addr_text.len = ngx_sprintf(ls->addr_text.data + len, ":%d", port)
47 - ls->addr_text.data;
48
47 49
48 ls->fd = (ngx_socket_t) -1; 50 ls->fd = (ngx_socket_t) -1;
49 ls->family = AF_INET; 51 ls->family = AF_INET;
50 ls->type = SOCK_STREAM; 52 ls->type = SOCK_STREAM;
51 ls->protocol = IPPROTO_IP; 53 ls->protocol = IPPROTO_IP;
52 #if (WIN32)
53 ls->flags = WSA_FLAG_OVERLAPPED;
54 #endif
55 ls->sockaddr = (struct sockaddr *) addr_in; 54 ls->sockaddr = (struct sockaddr *) addr_in;
56 ls->socklen = sizeof(struct sockaddr_in); 55 ls->socklen = sizeof(struct sockaddr_in);
57 ls->addr = offsetof(struct sockaddr_in, sin_addr); 56 ls->addr = offsetof(struct sockaddr_in, sin_addr);
58 ls->addr_text_max_len = INET_ADDRSTRLEN; 57 ls->addr_text_max_len = INET_ADDRSTRLEN;
59 58
61 } 60 }
62 61
63 62
64 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle) 63 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle)
65 { 64 {
65 size_t len;
66 ngx_uint_t i; 66 ngx_uint_t i;
67 ngx_listening_t *ls; 67 ngx_listening_t *ls;
68 struct sockaddr_in *addr_in; 68 struct sockaddr_in *addr_in;
69 69
70 ls = cycle->listening.elts; 70 ls = cycle->listening.elts;
93 "the inherited socket #%d has " 93 "the inherited socket #%d has "
94 "unsupported family", ls[i].fd); 94 "unsupported family", ls[i].fd);
95 ls[i].ignore = 1; 95 ls[i].ignore = 1;
96 continue; 96 continue;
97 } 97 }
98
98 ls[i].addr_text_max_len = INET_ADDRSTRLEN; 99 ls[i].addr_text_max_len = INET_ADDRSTRLEN;
99 100
100 ls[i].addr_text.data = ngx_palloc(cycle->pool, ls[i].addr_text_max_len); 101
102 ls[i].addr_text.data = ngx_palloc(cycle->pool, INET_ADDRSTRLEN - 1
103 + sizeof(":65535") - 1);
101 if (ls[i].addr_text.data == NULL) { 104 if (ls[i].addr_text.data == NULL) {
102 return NGX_ERROR; 105 return NGX_ERROR;
103 } 106 }
104 107
105 ls[i].family = addr_in->sin_family; 108 ls[i].family = addr_in->sin_family;
106 ls[i].addr_text.len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr, 109 len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr,
107 ls[i].addr_text.data, 110 ls[i].addr_text.data, INET_ADDRSTRLEN);
108 ls[i].addr_text_max_len); 111 if (len == 0) {
109 if (ls[i].addr_text.len == 0) {
110 return NGX_ERROR; 112 return NGX_ERROR;
111 } 113 }
114
115 ls[i].addr_text.len = ngx_sprintf(ls[i].addr_text.data + len, ":%d",
116 ntohs(addr_in->sin_port))
117 - ls[i].addr_text.data;
112 } 118 }
113 119
114 return NGX_OK; 120 return NGX_OK;
115 } 121 }
116 122
155 /* TODO: deferred accept */ 161 /* TODO: deferred accept */
156 162
157 continue; 163 continue;
158 } 164 }
159 165
160 s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol, 166 s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol);
161 ls[i].flags);
162 167
163 if (s == -1) { 168 if (s == -1) {
164 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 169 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
165 ngx_socket_n " %s failed", ls[i].addr_text.data); 170 ngx_socket_n " %V failed", &ls[i].addr_text);
166 return NGX_ERROR; 171 return NGX_ERROR;
167 } 172 }
168 173
169 #if (WIN32) 174 #if (NGX_WIN32)
170 /* 175 /*
171 * Winsock assignes a socket number divisible by 4 176 * Winsock assignes a socket number divisible by 4
172 * so to find a connection we divide a socket number by 4. 177 * so to find a connection we divide a socket number by 4.
173 */ 178 */
174 179
180 #endif 185 #endif
181 186
182 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 187 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
183 (const void *) &reuseaddr, sizeof(int)) == -1) { 188 (const void *) &reuseaddr, sizeof(int)) == -1) {
184 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 189 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
185 "setsockopt(SO_REUSEADDR) %s failed", 190 "setsockopt(SO_REUSEADDR) %V failed",
186 ls[i].addr_text.data); 191 &ls[i].addr_text);
187 return NGX_ERROR; 192 return NGX_ERROR;
188 } 193 }
189 194
190 /* TODO: close on exit */ 195 /* TODO: close on exit */
191 196
192 if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) { 197 if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {
193 if (ngx_nonblocking(s) == -1) { 198 if (ngx_nonblocking(s) == -1) {
194 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 199 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
195 ngx_nonblocking_n " %s failed", 200 ngx_nonblocking_n " %V failed",
196 ls[i].addr_text.data); 201 &ls[i].addr_text);
197 return NGX_ERROR; 202 return NGX_ERROR;
198 } 203 }
199 } 204 }
200 205
201 #if 0 206 #if 0
202 if (ls[i].nonblocking) { 207 if (ls[i].nonblocking) {
203 if (ngx_nonblocking(s) == -1) { 208 if (ngx_nonblocking(s) == -1) {
204 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 209 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
205 ngx_nonblocking_n " %s failed", 210 ngx_nonblocking_n " %V failed",
206 ls[i].addr_text.data); 211 &ls[i].addr_text);
207 return NGX_ERROR; 212 return NGX_ERROR;
208 } 213 }
209 } 214 }
210 #endif 215 #endif
211 216
212 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { 217 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {
213 err = ngx_socket_errno; 218 err = ngx_socket_errno;
214 ngx_log_error(NGX_LOG_EMERG, log, err, 219 ngx_log_error(NGX_LOG_EMERG, log, err,
215 "bind() to %s failed", ls[i].addr_text.data); 220 "bind() to %V failed", &ls[i].addr_text);
216 221
217 if (err != NGX_EADDRINUSE) 222 if (err != NGX_EADDRINUSE)
218 return NGX_ERROR; 223 return NGX_ERROR;
219 224
220 if (ngx_close_socket(s) == -1) 225 if (ngx_close_socket(s) == -1)
221 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 226 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
222 ngx_close_socket_n " %s failed", 227 ngx_close_socket_n " %V failed",
223 ls[i].addr_text.data); 228 &ls[i].addr_text);
224 229
225 failed = 1; 230 failed = 1;
226 continue; 231 continue;
227 } 232 }
228 233
229 if (listen(s, ls[i].backlog) == -1) { 234 if (listen(s, ls[i].backlog) == -1) {
230 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, 235 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
231 "listen() to %s failed", ls[i].addr_text.data); 236 "listen() to %V failed", &ls[i].addr_text);
232 return NGX_ERROR; 237 return NGX_ERROR;
233 } 238 }
234 239
235 /* TODO: deferred accept */ 240 /* TODO: deferred accept */
236 241
271 276
272 ls = cycle->listening.elts; 277 ls = cycle->listening.elts;
273 for (i = 0; i < cycle->listening.nelts; i++) { 278 for (i = 0; i < cycle->listening.nelts; i++) {
274 fd = ls[i].fd; 279 fd = ls[i].fd;
275 280
276 #if (WIN32) 281 #if (NGX_WIN32)
277 /* 282 /*
278 * Winsock assignes a socket number divisible by 4 283 * Winsock assignes a socket number divisible by 4
279 * so to find a connection we divide a socket number by 4. 284 * so to find a connection we divide a socket number by 4.
280 */ 285 */
281 286
294 } 299 }
295 } 300 }
296 301
297 if (ngx_close_socket(ls[i].fd) == -1) { 302 if (ngx_close_socket(ls[i].fd) == -1) {
298 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, 303 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
299 ngx_close_socket_n " %s failed", 304 ngx_close_socket_n " %V failed", &ls[i].addr_text);
300 ls[i].addr_text.data);
301 } 305 }
302 306
303 cycle->connections[fd].fd = (ngx_socket_t) -1; 307 cycle->connections[fd].fd = (ngx_socket_t) -1;
304 } 308 }
305 } 309 }
406 { 410 {
407 return 0; 411 return 0;
408 } 412 }
409 413
410 if (err == NGX_ECONNRESET 414 if (err == NGX_ECONNRESET
411 #if !(WIN32) 415 #if !(NGX_WIN32)
412 || err == NGX_EPIPE 416 || err == NGX_EPIPE
413 #endif 417 #endif
414 || err == NGX_ENOTCONN 418 || err == NGX_ENOTCONN
415 || err == NGX_ECONNREFUSED 419 || err == NGX_ECONNREFUSED
416 || err == NGX_EHOSTUNREACH) 420 || err == NGX_EHOSTUNREACH)