The attached patch fixes a bug (or missing feature) in busybox's syslog
implementation.  The current implementation only makes one connection
attempt to the remote host, so that if the network or host is
unavailable when syslog first makes an attempt to send a messages to the
remote host messages are never sent.

The attached patch considers certain failures when attempt to transmit a
log message, (ECONNRESET, EDESTADDRREQ, EISCONN, ENOTCONN, EPIPE) as
cause to close and remove the connection socket so that on the next
syslog message to be sent, another connection will be tried.

Signed-Off-By: Daniel Dickinson <[email protected]>
-- 
And that's my crabbing done for the day.  Got it out of the way early, 
now I have the rest of the afternoon to sniff fragrant tea-roses or 
strangle cute bunnies or something.   -- Michael Devore
GnuPG Key Fingerprint 86 F5 81 A5 D4 2E 1F 1C      http://gnupg.org
The C Shore (Daniel Dickinson's Website) http://cshore.is-a-geek.com

diff -Naur busybox-1.16.2.orig/sysklogd/syslogd.c busybox-1.16.2/sysklogd/syslogd.c
--- busybox-1.16.2.orig/sysklogd/syslogd.c	2010-06-12 09:50:08.000000000 -0400
+++ busybox-1.16.2/sysklogd/syslogd.c	2010-06-27 08:23:15.000000000 -0400
@@ -555,6 +555,7 @@
 static void do_syslogd(void)
 {
 	int sock_fd;
+	int send_err = 0;
 #if ENABLE_FEATURE_SYSLOGD_DUP
 	int last_sz = -1;
 	char *last_buf;
@@ -632,10 +633,23 @@
 			 * over network, mimic that */
 			recvbuf[sz] = '\n';
 			/* send message to remote logger, ignore possible error */
-			/* TODO: on some errors, close and set G.remoteFD to -1
-			 * so that DNS resolution and connect is retried? */
-			sendto(G.remoteFD, recvbuf, sz+1, MSG_DONTWAIT,
-				    &G.remoteAddr->u.sa, G.remoteAddr->len);
+			if ( sendto(G.remoteFD, recvbuf, sz+1, MSG_DONTWAIT,
+				    &G.remoteAddr->u.sa, G.remoteAddr->len)  == -1 ) {
+				send_err = errno;
+		    }
+
+			/* On some errors, close and set G.remoteFD to -1
+			 * so that DNS resolution and connect is retried */
+		    switch (send_err) {
+			case ECONNRESET:
+			case EDESTADDRREQ:
+			case EISCONN:
+			case ENOTCONN:
+			case EPIPE:
+					close(G.remoteFD);
+					G.remoteFD = -1;
+					break;
+		    }
  no_luck: ;
 		}
 #endif

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to