X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fsd-journal.c;h=672896d57ceb913af96ec91505add9ce37008b68;hb=7827b1a10f4dfe2c6771b515f28f7ae22e0ae039;hp=57572d4f0113f988c8d88db5cf105501eb927c76;hpb=b7def684941808600c344f0be7a2b9fcdda97e0f;p=elogind.git diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 57572d4f0..672896d57 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -745,7 +745,7 @@ static int next_with_matches( return journal_file_next_entry(f, c, cp, direction, ret, offset); /* If we have a match then we look for the next matching entry - * wiht an offset at least one step larger */ + * with an offset at least one step larger */ return next_for_match(j, j->level0, f, direction == DIRECTION_DOWN ? cp+1 : cp-1, direction, ret, offset); } @@ -1116,7 +1116,7 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) { return 0; } - r = journal_file_open(path, O_RDONLY, 0, NULL, &f); + r = journal_file_open(path, O_RDONLY, 0, NULL, NULL, &f); free(path); if (r < 0) { @@ -1329,7 +1329,7 @@ static int add_root_directory(sd_journal *j, const char *p) { if (r < 0) log_debug("Failed to add file %s/%s: %s", m->path, de->d_name, strerror(-r)); - } else if ((de->d_type == DT_DIR || de->d_type == DT_UNKNOWN) && + } else if ((de->d_type == DT_DIR || de->d_type == DT_LNK || de->d_type == DT_UNKNOWN) && sd_id128_from_string(de->d_name, &id) >= 0) { r = add_directory(j, m->path, de->d_name); @@ -1402,7 +1402,7 @@ static int allocate_inotify(sd_journal *j) { return 0; } -static sd_journal *journal_new(int flags) { +static sd_journal *journal_new(int flags, const char *path) { sd_journal *j; j = new0(sd_journal, 1); @@ -1412,8 +1412,17 @@ static sd_journal *journal_new(int flags) { j->inotify_fd = -1; j->flags = flags; + if (path) { + j->path = strdup(path); + if (!j->path) { + free(j); + return NULL; + } + } + j->files = hashmap_new(string_hash_func, string_compare_func); if (!j->files) { + free(j->path); free(j); return NULL; } @@ -1421,6 +1430,7 @@ static sd_journal *journal_new(int flags) { j->directories_by_path = hashmap_new(string_hash_func, string_compare_func); if (!j->directories_by_path) { hashmap_free(j->files); + free(j->path); free(j); return NULL; } @@ -1440,7 +1450,7 @@ _public_ int sd_journal_open(sd_journal **ret, int flags) { SD_JOURNAL_SYSTEM_ONLY)) return -EINVAL; - j = journal_new(flags); + j = journal_new(flags, NULL); if (!j) return -ENOMEM; @@ -1470,7 +1480,7 @@ _public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int f if (flags != 0) return -EINVAL; - j = journal_new(flags); + j = journal_new(flags, path); if (!j) return -ENOMEM; @@ -1513,6 +1523,7 @@ _public_ void sd_journal_close(sd_journal *j) { sd_journal_flush_matches(j); + free(j->path); free(j); } @@ -1790,7 +1801,10 @@ _public_ int sd_journal_get_fd(sd_journal *j) { /* Iterate through all dirs again, to add them to the * inotify */ - r = add_search_paths(j); + if (j->path) + r = add_root_directory(j, j->path); + else + r = add_search_paths(j); if (r < 0) return r; @@ -1868,7 +1882,7 @@ static int determine_change(sd_journal *j) { } _public_ int sd_journal_process(sd_journal *j) { - uint8_t buffer[sizeof(struct inotify_event) + FILENAME_MAX]; + uint8_t buffer[sizeof(struct inotify_event) + FILENAME_MAX] _alignas_(struct inotify_event); bool got_something = false; if (!j) @@ -1950,6 +1964,8 @@ _public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, usec_t fr, t; r = journal_file_get_cutoff_realtime_usec(f, &fr, &t); + if (r == -ENOENT) + continue; if (r < 0) return r; if (r == 0) @@ -1987,6 +2003,8 @@ _public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot usec_t fr, t; r = journal_file_get_cutoff_monotonic_usec(f, boot_id, &fr, &t); + if (r == -ENOENT) + continue; if (r < 0) return r; if (r == 0) @@ -2009,6 +2027,22 @@ _public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot return first ? 0 : 1; } +void journal_print_header(sd_journal *j) { + Iterator i; + JournalFile *f; + bool newline = false; + + assert(j); + + HASHMAP_FOREACH(f, j->files, i) { + if (newline) + putchar('\n'); + else + newline = true; + + journal_file_print_header(f); + } +} /* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */ /* if (!j) */