Togg writes:
authorEric Andersen <andersen@codepoet.org>
Thu, 26 Aug 2004 23:15:29 +0000 (23:15 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 26 Aug 2004 23:15:29 +0000 (23:15 -0000)
Syslogd wont start if remote-logging is enabled and the connection to the
remote-log server is not possible on syslogd startup.

I found a patch somewhere which works like a charm. It uses sendto() which
seems more reliable for this issue.

Please see attached patch. Many people will be more happy with this included
I think.

Regards,
Togg

sysklogd/syslogd.c

index 2023873a86316a45958c39c2b924edf98483ff00..741c8067344545492409cf8e746ed78026ffe2e5 100644 (file)
@@ -78,6 +78,8 @@ static char LocalHostName[64];
 #include <netinet/in.h>
 /* 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;
@@ -384,6 +386,7 @@ static void logMessage(int pri, char *msg)
        time_t now;
        char *timestamp;
        static char res[20] = "";
+       static char line[512];
        CODE *c_pri, *c_fac;
 
        if (pri != 0) {
@@ -414,21 +417,15 @@ static void logMessage(int pri, char *msg)
 #ifdef CONFIG_FEATURE_REMOTE_LOG
        /* send message to remote logger */
        if (-1 != remotefd) {
-               static const int IOV_COUNT = 2;
-               struct iovec iov[IOV_COUNT];
-               struct iovec *v = iov;
-
-               memset(&res, 0, sizeof(res));
-               snprintf(res, sizeof(res), "<%d>", pri);
-               v->iov_base = res;
-               v->iov_len = strlen(res);
-               v++;
-
-               v->iov_base = msg;
-               v->iov_len = strlen(msg);
-         writev_retry:
-               if ((-1 == writev(remotefd, iov, IOV_COUNT)) && (errno == EINTR)) {
-                       goto writev_retry;
+
+               memset(&line, 0, sizeof(line));
+               snprintf(line, sizeof(line), "<%d> <%s>", pri, msg);
+
+       retry:
+       if(( -1 == sendto(remotefd, line, strlen(line), 0, 
+                                               (struct sockaddr *) &remoteaddr, 
+                                               remoteaddrlen)) && (errno == EINTR)) {
+                       goto retry;
                }
        }
        if (local_logging == TRUE)
@@ -508,12 +505,10 @@ static int serveConnection(char *tmpbuf, int n_read)
 #ifdef CONFIG_FEATURE_REMOTE_LOG
 static void init_RemoteLog(void)
 {
-
-       struct sockaddr_in remoteaddr;
        struct hostent *hostinfo;
-       int len = sizeof(remoteaddr);
+       remoteaddrlen = sizeof(remoteaddr);
 
-       memset(&remoteaddr, 0, len);
+       memset(&remoteaddr, 0, remoteaddrlen);
 
        remotefd = socket(AF_INET, SOCK_DGRAM, 0);
 
@@ -526,15 +521,6 @@ static void init_RemoteLog(void)
        remoteaddr.sin_family = AF_INET;
        remoteaddr.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
        remoteaddr.sin_port = htons(RemotePort);
-
-       /* Since we are using UDP sockets, connect just sets the default host and port
-        * for future operations
-        */
-       if (0 != (connect(remotefd, (struct sockaddr *) &remoteaddr, len))) {
-               bb_error_msg_and_die("cannot connect to remote host %s:%d", RemoteHost,
-                                                 RemotePort);
-       }
-
 }
 #endif