journald-server.c revision 2c5859afecee81e345fc9526b1083bf79990ffb8
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye This file is part of systemd.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye Copyright 2011 Lennart Poettering
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye systemd is free software; you can redistribute it and/or modify it
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye under the terms of the GNU Lesser General Public License as published by
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye the Free Software Foundation; either version 2.1 of the License, or
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye (at your option) any later version.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye systemd is distributed in the hope that it will be useful, but
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye WITHOUT ANY WARRANTY; without even the implied warranty of
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye Lesser General Public License for more details.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye You should have received a copy of the GNU Lesser General Public License
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye along with systemd; If not, see <http://www.gnu.org/licenses/>.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#define DEFAULT_SYNC_INTERVAL_USEC (5*USEC_PER_MINUTE)
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#define DEFAULT_RATE_LIMIT_INTERVAL (30*USEC_PER_SEC)
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
64b763950bf11e9357facbd2b5666631a895c085Trond Norbyestatic const char* const storage_table[_STORAGE_MAX] = {
64b763950bf11e9357facbd2b5666631a895c085Trond NorbyeDEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
64b763950bf11e9357facbd2b5666631a895c085Trond Norbyestatic const char* const split_mode_table[_SPLIT_MAX] = {
64b763950bf11e9357facbd2b5666631a895c085Trond NorbyeDEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode);
64b763950bf11e9357facbd2b5666631a895c085Trond NorbyeDEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting");
64b763950bf11e9357facbd2b5666631a895c085Trond Norbyestatic uint64_t available_space(Server *s, bool verbose) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik const char *f;
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austvik if (s->cached_available_space_timestamp + RECHECK_AVAILABLE_SPACE_USEC > ts
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye p = strappend(f, sd_id128_to_string(machine, ids));
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
ecc9697029dc3bde02537b914756f7c49eb7cd1eLubos Kosco /* If we reached a high mark, we will always allow this much
ecc9697029dc3bde02537b914756f7c49eb7cd1eLubos Kosco * again, unless usage goes above max_use. This watermark
45909b3ef8c6e568a87482cb890fec7b5dbb7733Lubos Kosco * value is cached so that we don't give up space on pressure,
45909b3ef8c6e568a87482cb890fec7b5dbb7733Lubos Kosco * but hover below the maximum usage. */
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco s->cached_available_space = LESS_BY(MIN(m->max_use, avail), sum);
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco char fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco server_driver_message(s, SD_MESSAGE_JOURNAL_USAGE,
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco "%s journal is using %s (max allowed %s, "
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco "trying to leave %s free of %s available → current limit %s).",
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye format_bytes(fb5, sizeof(fb5), s->cached_available_space + sum));
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlenvoid server_fix_perms(Server *s, JournalFile *f, uid_t uid) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen log_warning("Failed to fix access mode on %s, ignoring: %s", f->path, strerror(-r));
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen log_warning("Failed to read ACL on %s, ignoring: %m", f->path);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r <= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye /* We do not recalculate the mask unconditionally here,
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye * so that the fchmod() mask above stays intact. */
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye log_warning("Failed to set ACL on %s, ignoring: %m", f->path);
9cf297d9a579835e9336d587eaee187ca0954767Knut Anders Hatlenstatic JournalFile* find_journal(Server *s, uid_t uid) {
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen /* We split up user logs only on /var, not on /run. If the
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco * runtime file is open, we write to it exclusively, in order
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen * to guarantee proper order as soon as we flush /run to
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen * /var and close the runtime file. */
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen f = hashmap_get(s->user_journals, UINT32_TO_PTR(uid));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (asprintf(&p, "/var/log/journal/" SD_ID128_FORMAT_STR "/user-%lu.journal",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye SD_ID128_FORMAT_VAL(machine), (unsigned long) uid) < 0)
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen while (hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen /* Too many open? Then let's close one */
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &f);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye r = hashmap_put(s->user_journals, UINT32_TO_PTR(uid), f);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r < 0) {
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye r = journal_file_rotate(&s->runtime_journal, s->compress, false);
0a0811923cbbd2976425db6f4c78eed811c2825bKnut Anders Hatlen log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_error("Failed to create new runtime journal: %s", strerror(-r));
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen r = journal_file_rotate(&s->system_journal, s->compress, s->seal);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_error("Failed to create new system journal: %s", strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye r = journal_file_rotate(&f, s->compress, s->seal);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_error("Failed to rotate %s: %s", f->path, strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_error("Failed to create user journal: %s", strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye r = journal_file_set_offline(s->system_journal);
a7f25b0d188e4ea80ddcabf3ac52ade1bdb4ebecLubos Kosco log_error("Failed to sync system journal: %s", strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik log_error("Failed to sync user journal: %s", strerror(-r));
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_OFF);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik log_error("Failed to disable sync timer source: %s", strerror(-r));
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik log_error("Failed to get machine ID: %s", strerror(-r));
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik r = journal_directory_vacuum(p, s->system_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec);
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik if (r < 0 && r != -ENOENT)
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye log_error("Failed to vacuum %s: %s", p, strerror(-r));
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye char *p = strappenda("/run/log/journal/", ids);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (r < 0 && r != -ENOENT)
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye log_error("Failed to vacuum %s: %s", p, strerror(-r));
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvikstatic void server_cache_machine_id(Server *s) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik sd_id128_to_string(id, stpcpy(s->machine_id_field, "_MACHINE_ID="));
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik sd_id128_to_string(id, stpcpy(s->boot_id_field, "_BOOT_ID="));
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvikstatic void server_cache_hostname(Server *s) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbyebool shall_try_append_again(JournalFile *f, int r) {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco /* -E2BIG Hit configured limit
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EFBIG Hit fs limit
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EDQUOT Quota limit hit
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -ENOSPC Disk full
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EHOSTDOWN Other machine
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EBUSY Unclean shutdown
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EPROTONOSUPPORT Unsupported feature
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -EBADMSG Corrupted
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -ENODATA Truncated
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye -ESHUTDOWN Already archived */
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco if (r == -E2BIG || r == -EFBIG || r == -EDQUOT || r == -ENOSPC)
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco log_debug("%s: Allocation limit reached, rotating.", f->path);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco else if (r == -EHOSTDOWN)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_info("%s: Journal file from other machine, rotating.", f->path);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco else if (r == -EBUSY)
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco log_info("%s: Unclean shutdown, rotating.", f->path);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye else if (r == -EPROTONOSUPPORT)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_info("%s: Unsupported feature, rotating.", f->path);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye else if (r == -EBADMSG || r == -ENODATA || r == ESHUTDOWN)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye log_warning("%s: Journal file corrupted, rotating.", f->path);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye return false;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye return true;
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Koscostatic void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n, int priority) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (journal_file_rotate_suggested(f, s->max_file_usec)) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
63e0f31920b0818d6f471a066c12da991fb35346Trond Norbye if (r >= 0) {
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik if (vacuumed || !shall_try_append_again(f, r)) {
49180e08afc7cf03413ab108bc71c14e9de1a880Jorgen Austvik for (i = 0; i < n; i++)
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen log_error("Failed to write entry (%d items, %zu bytes), ignoring: %s", n, size, strerror(-r));
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austvik r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
d5734522e5d6f8e329d005a0f93f8c2f30df9516Trond Norbye if (r < 0) {
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austvik for (i = 0; i < n; i++)
d5734522e5d6f8e329d005a0f93f8c2f30df9516Trond Norbye log_error("Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %s", n, size, strerror(-r));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye char pid[sizeof("_PID=") + DECIMAL_STR_MAX(pid_t)],
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye owner_uid[sizeof("_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)],
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)],
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye o_uid[sizeof("OBJECT_UID=") + DECIMAL_STR_MAX(uid_t)],
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye o_gid[sizeof("OBJECT_GID=") + DECIMAL_STR_MAX(gid_t)],
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye o_owner_uid[sizeof("OBJECT_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)];
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye char *t, *c;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye char audit_session[sizeof("_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik audit_loginuid[sizeof("_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)],
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik o_audit_session[sizeof("OBJECT_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen o_audit_loginuid[sizeof("OBJECT_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)];
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen assert(n + N_IOVEC_META_FIELDS + (object_pid ? N_IOVEC_OBJECT_FIELDS : 0) <= m);
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen sprintf(pid, "_PID=%lu", (unsigned long) ucred->pid);
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen sprintf(uid, "_UID=%lu", (unsigned long) ucred->uid);
d3d2404f9a49bf70b124053feabe666f85ef5361Knut Anders Hatlen sprintf(gid, "_GID=%lu", (unsigned long) ucred->gid);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r >= 0) {
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik if (r >= 0) {
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik r = get_process_cmdline(ucred->pid, 0, false, &t);
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik if (r >= 0) {
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik if (r >= 0) {
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik r = audit_session_from_pid(ucred->pid, &audit);
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik if (r >= 0) {
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik sprintf(audit_session, "_AUDIT_SESSION=%lu", (unsigned long) audit);
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik r = audit_loginuid_from_pid(ucred->pid, &loginuid);
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik if (r >= 0) {
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik sprintf(audit_loginuid, "_AUDIT_LOGINUID=%lu", (unsigned long) loginuid);
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik IOVEC_SET_STRING(iovec[n++], audit_loginuid);
92ed85d851c9108d821e93d3aacc9faf3588e17eJorgen Austvik r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &c);
8a667c39dc64db336c7bd14db6bde1e38fb5c117Knut Anders Hatlen session = strappenda("_SYSTEMD_SESSION=", t);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye sprintf(owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (cg_path_get_unit(c, &t) >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (cg_path_get_user_unit(c, &t) >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye x = strappenda("_SYSTEMD_USER_UNIT=", unit_id);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (cg_path_get_slice(c, &t) >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye } else if (unit_id) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye x = alloca(sizeof("_SELINUX_CONTEXT=") + label_len);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye *((char*) mempcpy(stpcpy(x, "_SELINUX_CONTEXT="), label, label_len)) = 0;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye sprintf(o_uid, "OBJECT_UID=%lu", (unsigned long) object_uid);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye sprintf(o_gid, "OBJECT_GID=%lu", (unsigned long) object_gid);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r >= 0) {
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner r = get_process_cmdline(object_pid, 0, false, &t);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye sprintf(o_audit_session, "OBJECT_AUDIT_SESSION=%lu", (unsigned long) audit);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye r = audit_loginuid_from_pid(object_pid, &loginuid);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye sprintf(o_audit_loginuid, "OBJECT_AUDIT_LOGINUID=%lu", (unsigned long) loginuid);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner r = cg_pid_get_path_shifted(object_pid, s->cgroup_root, &c);
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner if (r >= 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r >= 0) {
if (cg_path_get_unit(c, &t) >= 0) {
free(t);
if (cg_path_get_user_unit(c, &t) >= 0) {
free(t);
free(c);
assert(n <= m);
if (tv) {
assert(n <= m);
journal_uid = 0;
assert(s);
void server_dispatch_message(
Server *s,
const char *unit_id,
int priority,
int rl, r;
assert(s);
if (!ucred)
goto finish;
goto finish;
if (rl == 0)
char *fn;
if (!s->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 (!s->runtime_journal &&
if (!fn)
return -ENOMEM;
if (s->system_journal) {
r = journal_file_open(fn, O_RDWR, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
if (r != -ENOENT)
r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
if (s->runtime_journal)
available_space(s, true);
assert(s);
if (!s->runtime_journal)
if (!s->system_journal)
SD_JOURNAL_FOREACH(j) {
JournalFile *f;
f = j->current_file;
goto finish;
goto finish;
server_rotate(s);
server_vacuum(s);
if (!s->system_journal) {
r = -EIO;
goto finish;
goto finish;
sd_journal_close(j);
server_driver_message(s, SD_ID128_NULL, "Time spent on flushing to /var is %s for %u entries.", format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0), n);
assert(s);
return -EIO;
} control = {};
ssize_t n;
unsigned n_fds = 0;
return -errno;
return log_oom();
return -errno;
if (n > 0 && n_fds == 0) {
s->buffer[n] = 0;
} else if (n_fds > 0)
if (n > 0 && n_fds == 0)
else if (n_fds > 0)
static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
assert(s);
server_sync(s);
static int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
assert(s);
server_rotate(s);
server_vacuum(s);
static int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
assert(s);
assert(s);
char *w, *state;
size_t l;
if (!word)
return -ENOMEM;
s->forward_to_syslog = r;
s->forward_to_kmsg = r;
s->forward_to_console = r;
assert(s);
return -errno;
(void*) journald_gperf_lookup, false, false, s);
assert(s);
server_sync(s);
assert(s);
server_sync(s);
if (s->sync_scheduled)
if (s->sync_interval_usec > 0) {
if (!s->sync_event_source) {
s->sync_scheduled = true;
static int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
assert(s);
assert(s);
if (s->hostname_fd < 0) {
return -errno;
r = sd_event_add_io(s->event, &s->hostname_event_source, s->hostname_fd, 0, dispatch_hostname_change, s);
if (r == -EPERM) {
strerror(-r));
int n, r, fd;
assert(s);
zero(*s);
s->compress = true;
s->seal = true;
s->sync_scheduled = false;
s->forward_to_syslog = true;
(long long unsigned) s->rate_limit_interval,
s->rate_limit_burst);
if (!s->user_journals)
return log_oom();
if (!s->mmap)
return log_oom();
n = sd_listen_fds(true);
if (s->native_fd >= 0) {
return -EINVAL;
if (s->stdout_fd >= 0) {
return -EINVAL;
if (s->syslog_fd >= 0) {
return -EINVAL;
return -EINVAL;
r = server_open_syslog_socket(s);
r = server_open_native_socket(s);
r = server_open_stdout_socket(s);
r = server_open_dev_kmsg(s);
r = server_open_kernel_seqnum(s);
r = server_open_hostname(s);
r = setup_signals(s);
if (!s->udev)
return -ENOMEM;
if (!s->rate_limit)
return -ENOMEM;
r = system_journal_open(s);
#ifdef HAVE_GCRYPT
JournalFile *f;
Iterator i;
usec_t n;
if (s->system_journal)
JournalFile *f;
assert(s);
while (s->stdout_streams)
if (s->system_journal)
if (s->runtime_journal)
if (s->syslog_fd >= 0)
if (s->native_fd >= 0)
if (s->stdout_fd >= 0)
if (s->dev_kmsg_fd >= 0)
if (s->hostname_fd >= 0)
if (s->rate_limit)
if (s->kernel_seqnum)
if (s->mmap)
if (s->udev)