diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-05-21 03:31:49 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-05-21 03:31:49 +0200 |
commit | 9726b29e9811d12c0800a53f0a34dc26fe9b915c (patch) | |
tree | 9e29a63eb04c349c4869f5389d5e15059a773759 | |
parent | b6dbbe1c9860d1e1a7ca7e4be170959277f9e04d (diff) |
log: handle multi-line log messages properly
-rw-r--r-- | fixme | 6 | ||||
-rw-r--r-- | src/log.c | 56 |
2 files changed, 41 insertions, 21 deletions
@@ -46,8 +46,9 @@ - uuidd DONE - nscd DONE + - dbus DONE - rpcbind (/var/run/rpcbind.sock!) - - dbus + - avahi-daemon (/var/run/avahi-daemon/socket) - rsyslog - cups - ssh CLASSIC @@ -55,7 +56,6 @@ - apache/samba - libvirtd (/var/run/libvirt/libvirt-sock-ro) - bluetoothd (/var/run/sdp! @/org/bluez/audio!) - - avahi-daemon (/var/run/avahi-daemon/socket) - distccd * teach dbus to talk to systemd when autospawning services @@ -63,6 +63,8 @@ * Figure out which signal handlers we actually have to reset in the forked off child +* loopback-setup is borked for ipv6 + Regularly: * look for close() vs. close_nointr() vs. close_nointr_nofail() @@ -312,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; - return write_to_console(level, file, line, func, buffer); + 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) { + + 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( |