Felipe Kellermann writes:
authorEric Andersen <andersen@codepoet.org>
Wed, 8 Sep 2004 10:56:06 +0000 (10:56 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 8 Sep 2004 10:56:06 +0000 (10:56 -0000)
The Togg's sysklogd patch to use sendto() on remote logging is formatting
strangely (using `<' and '>' surrounding the `msg' string message).  This
is OK, but this is not the standard way of formatting this message.

So this patch does the following:

o Fix the formatting to the standard way.
o Uses `MAXLINE' when needed;
o Don't loop sending messages without a "sleeping time",
  I'm now doing `now = 1', `now <<= 1';
o Don't die on `init_RemoteLog' when starting up (feature!)
  We're now trying to connect every time we have an invalid fd;
o Removes one static uneeded variable.
o Removes two automatic uneeded variables.

sysklogd/syslogd.c

index 6e7652c0098042f6ef2625813d9f50ff39fc9c49..ef9cf21622713c7d3be1295100c20f3b1057d007 100644 (file)
@@ -79,7 +79,6 @@ static char LocalHostName[64];
 /* udp socket for logging to remote host */
 static int remotefd = -1;
 static struct sockaddr_in remoteaddr;
-static int remoteaddrlen;
 
 /* where do we log? */
 static char *RemoteHost;
@@ -381,13 +380,29 @@ static void message(char *fmt, ...)
        }
 }
 
+#ifdef CONFIG_FEATURE_REMOTE_LOG
+static void init_RemoteLog(void)
+{
+       memset(&remoteaddr, 0, sizeof(remoteaddr));
+       remotefd = socket(AF_INET, SOCK_DGRAM, 0);
+
+       if (remotefd < 0) {
+               bb_error_msg("cannot create socket");
+       }
+
+       remoteaddr.sin_family = AF_INET;
+       remoteaddr.sin_addr = *(struct in_addr *) *(xgethostbyname(RemoteHost))->h_addr_list;
+       remoteaddr.sin_port = htons(RemotePort);
+}
+#endif
+
 static void logMessage(int pri, char *msg)
 {
        time_t now;
        char *timestamp;
        static char res[20] = "";
 #ifdef CONFIG_FEATURE_REMOTE_LOG       
-       static char line[512];
+       static char line[MAXLINE + 1];
 #endif
        CODE *c_pri, *c_fac;
 
@@ -418,15 +433,20 @@ static void logMessage(int pri, char *msg)
 
 #ifdef CONFIG_FEATURE_REMOTE_LOG
        /* send message to remote logger */
-       if (-1 != remotefd) {
+       if (-1 == remotefd) {
+               init_RemoteLog();
+       }
 
-               memset(&line, 0, sizeof(line));
-               snprintf(line, sizeof(line), "<%d> <%s>", pri, msg);
+       if (-1 != remotefd) {
+               now = 1;
+               snprintf(line, sizeof(line), "<%d> %s", pri, msg);
 
        retry:
        if(( -1 == sendto(remotefd, line, strlen(line), 0, 
                                                (struct sockaddr *) &remoteaddr, 
-                                               remoteaddrlen)) && (errno == EINTR)) {
+                                               sizeof(remoteaddr))) && (errno == EINTR)) {
+                       sleep(now);
+                       now *= 2;
                        goto retry;
                }
        }
@@ -503,29 +523,6 @@ static int serveConnection(char *tmpbuf, int n_read)
        return n_read;
 }
 
-
-#ifdef CONFIG_FEATURE_REMOTE_LOG
-static void init_RemoteLog(void)
-{
-       struct hostent *hostinfo;
-       remoteaddrlen = sizeof(remoteaddr);
-
-       memset(&remoteaddr, 0, remoteaddrlen);
-
-       remotefd = socket(AF_INET, SOCK_DGRAM, 0);
-
-       if (remotefd < 0) {
-               bb_error_msg_and_die("cannot create socket");
-       }
-
-       hostinfo = xgethostbyname(RemoteHost);
-
-       remoteaddr.sin_family = AF_INET;
-       remoteaddr.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
-       remoteaddr.sin_port = htons(RemotePort);
-}
-#endif
-
 static void doSyslogd(void) __attribute__ ((noreturn));
 static void doSyslogd(void)
 {