comparison src/event/ngx_event_acceptex.c @ 103:6dfda4cf5200

nginx-0.0.1-2003-06-11-19:28:34 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 11 Jun 2003 15:28:34 +0000
parents 7e86d028d8f0
children ac69ab96328d
comparison
equal deleted inserted replaced
102:7e86d028d8f0 103:6dfda4cf5200
1 1
2 #include <ngx_config.h> 2 #include <ngx_config.h>
3 #include <ngx_core.h> 3 #include <ngx_core.h>
4
5 #include <ngx_listen.h>
6
7 #include <ngx_event.h> 4 #include <ngx_event.h>
8 #if 0 5 #include <nginx.h>
9 #include <ngx_event_close.h>
10 #include <ngx_iocp_module.h>
11 #endif
12 6
13 7
14 void ngx_event_acceptex(ngx_event_t *rev) 8 void ngx_event_acceptex(ngx_event_t *rev)
15 { 9 {
16 ngx_connection_t *c; 10 ngx_connection_t *c;
17 11
18 c = (ngx_connection_t *) rev->data; 12 c = (ngx_connection_t *) rev->data;
19 13
20 ngx_log_debug(rev->log, "ADDR: %s" _ c->addr_text.data);
21
22 if (rev->ovlp.error) { 14 if (rev->ovlp.error) {
23 ngx_log_error(NGX_LOG_CRIT, rev->log, rev->ovlp.error, 15 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,
24 "AcceptEx() failed for %s", c->addr_text.data); 16 "AcceptEx() %s failed", c->listening->addr_text.data);
25 return; 17 return;
26 } 18 }
27 19
28 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ 20 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */
29 21
30 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, 22 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
31 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) 23 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1)
32 { 24 {
33 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_socket_errno, 25 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
34 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", 26 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s",
35 c->addr_text.data); 27 c->addr_text.data);
36 } else { 28 } else {
37 accept_context_updated = 1; 29 c->accept_context_updated = 1;
38 } 30 }
39 31
40 getacceptexsockaddrs(c->data, 0, 32 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size,
41 c->socklen + 16, c->socklen + 16, 33 c->listening->socklen + 16,
34 c->listening->socklen + 16,
42 &c->local_sockaddr, &c->local_socklen, 35 &c->local_sockaddr, &c->local_socklen,
43 &c->sockaddr, &c->socklen); 36 &c->sockaddr, &c->socklen);
44 37
38 if (c->listening->post_accept_buffer_size) {
39 c->buffer->last += rev->available;
40 c->buffer->end = c->buffer->start
41 + c->listening->post_accept_buffer_size;
42
43 } else {
44 c->buffer = NULL;
45 }
46
45 ngx_event_post_acceptex(c->listening, 1); 47 ngx_event_post_acceptex(c->listening, 1);
46 48
47 /* STUB: InterlockedInc() */ 49 /* TODO: MT */
48 c->number = ngx_connection_counter++; 50 c->number = ngx_connection_counter++;
49 51
50 c->handler(c); 52 c->listening->handler(c);
51 53
52 return; 54 return;
53 55
54 } 56 }
55 57
56 58
57 int ngx_event_post_acceptex(ngx_listen_t *ls, int n) 59 int ngx_event_post_acceptex(ngx_listening_t *ls, int n)
58 { 60 {
59 int i; 61 int i;
60 u_int rcvd; 62 u_int rcvd;
61 ngx_err_t err; 63 ngx_err_t err;
62 ngx_pool_t *pool;
63 ngx_event_t *rev, *wev; 64 ngx_event_t *rev, *wev;
64 ngx_socket_t s; 65 ngx_socket_t s;
65 ngx_connection_t *c; 66 ngx_connection_t *c;
66 67
67 for (i = 0; i < n; i++) { 68 for (i = 0; i < n; i++) {
68 69
69 /* TODO: look up reused sockets */ 70 /* TODO: look up reused sockets */
70 71
71 ngx_log_debug(ls->log, "socket: %x" _ ls->flags);
72
73 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); 72 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags);
73 ngx_log_debug(ls->log, ngx_socket_n ": %d:%d" _ s _ ls->flags);
74 74
75 if (s == -1) { 75 if (s == -1) {
76 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, 76 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno,
77 ngx_socket_n " for AcceptEx() post failed"); 77 ngx_socket_n " for AcceptEx() %s post failed",
78 ls->addr_text.data);
78 79
79 return NGX_ERROR; 80 return NGX_ERROR;
80 } 81 }
81 82
82 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ls->log), NGX_ERROR); 83 /*
84 * Winsock assignes a socket number divisible by 4
85 * so to find a connection we divide a socket number by 4.
86 */
83 87
84 rev = &ngx_read_events[s]; 88 if (s % 4) {
85 wev = &ngx_write_events[s]; 89 ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
86 c = &ngx_connections[s]; 90 ngx_socket_n " created socket %d", s);
91 exit(1);
92 }
93
94 rev = &ngx_read_events[s / 4];
95 wev = &ngx_write_events[s / 4];
96 c = &ngx_connections[s / 4];
87 97
88 ngx_memzero(rev, sizeof(ngx_event_t)); 98 ngx_memzero(rev, sizeof(ngx_event_t));
89 ngx_memzero(wev, sizeof(ngx_event_t)); 99 ngx_memzero(wev, sizeof(ngx_event_t));
90 ngx_memzero(c, sizeof(ngx_connection_t)); 100 ngx_memzero(c, sizeof(ngx_connection_t));
91
92 c->pool = pool;
93 101
94 rev->index = wev->index = NGX_INVALID_INDEX; 102 rev->index = wev->index = NGX_INVALID_INDEX;
95 103
96 rev->ovlp.event = rev; 104 rev->ovlp.event = rev;
97 wev->ovlp.event = wev; 105 wev->ovlp.event = wev;
98 106
99 rev->data = wev->data = c; 107 rev->data = wev->data = c;
100 c->read = rev; 108 c->read = rev;
101 c->write = wev; 109 c->write = wev;
102 110
103 c->family = ls->family;
104 c->socklen = ls->socklen;
105 c->addr = ls->addr;
106 c->addr_text_max_len = ls->addr_text_max_len;
107 c->post_accept_timeout = ls->post_accept_timeout;
108
109 c->listening = ls; 111 c->listening = ls;
110 c->fd = s; 112 c->fd = s;
111
112 c->unexpected_eof = 1;
113 wev->write = 1;
114
115 c->handler = ls->handler;
116 rev->event_handler = ngx_event_acceptex;
117 113
118 c->ctx = ls->ctx; 114 c->ctx = ls->ctx;
119 c->servers = ls->servers; 115 c->servers = ls->servers;
120 116
121 ngx_test_null(c->data, ngx_palloc(pool, 2 * (c->socklen + 16)), 117 c->unexpected_eof = 1;
118 wev->write = 1;
119 rev->event_handler = ngx_event_acceptex;
120
121 ngx_test_null(c->pool,
122 ngx_create_pool(ls->pool_size, ls->log),
122 NGX_ERROR); 123 NGX_ERROR);
123 ngx_test_null(c->local_sockaddr, ngx_palloc(pool, c->socklen), 124
125 ngx_test_null(c->buffer,
126 ngx_create_temp_hunk(c->pool,
127 ls->post_accept_buffer_size
128 + 2 * (c->listening->socklen + 16),
129 0, 0),
124 NGX_ERROR); 130 NGX_ERROR);
125 ngx_test_null(c->sockaddr, ngx_palloc(pool, c->socklen), 131
132 ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen),
133 NGX_ERROR);
134
135 ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen),
126 NGX_ERROR); 136 NGX_ERROR);
127 137
128 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), 138 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)),
129 NGX_ERROR); 139 NGX_ERROR);
140
130 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); 141 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t));
131 rev->log = wev->log = c->log; 142 c->read->log = c->write->log = c->log;
132 143
133 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { 144 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {
134 return NGX_ERROR; 145 return NGX_ERROR;
135 } 146 }
136 147
137 if (acceptex(ls->fd, s, c->data, 0, 148 if (acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size,
138 c->socklen + 16, c->socklen + 16, 149 ls->socklen + 16, ls->socklen + 16,
139 &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) { 150 &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0)
151 {
140 152
141 err = ngx_socket_errno; 153 err = ngx_socket_errno;
142 if (err == WSA_IO_PENDING) { 154 if (err != WSA_IO_PENDING) {
143 return NGX_OK; 155 ngx_log_error(NGX_LOG_ALERT, ls->log, err,
156 "AcceptEx() %s falied", ls->addr_text.data);
157
158 return NGX_ERROR;
144 } 159 }
145
146 ngx_log_error(NGX_LOG_ALERT, ls->log, err,
147 "AcceptEx(%s) falied", ls->addr_text.data);
148
149 return NGX_ERROR;
150 } 160 }
151 } 161 }
152 162
153 return NGX_OK; 163 return NGX_OK;
154 } 164 }