X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fjournald-server.c;h=019c3a649acae87f7dfd68292e479e3af701b4ab;hp=9ec425d2d4d4ca3aad7380472b458afb8a382274;hb=ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1;hpb=4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4f diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 9ec425d2d..019c3a649 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -297,8 +297,13 @@ static JournalFile* find_journal(Server *s, uid_t uid) { return f; } -static int do_rotate(Server *s, JournalFile **f, const char* name, - bool seal, uint32_t uid) { +static int do_rotate( + Server *s, + JournalFile **f, + const char* name, + bool seal, + uint32_t uid) { + int r; assert(s); @@ -308,11 +313,9 @@ static int do_rotate(Server *s, JournalFile **f, const char* name, r = journal_file_rotate(f, s->compress, seal); if (r < 0) if (*f) - log_error_errno(r, "Failed to rotate %s: %m", - (*f)->path); + log_error_errno(r, "Failed to rotate %s: %m", (*f)->path); else - log_error_errno(r, "Failed to create new %s journal: %m", - name); + log_error_errno(r, "Failed to create new %s journal: %m", name); else server_fix_perms(s, *f, uid); return r; @@ -366,15 +369,20 @@ void server_sync(Server *s) { s->sync_scheduled = false; } -static void do_vacuum(Server *s, char *ids, JournalFile *f, const char* path, - JournalMetrics *metrics) { - char *p; +static void do_vacuum( + Server *s, + const char *id, + JournalFile *f, + const char* path, + JournalMetrics *metrics) { + + const char *p; int r; if (!f) return; - p = strappenda(path, ids); + p = strappenda(path, id); r = journal_directory_vacuum(p, metrics->max_use, s->max_retention_usec, &s->oldest_file_usec, false); if (r < 0 && r != -ENOENT) log_error_errno(r, "Failed to vacuum %s: %m", p); @@ -446,12 +454,13 @@ static void server_cache_hostname(Server *s) { s->hostname_field = x; } -bool shall_try_append_again(JournalFile *f, int r) { +static bool shall_try_append_again(JournalFile *f, int r) { /* -E2BIG Hit configured limit -EFBIG Hit fs limit -EDQUOT Quota limit hit -ENOSPC Disk full + -EIO I/O error of some kind (mmap) -EHOSTDOWN Other machine -EBUSY Unclean shutdown -EPROTONOSUPPORT Unsupported feature @@ -469,6 +478,8 @@ bool shall_try_append_again(JournalFile *f, int r) { log_info("%s: Unsupported feature, rotating.", f->path); else if (r == -EBADMSG || r == -ENODATA || r == ESHUTDOWN) log_warning("%s: Journal file corrupted, rotating.", f->path); + else if (r == -EIO) + log_warning("%s: IO error, rotating.", f->path); else return false; @@ -811,7 +822,7 @@ static void dispatch_message_real( * realuid is not root, in order not to accidentally * leak privileged information to the user that is * logged by a privileged process that is part of an - * unprivileged session.*/ + * unprivileged session. */ journal_uid = owner; else journal_uid = 0; @@ -1103,7 +1114,7 @@ finish: return r; } -int process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) { +int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) { Server *s = userdata; assert(s); @@ -1131,7 +1142,7 @@ int process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userda * the SELinux people this will change and it * will probably be identical to NAME_MAX. For * now we use that, but this should be updated - * one day when the final limit is known.*/ + * one day when the final limit is known. */ uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(struct timeval)) + CMSG_SPACE(sizeof(int)) + /* fd */ @@ -1158,7 +1169,7 @@ int process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userda * don't rely on it. */ (void) ioctl(fd, SIOCINQ, &v); - /* Fix it up, if it is too small. We use the same fixed value as auditd here. Awful!*/ + /* Fix it up, if it is too small. We use the same fixed value as auditd here. Awful! */ m = PAGE_ALIGN(MAX3((size_t) v + 1, (size_t) LINE_MAX, ALIGN(sizeof(struct nlmsghdr)) + ALIGN((size_t) MAX_AUDIT_MESSAGE_LENGTH)) + 1); @@ -1351,10 +1362,11 @@ static int server_parse_proc_cmdline(Server *s) { static int server_parse_config_file(Server *s) { assert(s); - return config_parse(NULL, "/etc/systemd/journald.conf", NULL, - "Journal\0", - config_item_perf_lookup, journald_gperf_lookup, - false, false, true, s); + return config_parse_many("/etc/systemd/journald.conf", + CONF_DIRS_NULSTR("systemd/journald.conf"), + "Journal\0", + config_item_perf_lookup, journald_gperf_lookup, + false, s); } static int server_dispatch_sync(sd_event_source *es, usec_t t, void *userdata) { @@ -1551,8 +1563,16 @@ int server_init(Server *s) { s->audit_fd = fd; - } else - log_error("Unknown socket passed as file descriptor %d, ignoring.", fd); + } else { + log_warning("Unknown socket passed as file descriptor %d, ignoring.", fd); + + /* Let's close the fd, better be safe than + sorry. The fd might reference some resource + that we really want to release if we don't + make use of it. */ + + safe_close(fd); + } } r = server_open_syslog_socket(s);