comparison src/event/ngx_event_accept.c @ 3812:ef27dc1a7832

fallback to accept() if accept4() is not implemented, the issue has been introduced in r3787
author Igor Sysoev <igor@sysoev.ru>
date Thu, 02 Dec 2010 10:05:41 +0000
parents 8a8eb335313d
children c870fb78550c
comparison
equal deleted inserted replaced
3811:4af1c7f53711 3812:ef27dc1a7832
24 ngx_event_t *rev, *wev; 24 ngx_event_t *rev, *wev;
25 ngx_listening_t *ls; 25 ngx_listening_t *ls;
26 ngx_connection_t *c, *lc; 26 ngx_connection_t *c, *lc;
27 ngx_event_conf_t *ecf; 27 ngx_event_conf_t *ecf;
28 u_char sa[NGX_SOCKADDRLEN]; 28 u_char sa[NGX_SOCKADDRLEN];
29 #if (NGX_HAVE_ACCEPT4)
30 static ngx_uint_t use_accept4 = 1;
31 #endif
29 32
30 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); 33 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
31 34
32 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { 35 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
33 ev->available = 1; 36 ev->available = 1;
45 48
46 do { 49 do {
47 socklen = NGX_SOCKADDRLEN; 50 socklen = NGX_SOCKADDRLEN;
48 51
49 #if (NGX_HAVE_ACCEPT4) 52 #if (NGX_HAVE_ACCEPT4)
50 s = accept4(lc->fd, (struct sockaddr *) sa, &socklen, SOCK_NONBLOCK); 53 if (use_accept4) {
54 s = accept4(lc->fd, (struct sockaddr *) sa, &socklen,
55 SOCK_NONBLOCK);
56 } else {
57 s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
58 }
51 #else 59 #else
52 s = accept(lc->fd, (struct sockaddr *) sa, &socklen); 60 s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
53 #endif 61 #endif
54 62
55 if (s == -1) { 63 if (s == -1) {
61 return; 69 return;
62 } 70 }
63 71
64 ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ? 72 ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ?
65 NGX_LOG_ERR : NGX_LOG_ALERT), 73 NGX_LOG_ERR : NGX_LOG_ALERT),
66 ev->log, err, "accept() failed"); 74 ev->log, err,
75 #if !(NGX_HAVE_ACCEPT4)
76 "accept() failed");
77 #else
78 use_accept4 ? "accept4() failed" : "accept() failed");
79
80 if (use_accept4 && err == NGX_ENOSYS) {
81 use_accept4 = 0;
82 ngx_inherited_nonblocking = 0;
83 continue;
84 }
85 #endif
67 86
68 if (err == NGX_ECONNABORTED) { 87 if (err == NGX_ECONNABORTED) {
69 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { 88 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
70 ev->available--; 89 ev->available--;
71 } 90 }