aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-12-02 10:05:41 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-12-02 10:05:41 +0000
commita07d6ec39f9e2d5b1b92b5b2be358b8967fa7bf8 (patch)
treec17122f52e862f2f994cbd12d04b36f6f6421a6c
parentdc9d7fb2d380af1ab919b1efb52a6a381384b687 (diff)
downloadnginx-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.c23
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) {