aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dickinson <cshore@csolve.net>2010-08-03 04:26:20 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-08-03 04:26:20 +0200
commite74d79866c6d125527e3ba69245a087a28fd19ce (patch)
tree5daf6b4b5f95290a4342bc02b2b1780182c69566
parent6e06da5efd5d6e341ae2f5116c449994740f5613 (diff)
downloadbusybox-w32-e74d79866c6d125527e3ba69245a087a28fd19ce.tar.gz
busybox-w32-e74d79866c6d125527e3ba69245a087a28fd19ce.tar.bz2
busybox-w32-e74d79866c6d125527e3ba69245a087a28fd19ce.zip
syslogd: close/re-resolve/reopen remote sockets on some sendto() errors
function old new delta syslogd_main 1201 1262 +61 Signed-off-by: Daniel Dickinson <cshore@csolve.net> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--sysklogd/syslogd.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 6bc450bf9..37a119b3d 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -546,7 +546,7 @@ static int try_to_resolve_remote(remoteHost_t *rh)
546 if (!rh->remoteAddr) 546 if (!rh->remoteAddr)
547 return -1; 547 return -1;
548 } 548 }
549 return socket(rh->remoteAddr->u.sa.sa_family, SOCK_DGRAM, 0); 549 return xsocket(rh->remoteAddr->u.sa.sa_family, SOCK_DGRAM, 0);
550} 550}
551#endif 551#endif
552 552
@@ -636,11 +636,25 @@ static void do_syslogd(void)
636 if (rh->remoteFD == -1) 636 if (rh->remoteFD == -1)
637 continue; 637 continue;
638 } 638 }
639 /* Send message to remote logger, ignore possible error */ 639
640 /* TODO: on some errors, close and set G.remoteFD to -1 640 /* Send message to remote logger.
641 * so that DNS resolution and connect is retried? */ 641 * On some errors, close and set remoteFD to -1
642 sendto(rh->remoteFD, recvbuf, sz+1, MSG_DONTWAIT, 642 * so that DNS resolution is retried.
643 &(rh->remoteAddr->u.sa), rh->remoteAddr->len); 643 */
644 if (sendto(rh->remoteFD, recvbuf, sz+1,
645 MSG_DONTWAIT | MSG_NOSIGNAL,
646 &(rh->remoteAddr->u.sa), rh->remoteAddr->len) == -1
647 ) {
648 switch (errno) {
649 case ECONNRESET:
650 case ENOTCONN: /* paranoia */
651 case EPIPE:
652 close(rh->remoteFD);
653 rh->remoteFD = -1;
654 free(rh->remoteAddr);
655 rh->remoteAddr = NULL;
656 }
657 }
644 } 658 }
645#endif 659#endif
646 if (!ENABLE_FEATURE_REMOTE_LOG || (option_mask32 & OPT_locallog)) { 660 if (!ENABLE_FEATURE_REMOTE_LOG || (option_mask32 & OPT_locallog)) {