diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2009-11-02 15:24:02 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2009-11-02 15:24:02 +0000 |
| commit | 72e928755ba63b803c0b2478f6d8d1e792e95b86 (patch) | |
| tree | 48354712b370bdfccd1d22824a6f2ddea5ca8443 /src/event | |
| parent | 1d52beba7339a6edf235a2160bc20fc466e1823a (diff) | |
| download | nginx-72e928755ba63b803c0b2478f6d8d1e792e95b86.tar.gz nginx-72e928755ba63b803c0b2478f6d8d1e792e95b86.tar.bz2 | |
proxy_bind, fastcgi_bind, and memcached_bind
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/ngx_event_connect.c | 43 | ||||
| -rw-r--r-- | src/event/ngx_event_connect.h | 2 |
2 files changed, 26 insertions, 19 deletions
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c index 839bb6ca4..dc1407563 100644 --- a/src/event/ngx_event_connect.c +++ b/src/event/ngx_event_connect.c @@ -54,15 +54,7 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) { ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, "setsockopt(SO_RCVBUF) failed"); - - ngx_free_connection(c); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; + goto failed; } } @@ -70,14 +62,16 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, ngx_nonblocking_n " failed"); - ngx_free_connection(c); + goto failed; + } - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } + if (pc->local) { + if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) { + ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno, + "bind(%V) failed", &pc->local->name); - return NGX_ERROR; + goto failed; + } } c->recv = ngx_recv; @@ -127,7 +121,7 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) if (ngx_add_conn) { if (ngx_add_conn(c) == NGX_ERROR) { - return NGX_ERROR; + goto failed; } } @@ -199,7 +193,7 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) if (ngx_blocking(s) == -1) { ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, ngx_blocking_n " failed"); - return NGX_ERROR; + goto failed; } /* @@ -229,7 +223,7 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) } if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { - return NGX_ERROR; + goto failed; } if (rc == -1) { @@ -237,7 +231,7 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) /* NGX_EINPROGRESS */ if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { - return NGX_ERROR; + goto failed; } return NGX_AGAIN; @@ -248,6 +242,17 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc) wev->ready = 1; return NGX_OK; + +failed: + + ngx_free_connection(c); + + if (ngx_close_socket(s) == -1) { + ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } + + return NGX_ERROR; } diff --git a/src/event/ngx_event_connect.h b/src/event/ngx_event_connect.h index 4f09524dd..d64f1bb10 100644 --- a/src/event/ngx_event_connect.h +++ b/src/event/ngx_event_connect.h @@ -55,6 +55,8 @@ struct ngx_peer_connection_s { ngx_atomic_t *lock; #endif + ngx_addr_t *local; + int rcvbuf; ngx_log_t *log; |
