X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournalctl.c;h=f404e414f46f8d9b25c4fb0993f212aa3c786691;hb=3f3a438f58d7b1d2ba2b44d6d356fb1eaa65b66a;hp=2e672fa09655fb93dd26774c5acb6b73ebfc5e49;hpb=99271804172f6ac51be9556b2bdf37d6a7e952bc;p=elogind.git diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 2e672fa09..f404e414f 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -86,6 +86,7 @@ static char **arg_user_units = NULL; static const char *arg_field = NULL; static bool arg_catalog = false; static bool arg_reverse = false; +static int arg_journal_type = 0; static const char *arg_root = NULL; static enum { @@ -105,6 +106,8 @@ static int help(void) { printf("%s [OPTIONS...] [MATCHES...]\n\n" "Query the journal.\n\n" "Flags:\n" + " --system Show only the system journal\n" + " --user Show only the user journal for current user\n" " --since=DATE Start showing entries newer or of the specified date\n" " --until=DATE Stop showing entries older or of the specified date\n" " -c --cursor=CURSOR Start showing entries from specified cursor\n" @@ -158,6 +161,8 @@ static int parse_argv(int argc, char *argv[]) { ARG_NO_PAGER, ARG_NO_TAIL, ARG_NEW_ID128, + ARG_USER, + ARG_SYSTEM, ARG_ROOT, ARG_HEADER, ARG_FULL, @@ -171,7 +176,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_USER_UNIT, ARG_LIST_CATALOG, ARG_DUMP_CATALOG, - ARG_UPDATE_CATALOG + ARG_UPDATE_CATALOG, }; static const struct option options[] = { @@ -190,6 +195,8 @@ static int parse_argv(int argc, char *argv[]) { { "merge", no_argument, NULL, 'm' }, { "this-boot", no_argument, NULL, 'b' }, { "dmesg", no_argument, NULL, 'k' }, + { "system", no_argument, NULL, ARG_SYSTEM }, + { "user", no_argument, NULL, ARG_USER }, { "directory", required_argument, NULL, 'D' }, { "root", required_argument, NULL, ARG_ROOT }, { "header", no_argument, NULL, ARG_HEADER }, @@ -324,6 +331,14 @@ static int parse_argv(int argc, char *argv[]) { arg_this_boot = arg_dmesg = true; break; + case ARG_SYSTEM: + arg_journal_type |= SD_JOURNAL_SYSTEM; + break; + + case ARG_USER: + arg_journal_type |= SD_JOURNAL_CURRENT_USER; + break; + case 'D': arg_directory = optarg; break; @@ -591,33 +606,10 @@ 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; - - assert(j); - if (!arg_this_boot) return 0; - r = sd_id128_get_boot(&boot_id); - if (r < 0) { - log_error("Failed to get boot id: %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)); - return r; - } - - r = sd_journal_add_conjunction(j); - if (r < 0) - return r; - - return 0; + return add_match_this_boot(j); } static int add_dmesg(sd_journal *j) { @@ -1117,9 +1109,9 @@ int main(int argc, char *argv[]) { } if (arg_directory) - r = sd_journal_open_directory(&j, arg_directory, 0); + r = sd_journal_open_directory(&j, arg_directory, arg_journal_type); else - r = sd_journal_open(&j, arg_merge ? 0 : SD_JOURNAL_LOCAL_ONLY); + r = sd_journal_open(&j, !arg_merge*SD_JOURNAL_LOCAL_ONLY + arg_journal_type); if (r < 0) { log_error("Failed to open journal: %s", strerror(-r)); return EXIT_FAILURE; @@ -1311,11 +1303,10 @@ int main(int argc, char *argv[]) { log_error("Failed to iterate through journal: %s", strerror(-r)); goto finish; } + if (r == 0) + break; } - if (r == 0) - break; - if (arg_until_set && !arg_reverse) { usec_t usec; @@ -1361,10 +1352,12 @@ int main(int argc, char *argv[]) { arg_catalog * OUTPUT_CATALOG; r = output_journal(stdout, j, arg_output, 0, flags); - if (r < 0 || ferror(stdout)) + need_seek = true; + if (r == -EADDRNOTAVAIL) + break; + else if (r < 0 || ferror(stdout)) goto finish; - need_seek = true; n_shown++; }