Fix a tar bug: tar removed leading '/'s for symlink targets.
[oweals/busybox.git] / sysklogd / syslogd.c
index ec372fc56e85fe3f899e30daf96f758ad7cf257b..8827265d51808ef2b718c77e405643526de8cf1b 100644 (file)
@@ -81,21 +81,17 @@ static void message(char *fmt, ...)
        int fd;
        va_list arguments;
 
-       if (
-               (fd =
-                device_open(logFilePath,
-                                        O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND |
-                                        O_NONBLOCK)) >= 0) {
+       if ( (fd = device_open(logFilePath,
+                                O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND |
+                                O_NONBLOCK)) >= 0) {
                va_start(arguments, fmt);
                vdprintf(fd, fmt, arguments);
                va_end(arguments);
                close(fd);
        } else {
                /* Always send console messages to /dev/console so people will see them. */
-               if (
-                       (fd =
-                        device_open(_PATH_CONSOLE,
-                                                O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) {
+               if ( (fd = device_open(_PATH_CONSOLE,
+                                        O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) {
                        va_start(arguments, fmt);
                        vdprintf(fd, fmt, arguments);
                        va_end(arguments);
@@ -177,14 +173,10 @@ static void doSyslogd (void)
        signal (SIGALRM, domark);
        alarm (MarkInterval);
 
-       /* create the syslog file so realpath() can work 
-        * (the ugle close(open()) stuff is just a cheap
-        * touch command that avoids using system (system
-        * is always a bad thing to use) */
-       close(open("touch " _PATH_LOG, O_RDWR | O_CREAT, 0644));
+       /* create the syslog file so realpath() can work */ 
+       close(open(_PATH_LOG, O_RDWR | O_CREAT, 0644));
        if (realpath(_PATH_LOG, lfile) == NULL) {
-               perror("Could not resolv path to " _PATH_LOG);
-               exit (FALSE);
+               fatalError("Could not resolv path to " _PATH_LOG);
        }
 
        unlink (lfile);
@@ -194,20 +186,17 @@ static void doSyslogd (void)
        sunx.sun_family = AF_UNIX;
        strncpy (sunx.sun_path, lfile, sizeof(sunx.sun_path));
        if ((sock_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
-               perror ("Couldn't obtain descriptor for socket " _PATH_LOG);
-               exit (FALSE);
+               fatalError ("Couldn't obtain descriptor for socket " _PATH_LOG);
        }
 
        addrLength = sizeof (sunx.sun_family) + strlen (sunx.sun_path);
        if ((bind (sock_fd, (struct sockaddr *) &sunx, addrLength)) ||
                (listen (sock_fd, 5))) {
-               perror ("Could not connect to socket " _PATH_LOG);
-               exit (FALSE);
+               fatalError ("Could not connect to socket " _PATH_LOG);
        }
 
        if (chmod (lfile, 0666) < 0) {
-               perror ("Could not set permission on " _PATH_LOG);
-               exit (FALSE);
+               fatalError ("Could not set permission on " _PATH_LOG);
        }
 
        FD_ZERO (&readfds);
@@ -221,19 +210,17 @@ static void doSyslogd (void)
 
                if ((n_ready = select (FD_SETSIZE, &readfds, NULL, NULL, NULL)) < 0) {
                        if (errno == EINTR) continue; /* alarm may have happened. */
-                       perror ("select");
-                       exit (FALSE);
+                       fatalError( "select error: %s\n", strerror(errno));
                }
 
                /* Skip stdin, stdout, stderr */
-               for (fd = 3; fd <= FD_SETSIZE; fd++) {
+               for (fd = 3; fd < FD_SETSIZE; fd++) {
                        if (FD_ISSET (fd, &readfds)) {
                                if (fd == sock_fd) {
                                        int conn;
                                        if ((conn = accept(sock_fd, (struct sockaddr *) &sunx,
                                                                           &addrLength)) < 0) {
-                                               perror ("accept");
-                                               exit (FALSE); /* #### ??? */
+                                               fatalError( "accept error: %s\n", strerror(errno));
                                        }
                                        FD_SET (conn, &readfds);
                                }
@@ -242,17 +229,11 @@ static void doSyslogd (void)
                                        char buf[BUFSIZE];
                                        char *q, *p;
                                        int n_read;
+                                       char line[BUFSIZE];
+                                       unsigned char c;
 
-                                       n_read = read (fd, buf, BUFSIZE);
-
-                                       if (n_read < 0) {
-                                               // FIXME .. fd isn't set 
-                                               perror ("read error");
-                                               goto close_fd;
-                                       }
-                                       else if (n_read > 0) {
-                                               char line[BUFSIZE];
-                                               unsigned char c;
+                                       /* Keep reading stuff till there is nothing else to read */
+                                       while( (n_read = read (fd, buf, BUFSIZE)) > 0 && errno != EOF) {
                                                int pri = (LOG_USER | LOG_NOTICE);
 
                                                memset (line, 0, sizeof(line));
@@ -281,14 +262,9 @@ static void doSyslogd (void)
 
                                                /* Now log it */
                                                logMessage(pri, line);
-
-                                       close_fd:
-                                               close (fd);
-                                               FD_CLR (fd, &readfds);
-                                       }
-                                       else {          /* EOF */
-                                               goto close_fd;
                                        }
+                                       close (fd);
+                                       FD_CLR (fd, &readfds);
                                }
                        }
                }