diff options
author | Igor Sysoev <igor@sysoev.ru> | 2010-12-02 10:05:41 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2010-12-02 10:05:41 +0000 |
commit | a07d6ec39f9e2d5b1b92b5b2be358b8967fa7bf8 (patch) | |
tree | c17122f52e862f2f994cbd12d04b36f6f6421a6c | |
parent | dc9d7fb2d380af1ab919b1efb52a6a381384b687 (diff) | |
download | nginx-a07d6ec39f9e2d5b1b92b5b2be358b8967fa7bf8.tar.gz nginx-a07d6ec39f9e2d5b1b92b5b2be358b8967fa7bf8.zip |
fallback to accept() if accept4() is not implemented,
the issue has been introduced in r3787
-rw-r--r-- | src/event/ngx_event_accept.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index 67751faf7..0feba857d 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -26,6 +26,9 @@ ngx_event_accept(ngx_event_t *ev) ngx_connection_t *c, *lc; ngx_event_conf_t *ecf; u_char sa[NGX_SOCKADDRLEN]; +#if (NGX_HAVE_ACCEPT4) + static ngx_uint_t use_accept4 = 1; +#endif ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); @@ -47,7 +50,12 @@ ngx_event_accept(ngx_event_t *ev) socklen = NGX_SOCKADDRLEN; #if (NGX_HAVE_ACCEPT4) - s = accept4(lc->fd, (struct sockaddr *) sa, &socklen, SOCK_NONBLOCK); + if (use_accept4) { + s = accept4(lc->fd, (struct sockaddr *) sa, &socklen, + SOCK_NONBLOCK); + } else { + s = accept(lc->fd, (struct sockaddr *) sa, &socklen); + } #else s = accept(lc->fd, (struct sockaddr *) sa, &socklen); #endif @@ -63,7 +71,18 @@ ngx_event_accept(ngx_event_t *ev) ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ? NGX_LOG_ERR : NGX_LOG_ALERT), - ev->log, err, "accept() failed"); + ev->log, err, +#if !(NGX_HAVE_ACCEPT4) + "accept() failed"); +#else + use_accept4 ? "accept4() failed" : "accept() failed"); + + if (use_accept4 && err == NGX_ENOSYS) { + use_accept4 = 0; + ngx_inherited_nonblocking = 0; + continue; + } +#endif if (err == NGX_ECONNABORTED) { if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |