X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fjournalctl.c;h=eb79c4d8537e192d61b4f31537fa339ac510b2b6;hp=642e20d43fbbb0d705977ae4b96356e595d3ac41;hb=5ec76417764e19486261fb8e38e8e71b28185b37;hpb=7f602784de4fd378120e8ebfe6d830862b9cae03 diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 642e20d43..eb79c4d85 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -72,6 +71,7 @@ static bool arg_no_tail = false; static bool arg_quiet = false; static bool arg_merge = false; static bool arg_this_boot = false; +static bool arg_dmesg = false; static const char *arg_cursor = NULL; static const char *arg_directory = NULL; static int arg_priorities = 0xFF; @@ -81,8 +81,8 @@ static usec_t arg_interval = DEFAULT_FSS_INTERVAL_USEC; #endif static usec_t arg_since, arg_until; static bool arg_since_set = false, arg_until_set = false; -static const char *arg_unit = NULL; -static bool arg_unit_system; +static char **arg_system_units = NULL; +static char **arg_user_units = NULL; static const char *arg_field = NULL; static bool arg_catalog = false; static bool arg_reverse = false; @@ -109,6 +109,7 @@ static int help(void) { " --until=DATE Stop showing entries older or of the specified date\n" " -c --cursor=CURSOR Start showing entries from specified cursor\n" " -b --this-boot Show data only from current boot\n" + " -k --dmesg Show kmsg log from current boot\n" " -u --unit=UNIT Show data only from the specified unit\n" " --user-unit=UNIT Show data only from the specified user session unit\n" " -p --priority=RANGE Show only messages within the specified priority range\n" @@ -188,6 +189,7 @@ static int parse_argv(int argc, char *argv[]) { { "quiet", no_argument, NULL, 'q' }, { "merge", no_argument, NULL, 'm' }, { "this-boot", no_argument, NULL, 'b' }, + { "dmesg", no_argument, NULL, 'k' }, { "directory", required_argument, NULL, 'D' }, { "root", required_argument, NULL, ARG_ROOT }, { "header", no_argument, NULL, ARG_HEADER }, @@ -216,7 +218,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hefo:an::qmbD:p:c:u:F:xr", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hefo:an::qmbkD:p:c:u:F:xr", options, NULL)) >= 0) { switch (c) { @@ -318,6 +320,10 @@ static int parse_argv(int argc, char *argv[]) { arg_this_boot = true; break; + case 'k': + arg_this_boot = arg_dmesg = true; + break; + case 'D': arg_directory = optarg; break; @@ -438,13 +444,15 @@ static int parse_argv(int argc, char *argv[]) { break; case 'u': - arg_unit = optarg; - arg_unit_system = true; + r = strv_extend(&arg_system_units, optarg); + if (r < 0) + return log_oom(); break; case ARG_USER_UNIT: - arg_unit = optarg; - arg_unit_system = false; + r = strv_extend(&arg_user_units, optarg); + if (r < 0) + return log_oom(); break; case '?': @@ -543,7 +551,7 @@ static int add_matches(sd_journal *j, char **args) { if (streq(*i, "+")) r = sd_journal_add_disjunction(j); else if (path_is_absolute(*i)) { - char _cleanup_free_ *p, *t = NULL; + _cleanup_free_ char *p, *t = NULL; const char *path; struct stat st; @@ -583,48 +591,67 @@ static int add_matches(sd_journal *j, char **args) { } static int add_this_boot(sd_journal *j) { - char match[9+32+1] = "_BOOT_ID="; - sd_id128_t boot_id; - int r; + if (!arg_this_boot) + return 0; + + return add_match_this_boot(j); +} +static int add_dmesg(sd_journal *j) { + int r; assert(j); - if (!arg_this_boot) + if (!arg_dmesg) return 0; - r = sd_id128_get_boot(&boot_id); + r = sd_journal_add_match(j, "_TRANSPORT=kernel", strlen("_TRANSPORT=kernel")); if (r < 0) { - log_error("Failed to get boot id: %s", strerror(-r)); + log_error("Failed to add match: %s", strerror(-r)); return r; } - sd_id128_to_string(boot_id, match + 9); - r = sd_journal_add_match(j, match, strlen(match)); - if (r < 0) { - log_error("Failed to add match: %s", strerror(-r)); + r = sd_journal_add_conjunction(j); + if (r < 0) return r; - } return 0; } -static int add_unit(sd_journal *j) { +static int add_units(sd_journal *j) { _cleanup_free_ char *u = NULL; int r; + char **i; assert(j); - if (isempty(arg_unit)) - return 0; + STRV_FOREACH(i, arg_system_units) { + u = unit_name_mangle(*i); + if (!u) + return log_oom(); + r = add_matches_for_unit(j, u); + if (r < 0) + return r; + r = sd_journal_add_disjunction(j); + if (r < 0) + return r; + } - u = unit_name_mangle(arg_unit); - if (!u) - return log_oom(); + STRV_FOREACH(i, arg_user_units) { + u = unit_name_mangle(*i); + if (!u) + return log_oom(); - if (arg_unit_system) - r = add_matches_for_unit(j, u); - else r = add_matches_for_user_unit(j, u, getuid()); + if (r < 0) + return r; + + r = sd_journal_add_disjunction(j); + if (r < 0) + return r; + + } + + r = sd_journal_add_conjunction(j); if (r < 0) return r; @@ -634,7 +661,6 @@ static int add_unit(sd_journal *j) { static int add_priorities(sd_journal *j) { char match[] = "PRIORITY=0"; int i, r; - assert(j); if (arg_priorities == 0xFF) @@ -651,6 +677,10 @@ static int add_priorities(sd_journal *j) { } } + r = sd_journal_add_conjunction(j); + if (r < 0) + return r; + return 0; } @@ -804,12 +834,12 @@ static int setup_keys(void) { fprintf(stderr, ANSI_HIGHLIGHT_OFF "\n" "The sealing key is automatically changed every %s.\n", - format_timespan(tsb, sizeof(tsb), arg_interval)); + format_timespan(tsb, sizeof(tsb), arg_interval, 0)); hn = gethostname_malloc(); if (hn) { - hostname_cleanup(hn); + hostname_cleanup(hn, false); fprintf(stderr, "\nThe keys have been generated for host %s/" SD_ID128_FORMAT_STR ".\n", hn, SD_ID128_FORMAT_VAL(machine)); } else fprintf(stderr, "\nThe keys have been generated for host " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(machine)); @@ -878,10 +908,10 @@ static int verify(sd_journal *j) { log_info("=> Validated from %s to %s, final %s entries not sealed.", format_timestamp(a, sizeof(a), first), format_timestamp(b, sizeof(b), validated), - format_timespan(c, sizeof(c), last > validated ? last - validated : 0)); + format_timespan(c, sizeof(c), last > validated ? last - validated : 0, 0)); } else if (last > 0) log_info("=> No sealing yet, %s of entries not sealed.", - format_timespan(c, sizeof(c), last - first)); + format_timespan(c, sizeof(c), last - first, 0)); else log_info("=> No sealing yet, no entries in file."); } @@ -1002,7 +1032,7 @@ static int access_check(sd_journal *j) { int main(int argc, char *argv[]) { int r; - sd_journal _cleanup_journal_close_ *j = NULL; + _cleanup_journal_close_ sd_journal*j = NULL; bool need_seek = false; sd_id128_t previous_boot_id; bool previous_boot_id_valid = false, first_line = true; @@ -1033,10 +1063,10 @@ int main(int argc, char *argv[]) { arg_action == ACTION_DUMP_CATALOG) { const char* database = CATALOG_DATABASE; - char _cleanup_free_ *copy = NULL; + _cleanup_free_ char *copy = NULL; if (arg_root) { copy = strjoin(arg_root, "/", CATALOG_DATABASE, NULL); - if (!database) { + if (!copy) { r = log_oom(); goto finish; } @@ -1103,11 +1133,14 @@ int main(int argc, char *argv[]) { if (r < 0) return EXIT_FAILURE; - r = add_unit(j); + r = add_dmesg(j); if (r < 0) return EXIT_FAILURE; - r = add_matches(j, argv + optind); + r = add_units(j); + strv_free(arg_system_units); + strv_free(arg_user_units); + if (r < 0) return EXIT_FAILURE; @@ -1115,6 +1148,10 @@ int main(int argc, char *argv[]) { if (r < 0) return EXIT_FAILURE; + r = add_matches(j, argv + optind); + if (r < 0) + return EXIT_FAILURE; + /* Opening the fd now means the first sd_journal_wait() will actually wait */ r = sd_journal_get_fd(j); if (r < 0) @@ -1124,6 +1161,12 @@ int main(int argc, char *argv[]) { const void *data; size_t size; + r = sd_journal_set_data_threshold(j, 0); + if (r < 0) { + log_error("Failed to unset data size threshold"); + return EXIT_FAILURE; + } + r = sd_journal_query_unique(j, arg_field); if (r < 0) { log_error("Failed to query unique data objects: %s", strerror(-r));