chiark / gitweb /
service: add extended debian facilities
[elogind.git] / src / log.c
index 5d17955e7ebbd9ddb25a933b8faebac4192bb9fe..1343b9d98614f049cceeff8d15e5362ad3f3dd52 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -50,8 +50,10 @@ void log_close_console(void) {
         if (console_fd < 0)
                 return;
 
-        if (getpid() == 1 || console_fd != STDERR_FILENO) {
-                close_nointr_nofail(console_fd);
+        if (getpid() == 1) {
+                if (console_fd >= 3)
+                        close_nointr_nofail(console_fd);
+
                 console_fd = -1;
         }
 }
@@ -310,31 +312,49 @@ static int log_dispatch(
         const char*file,
         int line,
         const char *func,
-        const char *buffer) {
+        char *buffer) {
 
-        int r;
+        int r = 0;
 
-        if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-            log_target == LOG_TARGET_SYSLOG) {
+        do {
+                char *e;
+                int k;
 
-                if ((r = write_to_syslog(level, file, line, func, buffer)) < 0) {
-                        log_close_syslog();
-                        log_open_kmsg();
-                } else if (r > 0)
-                        return r;
-        }
+                buffer += strspn(buffer, NEWLINE);
 
-        if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-            log_target == LOG_TARGET_KMSG) {
+                if (buffer[0] == 0)
+                        break;
 
-                if ((r = write_to_kmsg(level, file, line, func, buffer)) < 0) {
-                        log_close_kmsg();
-                        log_open_console();
-                } else if (r > 0)
-                        return r;
-        }
+                if ((e = strpbrk(buffer, NEWLINE)))
+                        *(e++) = 0;
+
+                if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
+                    log_target == LOG_TARGET_SYSLOG) {
+
+                        if ((r = write_to_syslog(level, file, line, func, buffer)) < 0) {
+                                log_close_syslog();
+                                log_open_kmsg();
+                        } else if (r > 0)
+                                r++;
+                }
+
+                if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
+                    log_target == LOG_TARGET_KMSG) {
 
-        return write_to_console(level, file, line, func, buffer);
+                        if ((r = write_to_kmsg(level, file, line, func, buffer)) < 0) {
+                                log_close_kmsg();
+                                log_open_console();
+                        } else if (r > 0)
+                                r++;
+                }
+
+                if ((k = write_to_console(level, file, line, func, buffer)) < 0)
+                        return k;
+
+                buffer = e;
+        } while (buffer);
+
+        return r;
 }
 
 int log_meta(