journal-remote: parse the _BOOT_ID field and use the value when writing entries

The boot id is stored twice, and different code paths use either one or the
other. So we need to store it both in the header and as a field for full
compatibility.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2018-05-27 11:35:07 +02:00
parent d180c34998
commit c0b6ada757
2 changed files with 32 additions and 17 deletions

View File

@ -246,26 +246,26 @@ static int get_data_newline(JournalImporter *imp) {
return 1;
}
static int process_dunder(JournalImporter *imp, char *line) {
const char *timestamp;
static int process_special_field(JournalImporter *imp, char *line) {
const char *value;
char buf[CELLESCAPE_DEFAULT_LENGTH];
int r;
assert(line);
timestamp = startswith(line, "__CURSOR=");
if (timestamp)
value = startswith(line, "__CURSOR=");
if (value)
/* ignore __CURSOR */
return 1;
timestamp = startswith(line, "__REALTIME_TIMESTAMP=");
if (timestamp) {
value = startswith(line, "__REALTIME_TIMESTAMP=");
if (value) {
uint64_t x;
r = safe_atou64(timestamp, &x);
r = safe_atou64(value, &x);
if (r < 0)
return log_warning_errno(r, "Failed to parse __REALTIME_TIMESTAMP '%s': %m",
cellescape(buf, sizeof buf, timestamp));
cellescape(buf, sizeof buf, value));
else if (!VALID_REALTIME(x)) {
log_warning("__REALTIME_TIMESTAMP out of range, ignoring: %"PRIu64, x);
return -ERANGE;
@ -275,14 +275,14 @@ static int process_dunder(JournalImporter *imp, char *line) {
return 1;
}
timestamp = startswith(line, "__MONOTONIC_TIMESTAMP=");
if (timestamp) {
value = startswith(line, "__MONOTONIC_TIMESTAMP=");
if (value) {
uint64_t x;
r = safe_atou64(timestamp, &x);
r = safe_atou64(value, &x);
if (r < 0)
return log_warning_errno(r, "Failed to parse __MONOTONIC_TIMESTAMP '%s': %m",
cellescape(buf, sizeof buf, timestamp));
cellescape(buf, sizeof buf, value));
else if (!VALID_MONOTONIC(x)) {
log_warning("__MONOTONIC_TIMESTAMP out of range, ignoring: %"PRIu64, x);
return -ERANGE;
@ -292,9 +292,21 @@ static int process_dunder(JournalImporter *imp, char *line) {
return 1;
}
timestamp = startswith(line, "__");
if (timestamp) {
log_notice("Unknown dunder line __%s, ignoring.", cellescape(buf, sizeof buf, timestamp));
/* Just a single underline, but it needs special treatment too. */
value = startswith(line, "_BOOT_ID=");
if (value) {
r = sd_id128_from_string(value, &imp->boot_id);
if (r < 0)
return log_warning_errno(r, "Failed to parse _BOOT_ID '%s': %m",
cellescape(buf, sizeof buf, value));
/* store the field in the usual fashion too */
return 0;
}
value = startswith(line, "__");
if (value) {
log_notice("Unknown dunder line __%s, ignoring.", cellescape(buf, sizeof buf, value));
return 1;
}
@ -342,13 +354,13 @@ int journal_importer_process_data(JournalImporter *imp) {
t = strndupa(line, sep - line);
log_debug("Ignoring invalid field: \"%s\"",
cellescape(buf, t));
cellescape(buf, sizeof buf, t));
return 0;
}
line[n] = '\0';
r = process_dunder(imp, line);
r = process_special_field(imp, line);
if (r != 0)
return r < 0 ? r : 0;

View File

@ -11,6 +11,8 @@
#include <stdbool.h>
#include <sys/uio.h>
#include "sd-id128.h"
#include "time-util.h"
/* Make sure not to make this smaller than the maximum coredump size.
@ -45,6 +47,7 @@ typedef struct JournalImporter {
int state;
dual_timestamp ts;
sd_id128_t boot_id;
} JournalImporter;
void journal_importer_cleanup(JournalImporter *);