X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Flogs-show.c;h=068da465d9fcdb816c9230cbe6cc6d251b110939;hp=2da4ef3e120b664bcd312a13110c2d7f235f227f;hb=50a96c06b50537a9ef00837c09dbc0cafe8d8809;hpb=f647962d64e844689f3e2acfce6102fc47e76df2 diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 2da4ef3e1..068da465d 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -20,9 +20,7 @@ ***/ #include -#include #include -#include #include #include #include @@ -32,8 +30,10 @@ #include "util.h" #include "utf8.h" #include "hashmap.h" -#include "fileio.h" #include "journal-internal.h" +#include "formats-util.h" +#include "process-util.h" +#include "terminal-util.h" /* up to three lines (each up to 100 characters), or 300 characters, whichever is less */ @@ -272,10 +272,12 @@ static int output_short( } if (r < 0) - return r; + return log_error_errno(r, "Failed to get journal fields: %m"); - if (!message) + if (!message) { + log_debug("Skipping message without MESSAGE= field."); return 0; + } if (!(flags & OUTPUT_SHOW_ALL)) strip_tab_ansi(&message, &message_len); @@ -408,11 +410,9 @@ static int output_verbose( r = sd_journal_get_data(j, "_SOURCE_REALTIME_TIMESTAMP", &data, &length); if (r == -ENOENT) log_debug("Source realtime timestamp not found"); - else if (r < 0) { - log_full(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_ERR, - "Failed to get source realtime timestamp: %s", strerror(-r)); - return r; - } else { + else if (r < 0) + return log_full_errno(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_ERR, r, "Failed to get source realtime timestamp: %m"); + else { _cleanup_free_ char *value = NULL; size_t size; @@ -428,11 +428,8 @@ static int output_verbose( if (r < 0) { r = sd_journal_get_realtime_usec(j, &realtime); - if (r < 0) { - log_full(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_ERR, - "Failed to get realtime timestamp: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_full_errno(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_ERR, r, "Failed to get realtime timestamp: %m"); } r = sd_journal_get_cursor(j, &cursor); @@ -682,7 +679,7 @@ static int output_json( h = hashmap_new(&string_hash_ops); if (!h) - return -ENOMEM; + return log_oom(); /* First round, iterate through the entry and count how often each field appears */ JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) { @@ -700,7 +697,7 @@ static int output_json( n = strndup(data, eq - (const char*) data); if (!n) { - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -709,13 +706,16 @@ static int output_json( r = hashmap_put(h, n, UINT_TO_PTR(1)); if (r < 0) { free(n); + log_oom(); goto finish; } } else { r = hashmap_update(h, n, UINT_TO_PTR(u + 1)); free(n); - if (r < 0) + if (r < 0) { + log_oom(); goto finish; + } } } @@ -753,7 +753,7 @@ static int output_json( n = strndup(data, m); if (!n) { - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -858,8 +858,7 @@ static int output_cat( if (r == -ENOENT) return 0; - log_error_errno(r, "Failed to get data: %m"); - return r; + return log_error_errno(r, "Failed to get data: %m"); } assert(l >= 8); @@ -949,11 +948,11 @@ static int show_journal(FILE *f, /* Seek to end */ r = sd_journal_seek_tail(j); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to seek to tail: %m"); r = sd_journal_previous_skip(j, how_many); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to skip previous: %m"); for (;;) { for (;;) { @@ -962,7 +961,7 @@ static int show_journal(FILE *f, if (need_seek) { r = sd_journal_next(j); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to iterate through journal: %m"); } if (r == 0) @@ -978,7 +977,7 @@ static int show_journal(FILE *f, if (r == -ESTALE) continue; else if (r < 0) - goto finish; + return log_error_errno(r, "Failed to get journal time: %m"); if (usec < not_before) continue; @@ -989,22 +988,22 @@ static int show_journal(FILE *f, r = output_journal(f, j, mode, n_columns, flags, ellipsized); if (r < 0) - goto finish; + return r; } if (warn_cutoff && line < how_many && not_before > 0) { sd_id128_t boot_id; - usec_t cutoff; + usec_t cutoff = 0; /* Check whether the cutoff line is too early */ r = sd_id128_get_boot(&boot_id); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to get boot id: %m"); r = sd_journal_get_cutoff_monotonic_usec(j, boot_id, &cutoff, NULL); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to get journal cutoff time: %m"); if (r > 0 && not_before < cutoff) { maybe_print_begin_newline(f, &flags); @@ -1019,12 +1018,11 @@ static int show_journal(FILE *f, r = sd_journal_wait(j, USEC_INFINITY); if (r < 0) - goto finish; + return log_error_errno(r, "Failed to wait for journal: %m"); } -finish: - return r; + return 0; } int add_matches_for_unit(sd_journal *j, const char *unit) { @@ -1034,10 +1032,10 @@ int add_matches_for_unit(sd_journal *j, const char *unit) { assert(j); assert(unit); - m1 = strappenda("_SYSTEMD_UNIT=", unit); - m2 = strappenda("COREDUMP_UNIT=", unit); - m3 = strappenda("UNIT=", unit); - m4 = strappenda("OBJECT_SYSTEMD_UNIT=", unit); + m1 = strjoina("_SYSTEMD_UNIT=", unit); + m2 = strjoina("COREDUMP_UNIT=", unit); + m3 = strjoina("UNIT=", unit); + m4 = strjoina("OBJECT_SYSTEMD_UNIT=", unit); (void)( /* Look for messages from the service itself */ @@ -1081,10 +1079,10 @@ int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) { assert(j); assert(unit); - m1 = strappenda("_SYSTEMD_USER_UNIT=", unit); - m2 = strappenda("USER_UNIT=", unit); - m3 = strappenda("COREDUMP_USER_UNIT=", unit); - m4 = strappenda("OBJECT_SYSTEMD_USER_UNIT=", unit); + m1 = strjoina("_SYSTEMD_USER_UNIT=", unit); + m2 = strjoina("USER_UNIT=", unit); + m3 = strjoina("COREDUMP_USER_UNIT=", unit); + m4 = strjoina("OBJECT_SYSTEMD_USER_UNIT=", unit); sprintf(muid, "_UID="UID_FMT, uid); (void) ( @@ -1167,9 +1165,9 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { if (fd < 0) _exit(EXIT_FAILURE); - k = loop_read(fd, buf, 36, false); + r = loop_read_exact(fd, buf, 36, false); safe_close(fd); - if (k != 36) + if (r < 0) _exit(EXIT_FAILURE); k = send(pair[1], buf, 36, MSG_NOSIGNAL); @@ -1221,7 +1219,7 @@ int add_match_this_boot(sd_journal *j, const char *machine) { r = sd_journal_add_conjunction(j); if (r < 0) - return r; + return log_error_errno(r, "Failed to add conjunction: %m"); return 0; } @@ -1235,12 +1233,12 @@ int show_journal_by_unit( unsigned how_many, uid_t uid, OutputFlags flags, - bool system, + int journal_open_flags, + bool system_unit, bool *ellipsized) { _cleanup_journal_close_ sd_journal*j = NULL; int r; - int jflags = SD_JOURNAL_LOCAL_ONLY | system * SD_JOURNAL_SYSTEM; assert(mode >= 0); assert(mode < _OUTPUT_MODE_MAX); @@ -1249,25 +1247,28 @@ int show_journal_by_unit( if (how_many <= 0) return 0; - r = sd_journal_open(&j, jflags); + r = sd_journal_open(&j, journal_open_flags); if (r < 0) - return r; + return log_error_errno(r, "Failed to open journal: %m"); r = add_match_this_boot(j, NULL); if (r < 0) return r; - if (system) + if (system_unit) r = add_matches_for_unit(j, unit); else r = add_matches_for_user_unit(j, unit, uid); if (r < 0) - return r; + return log_error_errno(r, "Failed to add unit matches: %m"); - if (_unlikely_(log_get_max_level() >= LOG_PRI(LOG_DEBUG))) { + if (_unlikely_(log_get_max_level() >= LOG_DEBUG)) { _cleanup_free_ char *filter; filter = journal_make_match_string(j); + if (!filter) + return log_oom(); + log_debug("Journal filter: %s", filter); }