X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald.c;h=baad3ab1adc8029b25cf9a71859c63b680a1490c;hb=ccdbaf911196e2fc80eaa914bf22e01035ee1f3f;hp=e9c00b443cff7decd1cf62df2b6e8fc82314337f;hpb=7f2c63cbf47c89ec56f50469f6551df473dd65d8;p=elogind.git diff --git a/src/journal/journald.c b/src/journal/journald.c index e9c00b443..baad3ab1a 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -153,24 +154,25 @@ static uint64_t available_space(Server *s) { for (;;) { struct stat st; struct dirent buf, *de; - int k; - k = readdir_r(d, &buf, &de); - if (k != 0) { - r = -k; - goto finish; - } + r = readdir_r(d, &buf, &de); + if (r != 0) + break; if (!de) break; - if (!dirent_is_file_with_suffix(de, ".journal")) + if (!endswith(de->d_name, ".journal") && + !endswith(de->d_name, ".journal~")) continue; if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) continue; - sum += (uint64_t) st.st_blocks * (uint64_t) st.st_blksize; + if (!S_ISREG(st.st_mode)) + continue; + + sum += (uint64_t) st.st_blocks * 512UL; } avail = sum >= m->max_use ? 0 : m->max_use - sum; @@ -300,15 +302,13 @@ static JournalFile* find_journal(Server *s, uid_t uid) { journal_file_close(f); } - r = journal_file_open(p, O_RDWR|O_CREAT, 0640, s->system_journal, &f); + r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, s->system_journal, &f); free(p); if (r < 0) return s->system_journal; server_fix_perms(s, f, uid); - f->metrics = s->system_metrics; - f->compress = s->compress; r = hashmap_put(s->user_journals, UINT32_TO_PTR(uid), f); if (r < 0) { @@ -331,20 +331,26 @@ static void server_rotate(Server *s) { r = journal_file_rotate(&s->runtime_journal); if (r < 0) log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r)); + else + server_fix_perms(s, s->runtime_journal, 0); } if (s->system_journal) { r = journal_file_rotate(&s->system_journal); if (r < 0) log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r)); + else + server_fix_perms(s, s->system_journal, 0); } HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) { r = journal_file_rotate(&f); if (r < 0) log_error("Failed to rotate %s: %s", f->path, strerror(-r)); - else + else { hashmap_replace(s->user_journals, k, f); + server_fix_perms(s, s->system_journal, PTR_TO_UINT32(k)); + } } } @@ -603,8 +609,12 @@ retry: else { r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL); - if (r == -E2BIG && !vacuumed) { - log_info("Allocation limit reached."); + if ((r == -EBADMSG || r == -E2BIG) && !vacuumed) { + + if (r == -E2BIG) + log_info("Allocation limit reached, rotating."); + else + log_warning("Journal file corrupted, rotating."); server_rotate(s); server_vacuum(s); @@ -1309,6 +1319,7 @@ finish: free(iovec[j].iov_base); } + free(iovec); free(identifier); free(message); } @@ -1873,7 +1884,7 @@ static int system_journal_open(Server *s) { if (!fn) return -ENOMEM; - r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->system_journal); + r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, NULL, &s->system_journal); free(fn); if (r >= 0) { @@ -1920,7 +1931,7 @@ static int system_journal_open(Server *s) { * it if necessary. */ (void) mkdir_parents(fn, 0755); - r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->runtime_journal); + r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, NULL, &s->runtime_journal); free(fn); if (r < 0) { @@ -2133,7 +2144,7 @@ static int process_event(Server *s, struct epoll_event *ev) { uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(struct timeval)) + CMSG_SPACE(sizeof(int)) + - CMSG_SPACE(LINE_MAX)]; /* selinux label */ + CMSG_SPACE(PAGE_SIZE)]; /* selinux label */ } control; ssize_t n; int v; @@ -2306,10 +2317,12 @@ static int open_syslog_socket(Server *s) { return -errno; } +#ifdef HAVE_SELINUX one = 1; r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)); if (r < 0) log_warning("SO_PASSSEC failed: %m"); +#endif one = 1; r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)); @@ -2367,10 +2380,12 @@ static int open_native_socket(Server*s) { return -errno; } +#ifdef HAVE_SELINUX one = 1; r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)); if (r < 0) log_warning("SO_PASSSEC failed: %m"); +#endif one = 1; r = setsockopt(s->native_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)); @@ -2660,10 +2675,6 @@ static int server_init(Server *s) { if (r < 0) return r; - r = system_journal_open(s); - if (r < 0) - return r; - r = open_signalfd(s); if (r < 0) return r; @@ -2672,6 +2683,10 @@ static int server_init(Server *s) { if (!s->rate_limit) return -ENOMEM; + r = system_journal_open(s); + if (r < 0) + return r; + return 0; }