h1 = le64toh(o->data.hash);
if (o->object.flags & OBJECT_COMPRESSED) {
+#ifdef HAVE_XZ
void *b = NULL;
uint64_t alloc = 0, b_size;
h2 = hash64(b, b_size);
free(b);
+#else
+ return -EPROTONOSUPPORT;
+#endif
} else
h2 = hash64(o->data.payload, le64toh(o->object.size) - offsetof(Object, data.payload));
unsigned n, i, j, k;
usec_t z, x;
- if (!isatty(STDOUT_FILENO))
+ if (!on_tty())
return;
z = now(CLOCK_MONOTONIC);
static void flush_progress(void) {
unsigned n, i;
- if (!isatty(STDOUT_FILENO))
+ if (!on_tty())
return;
n = (3 * columns()) / 4;
c = (a + b) / 2;
- r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, c * sizeof(uint64_t), sizeof(uint64_t), (void **) &z);
+ r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
if (r < 0)
return r;
if (p < *z)
b = c;
- else {
+ else
a = c;
- }
}
return 0;
* main entry array has already been verified we can rely on
* its consistency.*/
+ i = 0;
n = le64toh(f->header->n_entries);
a = le64toh(f->header->entry_array_offset);
- i = 0;
while (i < n) {
- uint64_t m, j;
+ uint64_t m, u;
r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o);
if (r < 0)
return r;
m = journal_file_entry_array_n_items(o);
- for (j = 0; i < n && j < m; i++, j++)
- if (le64toh(o->entry_array.items[j]) == entry_p)
- return 0;
+ u = MIN(n - i, m);
+ if (entry_p <= le64toh(o->entry_array.items[u-1])) {
+ uint64_t x, y, z;
+
+ x = 0;
+ y = u;
+
+ while (x < y) {
+ z = (x + y) / 2;
+
+ if (le64toh(o->entry_array.items[z]) == entry_p)
+ return 0;
+
+ if (x + 1 >= y)
+ break;
+
+ if (entry_p < le64toh(o->entry_array.items[z]))
+ y = z;
+ else
+ x = z;
+ }
+
+ log_error("Entry object doesn't exist in main entry array at %llu", (unsigned long long) entry_p);
+ return -EBADMSG;
+ }
+
+ i += u;
a = le64toh(o->entry_array.next_entry_array_offset);
}
int journal_file_verify(
JournalFile *f,
const char *key,
- usec_t *first_validated, usec_t *last_validated, usec_t *last_contained,
+ usec_t *first_contained, usec_t *last_validated, usec_t *last_contained,
bool show_progress) {
int r;
Object *o;
- uint64_t p = 0, last_tag = 0, last_epoch = 0, last_tag_realtime = 0, last_sealed_realtime = 0;
+ uint64_t p = 0, last_epoch = 0, last_tag_realtime = 0, last_sealed_realtime = 0;
+
uint64_t entry_seqnum = 0, entry_monotonic = 0, entry_realtime = 0;
sd_id128_t entry_boot_id;
bool entry_seqnum_set = false, entry_monotonic_set = false, entry_realtime_set = false, found_main_entry_array = false;
entry_array_path[] = "/var/tmp/journal-entry-array-XXXXXX";
unsigned i;
bool found_last;
-
+#ifdef HAVE_GCRYPT
+ uint64_t last_tag = 0;
+#endif
assert(f);
if (key) {
if (r < 0)
goto fail;
- r = journal_file_hmac_put_object(f, -1, q);
+ r = journal_file_hmac_put_object(f, -1, o, q);
if (r < 0)
goto fail;
last_tag_realtime = rt;
last_sealed_realtime = entry_realtime;
}
-#endif
last_tag = p + ALIGN64(le64toh(o->object.size));
+#endif
+
last_epoch = le64toh(o->tag.epoch);
n_tags ++;
close_nointr_nofail(entry_fd);
close_nointr_nofail(entry_array_fd);
- if (first_validated)
- *first_validated = last_tag_realtime ? le64toh(f->header->head_entry_realtime) : 0;
+ if (first_contained)
+ *first_contained = le64toh(f->header->head_entry_realtime);
if (last_validated)
*last_validated = last_sealed_realtime;
if (last_contained)