X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fjournal%2Fjournalctl.c;h=d1b201beba24918457223791a41b3d9814ee9e96;hb=4826f0b7b5c0aefa08b8cc7ef64d69027f84da2c;hp=002ff7cda08d5ad98c52b383cd7122de0672e9f2;hpb=3a819b1b6289311ebf09e94c6240dfb6be7a0496;p=elogind.git diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 002ff7cda..d1b201beb 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -80,8 +80,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; @@ -437,13 +437,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 '?': @@ -542,7 +544,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; @@ -604,26 +606,48 @@ static int add_this_boot(sd_journal *j) { return 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; @@ -633,7 +657,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) @@ -650,6 +673,10 @@ static int add_priorities(sd_journal *j) { } } + r = sd_journal_add_conjunction(j); + if (r < 0) + return r; + return 0; } @@ -1001,7 +1028,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; @@ -1032,7 +1059,7 @@ 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 (!copy) { @@ -1102,15 +1129,18 @@ int main(int argc, char *argv[]) { if (r < 0) return EXIT_FAILURE; - r = add_unit(j); + r = add_units(j); + strv_free(arg_system_units); + strv_free(arg_user_units); + if (r < 0) return EXIT_FAILURE; - r = add_matches(j, argv + optind); + r = add_priorities(j); if (r < 0) return EXIT_FAILURE; - r = add_priorities(j); + r = add_matches(j, argv + optind); if (r < 0) return EXIT_FAILURE; @@ -1123,6 +1153,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));