From bdfb9e7f7c315af5a6755ac4701b696ce2305a19 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 22 Aug 2012 02:49:17 +0200 Subject: journald: augment journal entries from the kernel with data from udev --- Makefile.am | 3 +- man/sd_journal_print.xml | 20 ++++++++------ man/systemd.journal-fields.xml | 30 +++++++++++++++++++- src/journal/journald.c | 63 +++++++++++++++++++++++++++++++++++++++++- src/journal/journald.h | 2 ++ 5 files changed, 106 insertions(+), 12 deletions(-) diff --git a/Makefile.am b/Makefile.am index e6bfc1f39e..22445fbde4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2322,7 +2322,8 @@ systemd_journald_LDADD = \ libsystemd-audit.la \ libsystemd-daemon.la \ libsystemd-id128-internal.la \ - libsystemd-journal-internal.la + libsystemd-journal-internal.la \ + libudev.la if ENABLE_LOGIND systemd_journald_LDADD += \ diff --git a/man/sd_journal_print.xml b/man/sd_journal_print.xml index 7eac6c8192..c03762ac2c 100644 --- a/man/sd_journal_print.xml +++ b/man/sd_journal_print.xml @@ -131,17 +131,19 @@ immediately followed by their associated parameters, terminated by NULL. The strings passed should be of the format VARIABLE=value. The - variable name must be in uppercase and consist only - of characters, numbers and underscores, and may not - begin with an underscore. The value can be of any size - and format. It is highly recommended to submit - text strings formatted in the UTF-8 character encoding - only, and submit binary fields only when formatting in - UTf-8 strings is not sensible. A number of well known - fields are defined, see + variable name must be in uppercase and consist only of + characters, numbers and underscores, and may not begin + with an underscore. (All assignments that do not + follow this syntax will be ignored.) The value can be + of any size and format. It is highly recommended to + submit text strings formatted in the UTF-8 character + encoding only, and submit binary fields only when + formatting in UTf-8 strings is not sensible. A number + of well known fields are defined, see systemd.journal-fields7 for details, but additional application defined fields - may be used. + may be used. A variable may be assigned more than one + value per entry. sd_journal_sendv() is similar to sd_journal_send() but diff --git a/man/systemd.journal-fields.xml b/man/systemd.journal-fields.xml index d790c35a03..b555c0e0ac 100644 --- a/man/systemd.journal-fields.xml +++ b/man/systemd.journal-fields.xml @@ -58,7 +58,8 @@ sense. New fields may freely be defined by applications, but a few fields have special meaning. All fields with special meanings are - optional. + optional. In some cases fields may appear more than + once per entry. @@ -338,6 +339,33 @@ The kernel subsystem name. + + _UDEV_SYSNAME= + + The kernel device name + as it shows up in the device + tree below + /sys. + + + + _UDEV_DEVNODE= + + The device node path of + this device in + /dev. + + + + _UDEV_DEVLINK= + + Additional symlink names + pointing to the device node in + /dev. This + field is frequently set more + than once per entry. + + diff --git a/src/journal/journald.c b/src/journal/journald.c index a5025f5687..2429dd3e27 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -74,6 +75,7 @@ #define N_IOVEC_META_FIELDS 17 #define N_IOVEC_KERNEL_FIELDS 64 +#define N_IOVEC_UDEV_FIELDS 32 #define ENTRY_SIZE_MAX (1024*1024*32) @@ -1811,7 +1813,7 @@ static bool is_us(const char *pid) { } static void dev_kmsg_record(Server *s, char *p, size_t l) { - struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS]; + struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS + 2 + N_IOVEC_UDEV_FIELDS]; char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL; int priority, r; unsigned n = 0, z = 0, j; @@ -1819,6 +1821,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { char *identifier = NULL, *pid = NULL, *e, *f, *k; uint64_t serial; size_t pl; + char *kernel_device = NULL; assert(s); assert(p); @@ -1910,6 +1913,9 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { if (!m) break; + if (startswith(m, "_KERNEL_DEVICE=")) + kernel_device = m + 15; + IOVEC_SET_STRING(iovec[n++], m); z++; @@ -1917,6 +1923,54 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { k = e + 1; } + if (kernel_device) { + struct udev_device *ud; + + ud = udev_device_new_from_device_id(s->udev, kernel_device); + if (ud) { + const char *g; + struct udev_list_entry *ll; + char *b; + + g = udev_device_get_devnode(ud); + if (g) { + b = strappend("_UDEV_DEVNODE=", g); + if (b) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + } + + g = udev_device_get_sysname(ud); + if (g) { + b = strappend("_UDEV_SYSNAME=", g); + if (b) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + } + + j = 0; + ll = udev_device_get_devlinks_list_entry(ud); + udev_list_entry_foreach(ll, ll) { + + if (j > N_IOVEC_UDEV_FIELDS) + break; + + g = udev_list_entry_get_name(ll); + b = strappend("_UDEV_DEVLINK=", g); + if (g) { + IOVEC_SET_STRING(iovec[n++], b); + z++; + } + + j++; + } + + udev_device_unref(ud); + } + } + if (asprintf(&source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", (unsigned long long) usec) >= 0) IOVEC_SET_STRING(iovec[n++], source_time); @@ -2871,6 +2925,10 @@ static int server_init(Server *s) { if (r < 0) return r; + s->udev = udev_new(); + if (!s->udev) + return -ENOMEM; + s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst); if (!s->rate_limit) return -ENOMEM; @@ -2929,6 +2987,9 @@ static void server_done(Server *s) { if (s->mmap) mmap_cache_unref(s->mmap); + + if (s->udev) + udev_unref(s->udev); } int main(int argc, char *argv[]) { diff --git a/src/journal/journald.h b/src/journal/journald.h index 13f2f1f5d1..da2c312474 100644 --- a/src/journal/journald.h +++ b/src/journal/journald.h @@ -99,6 +99,8 @@ typedef struct Server { bool dev_kmsg_readable; uint64_t *kernel_seqnum; + + struct udev *udev; } Server; /* gperf lookup function */ -- cgit v1.2.3-54-g00ecf