X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fjournalctl.c;h=b347dfa18713c5c10be152b67db7371dcba02a22;hp=e38721df45c841211a0893d5388e07ce2993bdd4;hb=cf5bccc2bb9569030cb04debbc4208aaca0fe5b4;hpb=f11880744c27209a42f502c690db86b38d2db14b diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index e38721df4..b347dfa18 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -48,7 +48,6 @@ #include "fileio.h" #include "build.h" #include "pager.h" -#include "logs-show.h" #include "strv.h" #include "journal-internal.h" #include "journal-def.h" @@ -94,6 +93,7 @@ static bool arg_catalog = false; static bool arg_reverse = false; static int arg_journal_type = 0; static const char *arg_root = NULL; +static const char *arg_machine = NULL; static enum { ACTION_SHOW, @@ -114,36 +114,47 @@ typedef struct boot_id_t { uint64_t last; } boot_id_t; +static void pager_open_if_enabled(void) { + + if (arg_no_pager) + return; + + pager_open(arg_pager_end); +} + static int help(void) { + pager_open_if_enabled(); + 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" - " --after-cursor=CURSOR Start showing entries from specified cursor\n" + " --user Show only the user journal for the current user\n" + " -M --machine=CONTAINER Operate on local container\n" + " --since=DATE Start showing entries on or newer than the specified date\n" + " --until=DATE Stop showing entries on or older than the specified date\n" + " -c --cursor=CURSOR Start showing entries from the specified cursor\n" + " --after-cursor=CURSOR Start showing entries from after the specified cursor\n" " --show-cursor Print the cursor after all the entries\n" - " -b --boot[=ID] Show data only from ID or current boot if unspecified\n" + " -b --boot[=ID] Show data only from ID or, if unspecified, the current boot\n" " --list-boots Show terse information about recorded boots\n" - " -k --dmesg Show kernel message log from current boot\n" + " -k --dmesg Show kernel message log from the 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" " -e --pager-end Immediately jump to end of the journal in the pager\n" - " -f --follow Follow journal\n" + " -f --follow Follow the journal\n" " -n --lines[=INTEGER] Number of journal entries to show\n" " --no-tail Show all lines, even in follow mode\n" " -r --reverse Show the newest entries first\n" " -o --output=STRING Change journal output mode (short, short-iso,\n" - " short-precise, short-monotonic, verbose,\n" - " export, json, json-pretty, json-sse, cat)\n" + " short-precise, short-monotonic, verbose,\n" + " export, json, json-pretty, json-sse, cat)\n" " -x --catalog Add message explanations where available\n" " --no-full Ellipsize fields\n" " -a --all Show all fields, including long and unprintable\n" - " -q --quiet Don't show privilege warning\n" + " -q --quiet Do not show privilege warning\n" " --no-pager Do not pipe output into a pager\n" " -m --merge Show entries from all available journals\n" " -D --directory=PATH Show journal files from directory\n" @@ -152,20 +163,20 @@ static int help(void) { #ifdef HAVE_GCRYPT " --interval=TIME Time interval for changing the FSS sealing key\n" " --verify-key=KEY Specify FSS verification key\n" - " --force Force overriding new FSS key pair with --setup-keys\n" + " --force Force overriding of the FSS key pair with --setup-keys\n" #endif "\nCommands:\n" - " -h --help Show this help\n" + " -h --help Show this help text\n" " --version Show package version\n" - " --new-id128 Generate a new 128 Bit ID\n" + " --new-id128 Generate a new 128-bit ID\n" " --header Show journal header information\n" - " --disk-usage Show total disk usage\n" - " -F --field=FIELD List all values a certain field takes\n" + " --disk-usage Show total disk usage of all journal files\n" + " -F --field=FIELD List all values that a specified field takes\n" " --list-catalog Show message IDs of all entries in the message catalog\n" " --dump-catalog Show entries in the message catalog\n" " --update-catalog Update the message catalog database\n" #ifdef HAVE_GCRYPT - " --setup-keys Generate new FSS key pair\n" + " --setup-keys Generate a new FSS key pair\n" " --verify Verify journal file consistency\n" #endif , program_invocation_short_name); @@ -248,7 +259,8 @@ static int parse_argv(int argc, char *argv[]) { { "dump-catalog", no_argument, NULL, ARG_DUMP_CATALOG }, { "update-catalog", no_argument, NULL, ARG_UPDATE_CATALOG }, { "reverse", no_argument, NULL, 'r' }, - { NULL, 0, NULL, 0 } + { "machine", required_argument, NULL, 'M' }, + {} }; int c, r; @@ -256,13 +268,12 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:u:F:xr", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hefo:aln::qmb::kD:p:c:u:F:xrM:", options, NULL)) >= 0) { switch (c) { case 'h': - help(); - return 0; + return help(); case ARG_VERSION: puts(PACKAGE_STRING); @@ -360,18 +371,7 @@ static int parse_argv(int argc, char *argv[]) { case 'b': arg_boot = true; - - if (optarg) - arg_boot_descriptor = optarg; - else if (optind < argc) { - int boot; - - if (argv[optind][0] != '-' || - safe_atoi(argv[optind], &boot) >= 0) { - arg_boot_descriptor = argv[optind]; - optind++; - } - } + arg_boot_descriptor = optarg; break; @@ -391,6 +391,10 @@ static int parse_argv(int argc, char *argv[]) { arg_journal_type |= SD_JOURNAL_CURRENT_USER; break; + case 'M': + arg_machine = optarg; + break; + case 'D': arg_directory = optarg; break; @@ -543,9 +547,6 @@ static int parse_argv(int argc, char *argv[]) { return log_oom(); break; - case '?': - return -EINVAL; - case 'F': arg_field = optarg; break; @@ -570,17 +571,19 @@ static int parse_argv(int argc, char *argv[]) { arg_reverse = true; break; - default: - log_error("Unknown option code %c", c); + case '?': return -EINVAL; + + default: + assert_not_reached("Unhandled option"); } } if (arg_follow && !arg_no_tail && arg_lines < 0) arg_lines = 10; - if (arg_directory && arg_file) { - log_error("Please specify either -D/--directory= or --file=, not both."); + if (!!arg_directory + !!arg_file + !!arg_machine > 1) { + log_error("Please specify either -D/--directory= or --file= or -M/--machine=, not more than one."); return -EINVAL; } @@ -661,7 +664,7 @@ static int add_matches(sd_journal *j, char **args) { if (executable_is_script(path, &interpreter) > 0) { _cleanup_free_ char *comm; - comm = strndup(path_get_file_name(path), 15); + comm = strndup(basename(path), 15); if (!comm) return log_oom(); @@ -884,7 +887,7 @@ static int add_boot(sd_journal *j) { return 0; if (!arg_boot_descriptor) - return add_match_this_boot(j); + return add_match_this_boot(j, arg_machine); if (strlen(arg_boot_descriptor) >= 32) { char tmp = arg_boot_descriptor[32]; @@ -1463,6 +1466,8 @@ int main(int argc, char *argv[]) { r = sd_journal_open_directory(&j, arg_directory, arg_journal_type); else if (arg_file) r = sd_journal_open_files(&j, (const char**) arg_file, 0); + else if (arg_machine) + r = sd_journal_open_container(&j, arg_machine, 0); else r = sd_journal_open(&j, !arg_merge*SD_JOURNAL_LOCAL_ONLY + arg_journal_type); if (r < 0) { @@ -1641,8 +1646,8 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - if (!arg_no_pager && !arg_follow) - pager_open(arg_pager_end); + if (!arg_follow) + pager_open_if_enabled(); if (!arg_quiet) { usec_t start, end;