X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald.c;h=8ce9ce858bc88e44a9b284675089961dce2310d6;hb=d94117a93c0a8431de5c765f21a97f6eb32580da;hp=7776c2a25c4e58a624b9a40a849e1fb154d9ebb2;hpb=1afd5be42f8f4105dd47c71ce968c9d5bf81e0a8;p=elogind.git diff --git a/src/journal/journald.c b/src/journal/journald.c index 7776c2a25..8ce9ce858 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -31,10 +31,13 @@ #include #include -#include #include #include +#ifdef HAVE_LOGIND +#include +#endif + #include "mkdir.h" #include "hashmap.h" #include "journal-file.h" @@ -479,7 +482,9 @@ static void dispatch_message_real( if (ucred) { uint32_t audit; +#ifdef HAVE_LOGIND uid_t owner; +#endif realuid = ucred->uid; @@ -538,6 +543,7 @@ static void dispatch_message_real( IOVEC_SET_STRING(iovec[n++], cgroup); } +#ifdef HAVE_LOGIND if (sd_pid_get_session(ucred->pid, &t) >= 0) { session = strappend("_SYSTEMD_SESSION=", t); free(t); @@ -546,7 +552,12 @@ static void dispatch_message_real( IOVEC_SET_STRING(iovec[n++], session); } - if (sd_pid_get_unit(ucred->pid, &t) >= 0) { + if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0) + if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0) + IOVEC_SET_STRING(iovec[n++], owner_uid); +#endif + + if (cg_pid_get_unit(ucred->pid, &t) >= 0) { unit = strappend("_SYSTEMD_UNIT=", t); free(t); @@ -554,10 +565,6 @@ static void dispatch_message_real( IOVEC_SET_STRING(iovec[n++], unit); } - if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0) - if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0) - IOVEC_SET_STRING(iovec[n++], owner_uid); - #ifdef HAVE_SELINUX if (label) { selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len); @@ -1768,6 +1775,17 @@ static int parse_kernel_timestamp(char **_p, usec_t *t) { return 1; } +static bool is_us(const char *pid) { + pid_t t; + + assert(pid); + + if (parse_pid(pid, &t) < 0) + return false; + + return t == getpid(); +} + static void proc_kmsg_line(Server *s, const char *p) { struct iovec iovec[N_IOVEC_META_FIELDS + 7]; char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL; @@ -1807,6 +1825,11 @@ static void proc_kmsg_line(Server *s, const char *p) { } else { read_identifier(&p, &identifier, &pid); + /* Avoid any messages we generated ourselves via + * log_info() and friends. */ + if (is_us(pid)) + goto finish; + if (s->forward_to_syslog) forward_syslog(s, priority, identifier, p, NULL, NULL); @@ -1832,6 +1855,7 @@ static void proc_kmsg_line(Server *s, const char *p) { dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, priority); +finish: free(message); free(syslog_priority); free(syslog_identifier);