Merge pull request #3622 from keszybz/journalctl-this-boot

Make `journalctl --directory=... --boot 0` work
This commit is contained in:
Lennart Poettering 2016-06-29 22:25:08 +02:00 committed by GitHub
commit f68032265d

View file

@ -348,6 +348,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_NO_FULL,
ARG_NO_TAIL,
ARG_NEW_ID128,
ARG_THIS_BOOT,
ARG_LIST_BOOTS,
ARG_USER,
ARG_SYSTEM,
@ -392,9 +393,9 @@ static int parse_argv(int argc, char *argv[]) {
{ "new-id128", no_argument, NULL, ARG_NEW_ID128 },
{ "quiet", no_argument, NULL, 'q' },
{ "merge", no_argument, NULL, 'm' },
{ "this-boot", no_argument, NULL, ARG_THIS_BOOT }, /* deprecated */
{ "boot", optional_argument, NULL, 'b' },
{ "list-boots", no_argument, NULL, ARG_LIST_BOOTS },
{ "this-boot", optional_argument, NULL, 'b' }, /* deprecated */
{ "dmesg", no_argument, NULL, 'k' },
{ "system", no_argument, NULL, ARG_SYSTEM },
{ "user", no_argument, NULL, ARG_USER },
@ -544,6 +545,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_merge = true;
break;
case ARG_THIS_BOOT:
arg_boot = true;
break;
case 'b':
arg_boot = true;
@ -868,8 +873,8 @@ static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
}
if ((arg_boot || arg_action == ACTION_LIST_BOOTS) && (arg_file || arg_directory || arg_merge)) {
log_error("Using --boot or --list-boots with --file, --directory or --merge is not supported.");
if ((arg_boot || arg_action == ACTION_LIST_BOOTS) && arg_merge) {
log_error("Using --boot or --list-boots with --merge is not supported.");
return -EINVAL;
}
@ -1102,13 +1107,13 @@ static int discover_next_boot(sd_journal *j,
static int get_boots(
sd_journal *j,
BootId **boots,
sd_id128_t *query_ref_boot,
int ref_boot_offset) {
sd_id128_t *boot_id,
int offset) {
bool skip_once;
int r, count = 0;
BootId *head = NULL, *tail = NULL;
const bool advance_older = query_ref_boot && ref_boot_offset <= 0;
const bool advance_older = boot_id && offset <= 0;
sd_id128_t previous_boot_id;
assert(j);
@ -1116,19 +1121,19 @@ static int get_boots(
/* Adjust for the asymmetry that offset 0 is
* the last (and current) boot, while 1 is considered the
* (chronological) first boot in the journal. */
skip_once = query_ref_boot && sd_id128_is_null(*query_ref_boot) && ref_boot_offset < 0;
skip_once = boot_id && sd_id128_is_null(*boot_id) && offset <= 0;
/* Advance to the earliest/latest occurrence of our reference
* boot ID (taking our lookup direction into account), so that
* discover_next_boot() can do its job.
* If no reference is given, the journal head/tail will do,
* they're "virtual" boots after all. */
if (query_ref_boot && !sd_id128_is_null(*query_ref_boot)) {
if (boot_id && !sd_id128_is_null(*boot_id)) {
char match[9+32+1] = "_BOOT_ID=";
sd_journal_flush_matches(j);
sd_id128_to_string(*query_ref_boot, match + 9);
sd_id128_to_string(*boot_id, match + 9);
r = sd_journal_add_match(j, match, sizeof(match) - 1);
if (r < 0)
return r;
@ -1148,7 +1153,7 @@ static int get_boots(
return r;
else if (r == 0)
goto finish;
else if (ref_boot_offset == 0) {
else if (offset == 0) {
count = 1;
goto finish;
}
@ -1187,14 +1192,14 @@ static int get_boots(
previous_boot_id = current->id;
if (query_ref_boot) {
if (boot_id) {
if (!skip_once)
ref_boot_offset += advance_older ? 1 : -1;
offset += advance_older ? 1 : -1;
skip_once = false;
if (ref_boot_offset == 0) {
if (offset == 0) {
count = 1;
*query_ref_boot = current->id;
*boot_id = current->id;
break;
}
} else {
@ -1250,7 +1255,7 @@ static int list_boots(sd_journal *j) {
static int add_boot(sd_journal *j) {
char match[9+32+1] = "_BOOT_ID=";
sd_id128_t ref_boot_id;
sd_id128_t boot_id;
int r;
assert(j);
@ -1258,11 +1263,16 @@ static int add_boot(sd_journal *j) {
if (!arg_boot)
return 0;
if (arg_boot_offset == 0 && sd_id128_equal(arg_boot_id, SD_ID128_NULL))
/* Take a shortcut and use the current boot_id, which we can do very quickly.
* We can do this only when we logs are coming from the current machine,
* so take the slow path if log location is specified. */
if (arg_boot_offset == 0 && sd_id128_equal(arg_boot_id, SD_ID128_NULL) &&
!arg_directory && !arg_file)
return add_match_this_boot(j, arg_machine);
ref_boot_id = arg_boot_id;
r = get_boots(j, NULL, &ref_boot_id, arg_boot_offset);
boot_id = arg_boot_id;
r = get_boots(j, NULL, &boot_id, arg_boot_offset);
assert(r <= 1);
if (r <= 0) {
const char *reason = (r == 0) ? "No such boot ID in journal" : strerror(-r);
@ -1277,7 +1287,7 @@ static int add_boot(sd_journal *j) {
return r == 0 ? -ENODATA : r;
}
sd_id128_to_string(ref_boot_id, match + 9);
sd_id128_to_string(boot_id, match + 9);
r = sd_journal_add_match(j, match, sizeof(match) - 1);
if (r < 0)