JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) {
const char *c;
int fieldlen;
+ const char *on = "", *off = "";
+
c = memchr(data, '=', length);
if (!c) {
log_error("Invalid field.");
}
fieldlen = c - (const char*) data;
- if ((flags & OUTPUT_SHOW_ALL) || (length < PRINT_THRESHOLD && utf8_is_printable(data, length))) {
- fprintf(f, " %.*s=", fieldlen, (const char*)data);
+ if (flags & OUTPUT_COLOR && startswith(data, "MESSAGE=")) {
+ on = ANSI_HIGHLIGHT_ON;
+ off = ANSI_HIGHLIGHT_OFF;
+ }
+
+ if (flags & OUTPUT_SHOW_ALL ||
+ (((length < PRINT_THRESHOLD) || flags & OUTPUT_FULL_WIDTH) && utf8_is_printable(data, length))) {
+ fprintf(f, " %s%.*s=", on, fieldlen, (const char*)data);
print_multiline(f, 4 + fieldlen + 1, 0, OUTPUT_FULL_WIDTH, 0, c + 1, length - fieldlen - 1);
+ fputs(off, f);
} else {
char bytes[FORMAT_BYTES_MAX];
- fprintf(f, " %.*s=[%s blob data]\n",
+ fprintf(f, " %s%.*s=[%s blob data]%s\n",
+ on,
(int) (c - (const char*) data),
(const char*) data,
- format_bytes(bytes, sizeof(bytes), length - (c - (const char *) data) - 1));
+ format_bytes(bytes, sizeof(bytes), length - (c - (const char *) data) - 1),
+ off);
}
}
/* We already printed the boot id, from the data in
* the header, hence let's suppress it here */
if (length >= 9 &&
- memcmp(data, "_BOOT_ID=", 9) == 0)
+ hasprefix(data, "_BOOT_ID="))
continue;
if (!utf8_is_printable(data, length)) {
int add_matches_for_unit(sd_journal *j, const char *unit) {
int r;
- _cleanup_free_ char *m1 = NULL, *m2 = NULL, *m3 = NULL;
+ char *m1, *m2, *m3, *m4;
assert(j);
assert(unit);
- if (asprintf(&m1, "_SYSTEMD_UNIT=%s", unit) < 0 ||
- asprintf(&m2, "COREDUMP_UNIT=%s", unit) < 0 ||
- asprintf(&m3, "UNIT=%s", unit) < 0)
- return -ENOMEM;
+ m1 = strappenda("_SYSTEMD_UNIT=", unit);
+ m2 = strappenda("COREDUMP_UNIT=", unit);
+ m3 = strappenda("UNIT=", unit);
+ m4 = strappenda("OBJECT_SYSTEMD_UNIT=", unit);
(void)(
/* Look for messages from the service itself */
/* Look for coredumps of the service */
(r = sd_journal_add_disjunction(j)) ||
- (r = sd_journal_add_match(j,
- "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
+ (r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
+ (r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, m2, 0)) ||
/* Look for messages from PID 1 about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "_PID=1", 0)) ||
- (r = sd_journal_add_match(j, m3, 0))
+ (r = sd_journal_add_match(j, m3, 0)) ||
+
+ /* Look for messages from authorized daemons about this service */
+ (r = sd_journal_add_disjunction(j)) ||
+ (r = sd_journal_add_match(j, "_UID=0", 0)) ||
+ (r = sd_journal_add_match(j, m4, 0))
);
+
return r;
}
int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) {
int r;
- _cleanup_free_ char *m1 = NULL, *m2 = NULL, *m3 = NULL, *m4 = NULL;
+ char *m1, *m2, *m3, *m4;
+ char muid[sizeof("_UID=") + DECIMAL_STR_MAX(uid_t)];
assert(j);
assert(unit);
- if (asprintf(&m1, "_SYSTEMD_USER_UNIT=%s", unit) < 0 ||
- asprintf(&m2, "USER_UNIT=%s", unit) < 0 ||
- asprintf(&m3, "COREDUMP_USER_UNIT=%s", unit) < 0 ||
- asprintf(&m4, "_UID=%d", uid) < 0)
- return -ENOMEM;
+ m1 = strappenda("_SYSTEMD_USER_UNIT=", unit);
+ m2 = strappenda("USER_UNIT=", unit);
+ m3 = strappenda("COREDUMP_USER_UNIT=", unit);
+ m4 = strappenda("OBJECT_SYSTEMD_USER_UNIT=", unit);
+ sprintf(muid, "_UID=%lu", (unsigned long) uid);
(void) (
/* Look for messages from the user service itself */
(r = sd_journal_add_match(j, m1, 0)) ||
- (r = sd_journal_add_match(j, m4, 0)) ||
+ (r = sd_journal_add_match(j, muid, 0)) ||
/* Look for messages from systemd about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m2, 0)) ||
- (r = sd_journal_add_match(j, m4, 0)) ||
+ (r = sd_journal_add_match(j, muid, 0)) ||
/* Look for coredumps of the service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m3, 0)) ||
- (r = sd_journal_add_match(j, m4, 0))
+ (r = sd_journal_add_match(j, muid, 0)) ||
+ (r = sd_journal_add_match(j, "_UID=0", 0)) ||
+
+ /* Look for messages from authorized daemons about this service */
+ (r = sd_journal_add_disjunction(j)) ||
+ (r = sd_journal_add_match(j, m4, 0)) ||
+ (r = sd_journal_add_match(j, muid, 0)) ||
+ (r = sd_journal_add_match(j, "_UID=0", 0))
);
return r;
}