X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fsd-journal.c;h=9b9e8ac8593e724f597802d3336651b96aa6773d;hb=c85770ad84af4bcaace5055147d53da6fe28ef9a;hp=89cab3733128d351901690b2a9d8c45f71dabcbb;hpb=b29ddfcb389127cf00ab41447a721e479fe15713;p=elogind.git diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 89cab3733..9b9e8ac85 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include @@ -43,7 +43,7 @@ #include "replace-var.h" #include "fileio.h" -#define JOURNAL_FILES_MAX 1024 +#define JOURNAL_FILES_MAX 7168 #define JOURNAL_FILES_RECHECK_USEC (2 * USEC_PER_SEC) @@ -723,10 +723,14 @@ static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc assert(j); assert(f); - /* If we hit EOF before, recheck if any new entries arrived. */ n_entries = le64toh(f->header->n_entries); - if (f->location_type == LOCATION_TAIL && n_entries == f->last_n_entries) + + /* If we hit EOF before, we don't need to look into this file again + * unless direction changed or new entries appeared. */ + if (f->last_direction == direction && f->location_type == LOCATION_TAIL && + n_entries == f->last_n_entries) return 0; + f->last_n_entries = n_entries; if (f->last_direction == direction && f->current_offset > 0) { @@ -738,14 +742,16 @@ static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc if (r <= 0) return r; - journal_file_save_location(f, direction, c, cp); + journal_file_save_location(f, c, cp); } } else { + f->last_direction = direction; + r = find_location_with_matches(j, f, direction, &c, &cp); if (r <= 0) return r; - journal_file_save_location(f, direction, c, cp); + journal_file_save_location(f, c, cp); } /* OK, we found the spot, now let's advance until an entry @@ -773,7 +779,7 @@ static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc if (r <= 0) return r; - journal_file_save_location(f, direction, c, cp); + journal_file_save_location(f, c, cp); } } @@ -1155,9 +1161,9 @@ static void check_network(sd_journal *j, int fd) { static bool file_has_type_prefix(const char *prefix, const char *filename) { const char *full, *tilded, *atted; - full = strappenda(prefix, ".journal"); - tilded = strappenda(full, "~"); - atted = strappenda(prefix, "@"); + full = strjoina(prefix, ".journal"); + tilded = strjoina(full, "~"); + atted = strjoina(prefix, "@"); return streq(filename, full) || streq(filename, tilded) || @@ -1178,8 +1184,7 @@ static bool file_type_wanted(int flags, const char *filename) { if (flags & SD_JOURNAL_CURRENT_USER) { char prefix[5 + DECIMAL_STR_MAX(uid_t) + 1]; - assert_se(snprintf(prefix, sizeof(prefix), "user-"UID_FMT, getuid()) - < (int) sizeof(prefix)); + xsprintf(prefix, "user-"UID_FMT, getuid()); if (file_has_type_prefix(prefix, filename)) return true; @@ -1243,7 +1248,7 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) { r = add_any_file(j, path); if (r == -ENOENT) return 0; - return 0; + return r; } static int remove_file(sd_journal *j, const char *prefix, const char *filename) { @@ -1400,7 +1405,7 @@ static int add_root_directory(sd_journal *j, const char *p) { return -EINVAL; if (j->prefix) - p = strappenda(j->prefix, p); + p = strjoina(j->prefix, p); d = opendir(p); if (!d) @@ -1644,7 +1649,7 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM)) == 0, -EINVAL); assert_return(machine_name_is_valid(machine), -EINVAL); - p = strappenda("/run/systemd/machines/", machine); + p = strjoina("/run/systemd/machines/", machine); r = parse_env_file(p, NEWLINE, "ROOT", &root, "CLASS", &class, NULL); if (r == -ENOENT) return -EHOSTDOWN; @@ -2188,11 +2193,11 @@ _public_ int sd_journal_process(sd_journal *j) { j->last_process_usec = now(CLOCK_MONOTONIC); for (;;) { - uint8_t buffer[INOTIFY_EVENT_MAX] _alignas_(struct inotify_event); + union inotify_event_buffer buffer; struct inotify_event *e; ssize_t l; - l = read(j->inotify_fd, buffer, sizeof(buffer)); + l = read(j->inotify_fd, &buffer, sizeof(buffer)); if (l < 0) { if (errno == EAGAIN || errno == EINTR) return got_something ? determine_change(j) : SD_JOURNAL_NOP;