# HG changeset patch # User Vladimir Homutov # Date 1409050614 -14400 # Node ID 02c2352d5b01d4723346c85cb323e0c25fa29565 # Parent 2cb5275bf5e73af5d0d905c4dfc54e99d2581a21 Syslog: improved error handling of unix domain sockets. If a syslog daemon is restarted and the unix socket is used, further logging might stop to work. In case of send error, socket is closed, forcing a reconnection at the next logging attempt. diff --git a/src/core/ngx_syslog.c b/src/core/ngx_syslog.c --- a/src/core/ngx_syslog.c +++ b/src/core/ngx_syslog.c @@ -261,6 +261,8 @@ ngx_syslog_writer(ngx_log_t *log, ngx_ui ssize_t ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len) { + ssize_t n; + if (peer->conn.fd == (ngx_socket_t) -1) { if (ngx_syslog_init_peer(peer) != NGX_OK) { return NGX_ERROR; @@ -271,12 +273,28 @@ ngx_syslog_send(ngx_syslog_peer_t *peer, peer->conn.log = ngx_cycle->log; if (ngx_send) { - return ngx_send(&peer->conn, buf, len); + n = ngx_send(&peer->conn, buf, len); } else { /* event module has not yet set ngx_io */ - return ngx_os_io.send(&peer->conn, buf, len); + n = ngx_os_io.send(&peer->conn, buf, len); } + +#if (NGX_HAVE_UNIX_DOMAIN) + + if (n == NGX_ERROR && peer->server.sockaddr->sa_family == AF_UNIX) { + + if (ngx_close_socket(peer->conn.fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } + + peer->conn.fd = (ngx_socket_t) -1; + } + +#endif + + return n; } @@ -344,6 +362,10 @@ ngx_syslog_cleanup(void *data) /* prevents further use of this peer */ peer->busy = 1; + if (peer->conn.fd == (ngx_socket_t) -1) { + return; + } + if (ngx_close_socket(peer->conn.fd) == -1) { ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, ngx_close_socket_n " failed");