X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald-server.c;h=7ee8174ea235d3a65da7afdcf7fde7b94a8541cb;hb=4af7b60d428765c2d2c66c46f416f6dae55e9ddb;hp=c28aba8fd00039f36a20eb24e90c5f0d2c631f95;hpb=2678031a179a9b91fc799f8ef951a548c66c4b49;p=elogind.git diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index c28aba8fd..7ee8174ea 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -52,12 +52,7 @@ #include "journald-native.h" #include "journald-audit.h" #include "journald-server.h" - -#ifdef HAVE_ACL -#include -#include #include "acl-util.h" -#endif #ifdef HAVE_SELINUX #include @@ -383,7 +378,7 @@ static void do_vacuum( if (!f) return; - p = strappenda(path, id); + p = strjoina(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); @@ -521,12 +516,7 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned } if (vacuumed || !shall_try_append_again(f, r)) { - size_t size = 0; - unsigned i; - for (i = 0; i < n; i++) - size += iovec[i].iov_len; - - log_error_errno(r, "Failed to write entry (%d items, %zu bytes), ignoring: %m", n, size); + log_error_errno(r, "Failed to write entry (%d items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n)); return; } @@ -539,14 +529,9 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned log_debug("Retrying write."); r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL); - if (r < 0) { - size_t size = 0; - unsigned i; - for (i = 0; i < n; i++) - size += iovec[i].iov_len; - - log_error_errno(r, "Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %m", n, size); - } else + if (r < 0) + log_error_errno(r, "Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n)); + else server_schedule_sync(s, priority); } @@ -604,28 +589,28 @@ static void dispatch_message_real( r = get_process_comm(ucred->pid, &t); if (r >= 0) { - x = strappenda("_COMM=", t); + x = strjoina("_COMM=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } r = get_process_exe(ucred->pid, &t); if (r >= 0) { - x = strappenda("_EXE=", t); + x = strjoina("_EXE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } r = get_process_cmdline(ucred->pid, 0, false, &t); if (r >= 0) { - x = strappenda("_CMDLINE=", t); + x = strjoina("_CMDLINE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } r = get_process_capeff(ucred->pid, &t); if (r >= 0) { - x = strappenda("_CAP_EFFECTIVE=", t); + x = strjoina("_CAP_EFFECTIVE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } @@ -648,12 +633,12 @@ static void dispatch_message_real( if (r >= 0) { char *session = NULL; - x = strappenda("_SYSTEMD_CGROUP=", c); + x = strjoina("_SYSTEMD_CGROUP=", c); IOVEC_SET_STRING(iovec[n++], x); r = cg_path_get_session(c, &t); if (r >= 0) { - session = strappenda("_SYSTEMD_SESSION=", t); + session = strjoina("_SYSTEMD_SESSION=", t); free(t); IOVEC_SET_STRING(iovec[n++], session); } @@ -666,32 +651,32 @@ static void dispatch_message_real( } if (cg_path_get_unit(c, &t) >= 0) { - x = strappenda("_SYSTEMD_UNIT=", t); + x = strjoina("_SYSTEMD_UNIT=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } else if (unit_id && !session) { - x = strappenda("_SYSTEMD_UNIT=", unit_id); + x = strjoina("_SYSTEMD_UNIT=", unit_id); IOVEC_SET_STRING(iovec[n++], x); } if (cg_path_get_user_unit(c, &t) >= 0) { - x = strappenda("_SYSTEMD_USER_UNIT=", t); + x = strjoina("_SYSTEMD_USER_UNIT=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } else if (unit_id && session) { - x = strappenda("_SYSTEMD_USER_UNIT=", unit_id); + x = strjoina("_SYSTEMD_USER_UNIT=", unit_id); IOVEC_SET_STRING(iovec[n++], x); } if (cg_path_get_slice(c, &t) >= 0) { - x = strappenda("_SYSTEMD_SLICE=", t); + x = strjoina("_SYSTEMD_SLICE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } free(c); } else if (unit_id) { - x = strappenda("_SYSTEMD_UNIT=", unit_id); + x = strjoina("_SYSTEMD_UNIT=", unit_id); IOVEC_SET_STRING(iovec[n++], x); } @@ -706,7 +691,7 @@ static void dispatch_message_real( security_context_t con; if (getpidcon(ucred->pid, &con) >= 0) { - x = strappenda("_SELINUX_CONTEXT=", con); + x = strjoina("_SELINUX_CONTEXT=", con); freecon(con); IOVEC_SET_STRING(iovec[n++], x); @@ -732,21 +717,21 @@ static void dispatch_message_real( r = get_process_comm(object_pid, &t); if (r >= 0) { - x = strappenda("OBJECT_COMM=", t); + x = strjoina("OBJECT_COMM=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } r = get_process_exe(object_pid, &t); if (r >= 0) { - x = strappenda("OBJECT_EXE=", t); + x = strjoina("OBJECT_EXE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } r = get_process_cmdline(object_pid, 0, false, &t); if (r >= 0) { - x = strappenda("OBJECT_CMDLINE=", t); + x = strjoina("OBJECT_CMDLINE=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } @@ -767,12 +752,12 @@ static void dispatch_message_real( r = cg_pid_get_path_shifted(object_pid, s->cgroup_root, &c); if (r >= 0) { - x = strappenda("OBJECT_SYSTEMD_CGROUP=", c); + x = strjoina("OBJECT_SYSTEMD_CGROUP=", c); IOVEC_SET_STRING(iovec[n++], x); r = cg_path_get_session(c, &t); if (r >= 0) { - x = strappenda("OBJECT_SYSTEMD_SESSION=", t); + x = strjoina("OBJECT_SYSTEMD_SESSION=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } @@ -783,13 +768,13 @@ static void dispatch_message_real( } if (cg_path_get_unit(c, &t) >= 0) { - x = strappenda("OBJECT_SYSTEMD_UNIT=", t); + x = strjoina("OBJECT_SYSTEMD_UNIT=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } if (cg_path_get_user_unit(c, &t) >= 0) { - x = strappenda("OBJECT_SYSTEMD_USER_UNIT=", t); + x = strjoina("OBJECT_SYSTEMD_USER_UNIT=", t); free(t); IOVEC_SET_STRING(iovec[n++], x); } @@ -852,12 +837,10 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format, va_start(ap, format); vsnprintf(buffer + 8, sizeof(buffer) - 8, format, ap); va_end(ap); - char_array_0(buffer); IOVEC_SET_STRING(iovec[n++], buffer); if (!sd_id128_equal(message_id, SD_ID128_NULL)) { snprintf(mid, sizeof(mid), LOG_MESSAGE_ID(message_id)); - char_array_0(mid); IOVEC_SET_STRING(iovec[n++], mid); } @@ -961,10 +944,10 @@ static int system_journal_open(Server *s, bool flush_requested) { if (s->storage == STORAGE_PERSISTENT) (void) mkdir("/var/log/journal/", 0755); - fn = strappenda("/var/log/journal/", ids); + fn = strjoina("/var/log/journal/", ids); (void) mkdir(fn, 0755); - fn = strappenda(fn, "/system.journal"); + fn = strjoina(fn, "/system.journal"); r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal); if (r >= 0) @@ -1472,6 +1455,7 @@ static int server_open_hostname(Server *s) { } int server_init(Server *s) { + _cleanup_fdset_free_ FDSet *fds = NULL; int n, r, fd; assert(s); @@ -1568,26 +1552,33 @@ int server_init(Server *s) { s->audit_fd = 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. */ + if (!fds) { + fds = fdset_new(); + if (!fds) + return log_oom(); + } - safe_close(fd); + r = fdset_put(fds, fd); + if (r < 0) + return log_oom(); } } - r = server_open_syslog_socket(s); + r = server_open_stdout_socket(s, fds); if (r < 0) return r; - r = server_open_native_socket(s); + if (fdset_size(fds) > 0) { + log_warning("%u unknown file descriptors passed, closing.", fdset_size(fds)); + fds = fdset_free(fds); + } + + r = server_open_syslog_socket(s); if (r < 0) return r; - r = server_open_stdout_socket(s); + r = server_open_native_socket(s); if (r < 0) return r;