log: handle multi-line log messages properly

This commit is contained in:
Lennart Poettering 2010-05-21 03:31:49 +02:00
parent b6dbbe1c98
commit 9726b29e98
2 changed files with 41 additions and 21 deletions

6
fixme
View file

@ -46,8 +46,9 @@
- uuidd DONE - uuidd DONE
- nscd DONE - nscd DONE
- dbus DONE
- rpcbind (/var/run/rpcbind.sock!) - rpcbind (/var/run/rpcbind.sock!)
- dbus - avahi-daemon (/var/run/avahi-daemon/socket)
- rsyslog - rsyslog
- cups - cups
- ssh CLASSIC - ssh CLASSIC
@ -55,7 +56,6 @@
- apache/samba - apache/samba
- libvirtd (/var/run/libvirt/libvirt-sock-ro) - libvirtd (/var/run/libvirt/libvirt-sock-ro)
- bluetoothd (/var/run/sdp! @/org/bluez/audio!) - bluetoothd (/var/run/sdp! @/org/bluez/audio!)
- avahi-daemon (/var/run/avahi-daemon/socket)
- distccd - distccd
* teach dbus to talk to systemd when autospawning services * 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 * Figure out which signal handlers we actually have to reset in the
forked off child forked off child
* loopback-setup is borked for ipv6
Regularly: Regularly:
* look for close() vs. close_nointr() vs. close_nointr_nofail() * look for close() vs. close_nointr() vs. close_nointr_nofail()

View file

@ -312,31 +312,49 @@ static int log_dispatch(
const char*file, const char*file,
int line, int line,
const char *func, const char *func,
const char *buffer) { char *buffer) {
int r; int r = 0;
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || do {
log_target == LOG_TARGET_SYSLOG) { char *e;
int k;
if ((r = write_to_syslog(level, file, line, func, buffer)) < 0) { buffer += strspn(buffer, NEWLINE);
log_close_syslog();
log_open_kmsg();
} else if (r > 0)
return r;
}
if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || if (buffer[0] == 0)
log_target == LOG_TARGET_KMSG) { break;
if ((r = write_to_kmsg(level, file, line, func, buffer)) < 0) { if ((e = strpbrk(buffer, NEWLINE)))
log_close_kmsg(); *(e++) = 0;
log_open_console();
} else if (r > 0)
return r;
}
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( int log_meta(