journald-server.c revision 32917e33882778cf2ec6dd54b1e1082266fb072e
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek/***
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek This file is part of systemd.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Copyright 2011 Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek systemd is free software; you can redistribute it and/or modify it
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek under the terms of the GNU Lesser General Public License as published by
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek the Free Software Foundation; either version 2.1 of the License, or
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek (at your option) any later version.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek systemd is distributed in the hope that it will be useful, but
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek WITHOUT ANY WARRANTY; without even the implied warranty of
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Lesser General Public License for more details.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek You should have received a copy of the GNU Lesser General Public License
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek along with systemd; If not, see <http://www.gnu.org/licenses/>.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek***/
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering#ifdef HAVE_SELINUX
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering#include <selinux/selinux.h>
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering#endif
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include <sys/ioctl.h>
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include <sys/mman.h>
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include <sys/signalfd.h>
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include <sys/statvfs.h>
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include <linux/sockios.h>
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering
b4bbcaa9c44260e88402cb8f9a5fb8ac7f35e123Thomas Hindoe Paaboel Andersen#include "libudev.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "sd-daemon.h"
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering#include "sd-journal.h"
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering#include "sd-messages.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "acl-util.h"
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "alloc-util.h"
430f0182b72373145c839dbfe99d2382855cb8f8Lennart Poettering#include "audit-util.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "cgroup-util.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "conf-parser.h"
a09561746f15b84da9471b5c4be74e53d19e4f3fLennart Poettering#include "dirent-util.h"
0dec689b098cf62b948d43dc78bde859665056ecTom Gundersen#include "extract-word.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "fd-util.h"
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering#include "fileio.h"
958b66ea16deddd794b3a52643bd44633e165eadLennart Poettering#include "formats-util.h"
f4f15635ec05293ffcc83a5b39f624bbabbd8fd0Lennart Poettering#include "fs-util.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "hashmap.h"
958b66ea16deddd794b3a52643bd44633e165eadLennart Poettering#include "hostname-util.h"
afc5dbf37fd2399d37976388d9dd9ab470ecf446Lennart Poettering#include "io-util.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journal-authenticate.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journal-file.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "journal-internal.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "journal-vacuum.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journald-audit.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "journald-kmsg.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#include "journald-native.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journald-rate-limit.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "journald-server.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journald-stream.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "journald-syslog.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "missing.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "mkdir.h"
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering#include "parse-util.h"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include "proc-cmdline.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "process-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "rm-rf.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "selinux-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "signal-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "socket-util.h"
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek#include "stdio-util.h"
8b43440b7ef4b81c69c31de7ff820dc07a780254Lennart Poettering#include "string-table.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "string-util.h"
4a0b58c4a30ecaa61202f845ed86f75b36370cd0Lennart Poettering#include "user-util.h"
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek#include "log.h"
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#define USER_JOURNALS_MAX 1024
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk#define DEFAULT_SYNC_INTERVAL_USEC (5*USEC_PER_MINUTE)
7f1ad696a273703789b624fe0b209fb63e953016Lennart Poettering#define DEFAULT_RATE_LIMIT_INTERVAL (30*USEC_PER_SEC)
7f1ad696a273703789b624fe0b209fb63e953016Lennart Poettering#define DEFAULT_RATE_LIMIT_BURST 1000
e150e82097211f09b911c7784a89ef9efed713caMichał Bartoszkiewicz#define DEFAULT_MAX_FILE_USEC USEC_PER_MONTH
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define RECHECK_SPACE_USEC (30*USEC_PER_SEC)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering#define NOTIFY_SNDBUF_SIZE (8*1024*1024)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringstatic int determine_space_for(
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering Server *s,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering JournalMetrics *metrics,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *path,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *name,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering bool verbose,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering bool patch_min_use,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering uint64_t *available,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering uint64_t *limit) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering uint64_t sum = 0, ss_avail, avail;
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer _cleanup_closedir_ DIR *d = NULL;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering struct dirent *de;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering struct statvfs ss;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *p;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek usec_t ts;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(metrics);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(path);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(name);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering ts = now(CLOCK_MONOTONIC);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (!verbose && s->cached_space_timestamp + RECHECK_SPACE_USEC > ts) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (available)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering *available = s->cached_space_available;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (limit)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering *limit = s->cached_space_limit;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering p = strjoina(path, SERVER_MACHINE_ID(s));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek d = opendir(p);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!d)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, "Failed to open %s: %m", p);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (fstatvfs(dirfd(d), &ss) < 0)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return log_error_errno(errno, "Failed to fstatvfs(%s): %m", p);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering FOREACH_DIRENT_ALL(de, d, break) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek struct stat st;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!endswith(de->d_name, ".journal") &&
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek !endswith(de->d_name, ".journal~"))
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek continue;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering log_debug_errno(errno, "Failed to stat %s/%s, ignoring: %m", p, de->d_name);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek continue;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!S_ISREG(st.st_mode))
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek continue;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek sum += (uint64_t) st.st_blocks * 512UL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek /* If requested, then let's bump the min_use limit to the
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * current usage on disk. We do this when starting up and
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * first opening the journal files. This way sudden spikes in
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * disk usage will not cause journald to vacuum files without
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * bounds. Note that this means that only a restart of
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * journald will make it reset this value. */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (patch_min_use)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering metrics->min_use = MAX(metrics->min_use, sum);
348ced909724a1331b85d57aede80a102a00e428Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering ss_avail = ss.f_bsize * ss.f_bavail;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering avail = LESS_BY(ss_avail, metrics->keep_free);
348ced909724a1331b85d57aede80a102a00e428Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_limit = MIN(MAX(sum + avail, metrics->min_use), metrics->max_use);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_available = LESS_BY(s->cached_space_limit, sum);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_timestamp = ts;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek if (verbose) {
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek char fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX], fb6[FORMAT_BYTES_MAX];
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb1, sizeof(fb1), sum);
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb2, sizeof(fb2), metrics->max_use);
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb3, sizeof(fb3), metrics->keep_free);
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb4, sizeof(fb4), ss_avail);
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb5, sizeof(fb5), s->cached_space_limit);
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek format_bytes(fb6, sizeof(fb6), s->cached_space_available);
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek server_driver_message(s, SD_MESSAGE_JOURNAL_USAGE,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek LOG_MESSAGE("%s (%s) is %s, max %s, %s free.",
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek name, path, fb1, fb5, fb6),
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "JOURNAL_NAME=%s", name,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "JOURNAL_PATH=%s", path,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "CURRENT_USE=%"PRIu64, sum,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "CURRENT_USE_PRETTY=%s", fb1,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "MAX_USE=%"PRIu64, metrics->max_use,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "MAX_USE_PRETTY=%s", fb2,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "DISK_KEEP_FREE=%"PRIu64, metrics->keep_free,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "DISK_KEEP_FREE_PRETTY=%s", fb3,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "DISK_AVAILABLE=%"PRIu64, ss_avail,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "DISK_AVAILABLE_PRETTY=%s", fb4,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "LIMIT=%"PRIu64, s->cached_space_limit,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "LIMIT_PRETTY=%s", fb5,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "AVAILABLE=%"PRIu64, s->cached_space_available,
282c5c4e422cb6e6685c870946d8b9bdf0879ad1Zbigniew Jędrzejewski-Szmek "AVAILABLE_PRETTY=%s", fb6,
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek NULL);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering }
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (available)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering *available = s->cached_space_available;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (limit)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering *limit = s->cached_space_limit;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return 1;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering}
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringstatic int determine_space(Server *s, bool verbose, bool patch_min_use, uint64_t *available, uint64_t *limit) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering JournalMetrics *metrics;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *path, *name;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (s->system_journal) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering path = "/var/log/journal/";
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering metrics = &s->system_metrics;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering name = "System journal";
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering } else {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering path = "/run/log/journal/";
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering metrics = &s->runtime_metrics;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering name = "Runtime journal";
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek }
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return determine_space_for(s, metrics, path, name, verbose, patch_min_use, available, limit);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmekstatic void server_add_acls(JournalFile *f, uid_t uid) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#ifdef HAVE_ACL
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#ifdef HAVE_ACL
34c10968cbe3b5591b3c0ce225b8694edd9709d0Lennart Poettering if (uid <= SYSTEM_UID_MAX)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek r = add_acls_for_user(f->fd, uid);
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek if (r < 0)
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek log_warning_errno(r, "Failed to set ACL on %s, ignoring: %m", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekstatic JournalFile* find_journal(Server *s, uid_t uid) {
ed375bebf46c1251f4baa170b39ee93761dbdb19Zbigniew Jędrzejewski-Szmek _cleanup_free_ char *p = NULL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek sd_id128_t machine;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* We split up user logs only on /var, not on /run. If the
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * runtime file is open, we write to it exclusively, in order
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * to guarantee proper order as soon as we flush /run to
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * /var and close the runtime file. */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->runtime_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->runtime_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f7dc3ab9f43b67abcbd34062b9352ab42debec49Lennart Poettering if (uid <= SYSTEM_UID_MAX)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->system_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = sd_id128_get_machine(&machine);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->system_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
4a0b58c4a30ecaa61202f845ed86f75b36370cd0Lennart Poettering f = ordered_hashmap_get(s->user_journals, UID_TO_PTR(uid));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (f)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek if (asprintf(&p, "/var/log/journal/" SD_ID128_FORMAT_STR "/user-"UID_FMT".journal",
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek SD_ID128_FORMAT_VAL(machine), uid) < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->system_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt while (ordered_hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* Too many open? Then let's close one */
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt f = ordered_hashmap_steal_first(s->user_journals);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_close(f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
cbd671772c9ce053a7050ddd29de170eb9efac7eZbigniew Jędrzejewski-Szmek r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->system_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek server_add_acls(f, uid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
4a0b58c4a30ecaa61202f845ed86f75b36370cd0Lennart Poettering r = ordered_hashmap_put(s->user_journals, UID_TO_PTR(uid), f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_close(f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return s->system_journal;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poetteringstatic int do_rotate(
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering Server *s,
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering JournalFile **f,
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering const char* name,
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering bool seal,
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering uint32_t uid) {
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek int r;
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek assert(s);
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek if (!*f)
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek return -EINVAL;
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek r = journal_file_rotate(f, s->compress, seal);
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek if (r < 0)
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek if (*f)
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek else
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering log_error_errno(r, "Failed to create new %s journal: %m", name);
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek else
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek server_add_acls(*f, uid);
2678031a179a9b91fc799f8ef951a548c66c4b49Lennart Poettering
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek return r;
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek}
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekvoid server_rotate(Server *s) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek void *k;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Iterator i;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("Rotating...");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) do_rotate(s, &s->runtime_journal, "runtime", false, 0);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) do_rotate(s, &s->system_journal, "system", s->seal, 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
4a0b58c4a30ecaa61202f845ed86f75b36370cd0Lennart Poettering r = do_rotate(s, &f, "user", s->seal, PTR_TO_UID(k));
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek if (r >= 0)
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt ordered_hashmap_replace(s->user_journals, k, f);
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek else if (!f)
fc55baee9964a118afbddbf82b8e667a0ad80b99Zbigniew Jędrzejewski-Szmek /* Old file has been closed and deallocated */
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt ordered_hashmap_remove(s->user_journals, k);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchukvoid server_sync(Server *s) {
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk JournalFile *f;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk Iterator i;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk int r;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (s->system_journal) {
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk r = journal_file_set_offline(s->system_journal);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (r < 0)
65089b82401cd395786a7987c470056ff3f01151Lennart Poettering log_warning_errno(r, "Failed to sync system journal, ignoring: %m");
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk }
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
65c1d46b0923771955519329160a1e4c7cd027b0Lennart Poettering ORDERED_HASHMAP_FOREACH(f, s->user_journals, i) {
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk r = journal_file_set_offline(f);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (r < 0)
65089b82401cd395786a7987c470056ff3f01151Lennart Poettering log_warning_errno(r, "Failed to sync user journal, ignoring: %m");
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk }
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (s->sync_event_source) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_OFF);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Failed to disable sync timer source: %m");
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering }
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk s->sync_scheduled = false;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk}
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poetteringstatic void do_vacuum(
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering Server *s,
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering JournalFile *f,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering JournalMetrics *metrics,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *path,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *name,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering bool verbose,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering bool patch_min_use) {
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering
ea69bd41c5923f4f278a09bb7d8cb1abcfa122e1Lennart Poettering const char *p;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering uint64_t limit;
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek int r;
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(metrics);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(path);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(name);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek if (!f)
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek return;
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering p = strjoina(path, SERVER_MACHINE_ID(s));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering limit = metrics->max_use;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) determine_space_for(s, metrics, path, name, verbose, patch_min_use, NULL, &limit);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering r = journal_directory_vacuum(p, limit, metrics->n_max_files, s->max_retention_usec, &s->oldest_file_usec, verbose);
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek if (r < 0 && r != -ENOENT)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering log_warning_errno(r, "Failed to vacuum %s, ignoring: %m", p);
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek}
63c8666b824e8762ffb73647e1caee165dfbc868Zbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint server_vacuum(Server *s, bool verbose, bool patch_min_use) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("Vacuuming...");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->oldest_file_usec = 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering do_vacuum(s, s->system_journal, &s->system_metrics, "/var/log/journal/", "System journal", verbose, patch_min_use);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering do_vacuum(s, s->runtime_journal, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", verbose, patch_min_use);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_limit = 0;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_available = 0;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering s->cached_space_timestamp = 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poetteringstatic void server_cache_machine_id(Server *s) {
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering sd_id128_t id;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering int r;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering assert(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering r = sd_id128_get_machine(&id);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (r < 0)
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering sd_id128_to_string(id, stpcpy(s->machine_id_field, "_MACHINE_ID="));
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering}
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poetteringstatic void server_cache_boot_id(Server *s) {
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering sd_id128_t id;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering int r;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering assert(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering r = sd_id128_get_boot(&id);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (r < 0)
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering sd_id128_to_string(id, stpcpy(s->boot_id_field, "_BOOT_ID="));
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering}
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poetteringstatic void server_cache_hostname(Server *s) {
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering _cleanup_free_ char *t = NULL;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering char *x;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering assert(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering t = gethostname_malloc();
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (!t)
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering x = strappend("_HOSTNAME=", t);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (!x)
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering free(s->hostname_field);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering s->hostname_field = x;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering}
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
8531ae707d4d0203e83304d4af948b8169a5fce1Lennart Poetteringstatic bool shall_try_append_again(JournalFile *f, int r) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* -E2BIG Hit configured limit
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EFBIG Hit fs limit
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EDQUOT Quota limit hit
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -ENOSPC Disk full
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering -EIO I/O error of some kind (mmap)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EHOSTDOWN Other machine
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EBUSY Unclean shutdown
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EPROTONOSUPPORT Unsupported feature
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -EBADMSG Corrupted
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek -ENODATA Truncated
2678031a179a9b91fc799f8ef951a548c66c4b49Lennart Poettering -ESHUTDOWN Already archived
2678031a179a9b91fc799f8ef951a548c66c4b49Lennart Poettering -EIDRM Journal file has been deleted */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r == -E2BIG || r == -EFBIG || r == -EDQUOT || r == -ENOSPC)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("%s: Allocation limit reached, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else if (r == -EHOSTDOWN)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_info("%s: Journal file from other machine, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else if (r == -EBUSY)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_info("%s: Unclean shutdown, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else if (r == -EPROTONOSUPPORT)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_info("%s: Unsupported feature, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else if (r == -EBADMSG || r == -ENODATA || r == ESHUTDOWN)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_warning("%s: Journal file corrupted, rotating.", f->path);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering else if (r == -EIO)
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering log_warning("%s: IO error, rotating.", f->path);
2678031a179a9b91fc799f8ef951a548c66c4b49Lennart Poettering else if (r == -EIDRM)
2678031a179a9b91fc799f8ef951a548c66c4b49Lennart Poettering log_warning("%s: Journal file has been deleted, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return false;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poetteringstatic void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n, int priority) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek bool vacuumed = false;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(iovec);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(n > 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek f = find_journal(s, uid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!f)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (journal_file_rotate_suggested(f, s->max_file_usec)) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek server_rotate(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering server_vacuum(s, false, false);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek vacuumed = true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek f = find_journal(s, uid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!f)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (r >= 0) {
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering server_schedule_sync(s, priority);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (vacuumed || !shall_try_append_again(f, r)) {
8266e1c04db8cabe3c68510a0c1f07c09ecdb2e8Lennart Poettering log_error_errno(r, "Failed to write entry (%d items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek server_rotate(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering server_vacuum(s, false, false);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek f = find_journal(s, uid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!f)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("Retrying write.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
8266e1c04db8cabe3c68510a0c1f07c09ecdb2e8Lennart Poettering if (r < 0)
8266e1c04db8cabe3c68510a0c1f07c09ecdb2e8Lennart Poettering log_error_errno(r, "Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
8266e1c04db8cabe3c68510a0c1f07c09ecdb2e8Lennart Poettering else
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering server_schedule_sync(s, priority);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekstatic void dispatch_message_real(
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Server *s,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek struct iovec *iovec, unsigned n, unsigned m,
3b3154df7e2773332bb814e167187367a0ccae4aLennart Poettering const struct ucred *ucred,
3b3154df7e2773332bb814e167187367a0ccae4aLennart Poettering const struct timeval *tv,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *label, size_t label_len,
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek const char *unit_id,
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering int priority,
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek pid_t object_pid) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek char pid[sizeof("_PID=") + DECIMAL_STR_MAX(pid_t)],
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering uid[sizeof("_UID=") + DECIMAL_STR_MAX(uid_t)],
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering gid[sizeof("_GID=") + DECIMAL_STR_MAX(gid_t)],
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering owner_uid[sizeof("_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)],
d378991747d67fff1d4dc39e7fb2bc8f49f1b561Mirco Tischler source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek o_uid[sizeof("OBJECT_UID=") + DECIMAL_STR_MAX(uid_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek o_gid[sizeof("OBJECT_GID=") + DECIMAL_STR_MAX(gid_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek o_owner_uid[sizeof("OBJECT_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)];
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek uid_t object_uid;
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek gid_t object_gid;
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek char *x;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek int r;
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering char *t, *c;
82499507b369fea3033a74c22813bf423301aef4Lennart Poettering uid_t realuid = 0, owner = 0, journal_uid;
82499507b369fea3033a74c22813bf423301aef4Lennart Poettering bool owner_valid = false;
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering#ifdef HAVE_AUDIT
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek char audit_session[sizeof("_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek audit_loginuid[sizeof("_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek o_audit_session[sizeof("OBJECT_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek o_audit_loginuid[sizeof("OBJECT_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)];
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering uint32_t audit;
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering uid_t loginuid;
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(iovec);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(n > 0);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek assert(n + N_IOVEC_META_FIELDS + (object_pid ? N_IOVEC_OBJECT_FIELDS : 0) <= m);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (ucred) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek realuid = ucred->uid;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(pid, "_PID="PID_FMT, ucred->pid);
c2457105d76e3daf159f554a9bafb9751b23d756Holger Hans Peter Freyther IOVEC_SET_STRING(iovec[n++], pid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(uid, "_UID="UID_FMT, ucred->uid);
c2457105d76e3daf159f554a9bafb9751b23d756Holger Hans Peter Freyther IOVEC_SET_STRING(iovec[n++], uid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(gid, "_GID="GID_FMT, ucred->gid);
c2457105d76e3daf159f554a9bafb9751b23d756Holger Hans Peter Freyther IOVEC_SET_STRING(iovec[n++], gid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = get_process_comm(ucred->pid, &t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_COMM=", t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = get_process_exe(ucred->pid, &t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_EXE=", t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
9bdbc2e2ec523dbefe1c1c7e164b5544aff0b185Lukas Nykryn r = get_process_cmdline(ucred->pid, 0, false, &t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_CMDLINE=", t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek free(t);
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden IOVEC_SET_STRING(iovec[n++], x);
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden }
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden r = get_process_capeff(ucred->pid, &t);
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_CAP_EFFECTIVE=", t);
3a83211689bdf4ab617a4fb79e11980c50918123Shawn Landden free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
0a20e3c10761378869af7bbef2733e3ae879d0f1Holger Hans Peter Freyther#ifdef HAVE_AUDIT
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = audit_session_from_pid(ucred->pid, &audit);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(audit_session, "_AUDIT_SESSION=%"PRIu32, audit);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering IOVEC_SET_STRING(iovec[n++], audit_session);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = audit_loginuid_from_pid(ucred->pid, &loginuid);
7027ff61a34a12487712b382a061c654acc3a679Lennart Poettering if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(audit_loginuid, "_AUDIT_LOGINUID="UID_FMT, loginuid);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering IOVEC_SET_STRING(iovec[n++], audit_loginuid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &c);
7027ff61a34a12487712b382a061c654acc3a679Lennart Poettering if (r >= 0) {
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek char *session = NULL;
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_CGROUP=", c);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering r = cg_path_get_session(c, &t);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering session = strjoina("_SYSTEMD_SESSION=", t);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering free(t);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], session);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering }
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering if (cg_path_get_owner_uid(c, &owner) >= 0) {
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering owner_valid = true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(owner_uid, "_SYSTEMD_OWNER_UID="UID_FMT, owner);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], owner_uid);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering if (cg_path_get_unit(c, &t) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_UNIT=", t);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering free(t);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering } else if (unit_id && !session) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_UNIT=", unit_id);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering }
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering if (cg_path_get_user_unit(c, &t) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_USER_UNIT=", t);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering } else if (unit_id && session) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_USER_UNIT=", unit_id);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering }
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering
0a244b8ecb6dfcb381fe831dc2aa9bacb2c12975Lennart Poettering if (cg_path_get_slice(c, &t) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_SLICE=", t);
0a244b8ecb6dfcb381fe831dc2aa9bacb2c12975Lennart Poettering free(t);
0a244b8ecb6dfcb381fe831dc2aa9bacb2c12975Lennart Poettering IOVEC_SET_STRING(iovec[n++], x);
0a244b8ecb6dfcb381fe831dc2aa9bacb2c12975Lennart Poettering }
0a244b8ecb6dfcb381fe831dc2aa9bacb2c12975Lennart Poettering
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering free(c);
2d43b190901902dbd98ccea77c1d1ddc9e2a9955Dan McGee } else if (unit_id) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SYSTEMD_UNIT=", unit_id);
2d43b190901902dbd98ccea77c1d1ddc9e2a9955Dan McGee IOVEC_SET_STRING(iovec[n++], x);
ef1673d16907726d83bdff2e57b5261997a85020Mirco Tischler }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#ifdef HAVE_SELINUX
6355e75610a8d47fc3ba5ab8bd442172a2cfe574Lennart Poettering if (mac_selinux_have()) {
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering if (label) {
f8294e4175918117ca6c131720bcf287eadcd029Josh Triplett x = alloca(strlen("_SELINUX_CONTEXT=") + label_len + 1);
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering *((char*) mempcpy(stpcpy(x, "_SELINUX_CONTEXT="), label, label_len)) = 0;
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering IOVEC_SET_STRING(iovec[n++], x);
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering } else {
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering security_context_t con;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering if (getpidcon(ucred->pid, &con) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("_SELINUX_CONTEXT=", con);
e7ff4e7fe9f3abd2297e4ef7b95dcb2804e051c3Greg Kroah-Hartman
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering freecon(con);
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering IOVEC_SET_STRING(iovec[n++], x);
d682b3a7e7c7c2941a4d3e193f1e330dbc9fae89Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek assert(n <= m);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (object_pid) {
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = get_process_uid(object_pid, &object_uid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(o_uid, "OBJECT_UID="UID_FMT, object_uid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], o_uid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = get_process_gid(object_pid, &object_gid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(o_gid, "OBJECT_GID="GID_FMT, object_gid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], o_gid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = get_process_comm(object_pid, &t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_COMM=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = get_process_exe(object_pid, &t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_EXE=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = get_process_cmdline(object_pid, 0, false, &t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_CMDLINE=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek#ifdef HAVE_AUDIT
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = audit_session_from_pid(object_pid, &audit);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(o_audit_session, "OBJECT_AUDIT_SESSION=%"PRIu32, audit);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], o_audit_session);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = audit_loginuid_from_pid(object_pid, &loginuid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(o_audit_loginuid, "OBJECT_AUDIT_LOGINUID="UID_FMT, loginuid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], o_audit_loginuid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek#endif
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering r = cg_pid_get_path_shifted(object_pid, s->cgroup_root, &c);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_SYSTEMD_CGROUP=", c);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek r = cg_path_get_session(c, &t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (r >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_SYSTEMD_SESSION=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (cg_path_get_owner_uid(c, &owner) >= 0) {
de0671ee7fe465e108f62dcbbbe9366f81dd9e9aZbigniew Jędrzejewski-Szmek sprintf(o_owner_uid, "OBJECT_SYSTEMD_OWNER_UID="UID_FMT, owner);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], o_owner_uid);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek if (cg_path_get_unit(c, &t) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_SYSTEMD_UNIT=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering }
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering if (cg_path_get_user_unit(c, &t) >= 0) {
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering x = strjoina("OBJECT_SYSTEMD_USER_UNIT=", t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(t);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], x);
19cace379f3f680d3201cd257ab3ca6708b2d45dLennart Poettering }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek free(c);
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek }
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek assert(n <= m);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (tv) {
ae018d9bc900d6355dea4af05119b49c67945184Lennart Poettering sprintf(source_time, "_SOURCE_REALTIME_TIMESTAMP=%llu", (unsigned long long) timeval_load(tv));
a569398925430de1f8479262e8ab39502054f2e9Lennart Poettering IOVEC_SET_STRING(iovec[n++], source_time);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* Note that strictly speaking storing the boot id here is
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * redundant since the entry includes this in-line
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * anyway. However, we need this indexed, too. */
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (!isempty(s->boot_id_field))
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering IOVEC_SET_STRING(iovec[n++], s->boot_id_field);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (!isempty(s->machine_id_field))
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering IOVEC_SET_STRING(iovec[n++], s->machine_id_field);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (!isempty(s->hostname_field))
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering IOVEC_SET_STRING(iovec[n++], s->hostname_field);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(n <= m);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
da4993920cdf5527b8528f0a483b54ab3cbc1971Kay Sievers if (s->split_mode == SPLIT_UID && realuid > 0)
40adcda869bda55f44b57fd3a2bd71d006dfb51bLennart Poettering /* Split up strictly by any UID */
759c945a43577d56e85a927f15e7d9aaa94a4e4aColin Walters journal_uid = realuid;
82499507b369fea3033a74c22813bf423301aef4Lennart Poettering else if (s->split_mode == SPLIT_LOGIN && realuid > 0 && owner_valid && owner > 0)
edc3797f7cd9e37c24e5241cac3263e7c918f732Lennart Poettering /* Split up by login UIDs. We do this only if the
edc3797f7cd9e37c24e5241cac3263e7c918f732Lennart Poettering * realuid is not root, in order not to accidentally
edc3797f7cd9e37c24e5241cac3263e7c918f732Lennart Poettering * leak privileged information to the user that is
edc3797f7cd9e37c24e5241cac3263e7c918f732Lennart Poettering * logged by a privileged process that is part of an
7517e17443225fafea86b21e42a36af69feb1dbcTorstein Husebø * unprivileged session. */
8a0889dfdafa3054c894e54852d8a9e3a7e8390bLennart Poettering journal_uid = owner;
da4993920cdf5527b8528f0a483b54ab3cbc1971Kay Sievers else
da4993920cdf5527b8528f0a483b54ab3cbc1971Kay Sievers journal_uid = 0;
759c945a43577d56e85a927f15e7d9aaa94a4e4aColin Walters
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering write_to_journal(s, journal_uid, iovec, n, priority);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekvoid server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek char mid[11 + 32 + 1];
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek struct iovec iovec[N_IOVEC_META_FIELDS + 5 + N_IOVEC_PAYLOAD_FIELDS];
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek unsigned n = 0, m;
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek va_list ap;
b92bea5d2a9481de69bb627a7b442a9f58fca43dZbigniew Jędrzejewski-Szmek struct ucred ucred = {};
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(format);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
b6fa25552e538eca207072e12d223e3523b21a19Evgeny Vereshchagin IOVEC_SET_STRING(iovec[n++], "SYSLOG_FACILITY=3");
b6fa25552e538eca207072e12d223e3523b21a19Evgeny Vereshchagin IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=systemd-journald");
b6fa25552e538eca207072e12d223e3523b21a19Evgeny Vereshchagin
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=driver");
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], "PRIORITY=6");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!sd_id128_equal(message_id, SD_ID128_NULL)) {
e2cc6eca73cd1df8be552d7c23f9ff3d69c06f1eLennart Poettering snprintf(mid, sizeof(mid), LOG_MESSAGE_ID(message_id));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], mid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek m = n;
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek va_start(ap, format);
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek r = log_format_iovec(iovec, ELEMENTSOF(iovec), &n, false, 0, format, ap);
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek /* Error handling below */
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek va_end(ap);
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek ucred.pid = getpid();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek ucred.uid = getuid();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek ucred.gid = getgid();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek if (r >= 0)
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0);
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek while (m < n)
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek free(iovec[m++].iov_base);
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek if (r < 0) {
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek /* We failed to format the message. Emit a warning instead. */
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek char buf[LINE_MAX];
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek xsprintf(buf, "MESSAGE=Entry printing failed: %s", strerror(-r));
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek n = 3;
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], "PRIORITY=4");
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek IOVEC_SET_STRING(iovec[n++], buf);
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0);
32917e33882778cf2ec6dd54b1e1082266fb072eZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekvoid server_dispatch_message(
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Server *s,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek struct iovec *iovec, unsigned n, unsigned m,
3b3154df7e2773332bb814e167187367a0ccae4aLennart Poettering const struct ucred *ucred,
3b3154df7e2773332bb814e167187367a0ccae4aLennart Poettering const struct timeval *tv,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *label, size_t label_len,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *unit_id,
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek int priority,
968f319679d9069af037240d0c3bcd126181cdacZbigniew Jędrzejewski-Szmek pid_t object_pid) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
7027ff61a34a12487712b382a061c654acc3a679Lennart Poettering int rl, r;
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer _cleanup_free_ char *path = NULL;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering uint64_t available = 0;
db91ea32aa223d1b087d99811226a9c59a1bb281Zbigniew Jędrzejewski-Szmek char *c;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(iovec || n == 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (n == 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (LOG_PRI(priority) > s->max_level_store)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
2f5df74a5ec135ab2baebf26af6f088e5b4b8205Holger Hans Peter Freyther /* Stop early in case the information will not be stored
2f5df74a5ec135ab2baebf26af6f088e5b4b8205Holger Hans Peter Freyther * in a journal. */
2f5df74a5ec135ab2baebf26af6f088e5b4b8205Holger Hans Peter Freyther if (s->storage == STORAGE_NONE)
2f5df74a5ec135ab2baebf26af6f088e5b4b8205Holger Hans Peter Freyther return;
2f5df74a5ec135ab2baebf26af6f088e5b4b8205Holger Hans Peter Freyther
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!ucred)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek goto finish;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &path);
7027ff61a34a12487712b382a061c654acc3a679Lennart Poettering if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek goto finish;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* example: /user/lennart/3/foobar
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * /system/dbus.service/foobar
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek *
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * So let's cut of everything past the third /, since that is
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * where user directories start */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek c = strchr(path, '/');
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (c) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek c = strchr(c+1, '/');
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (c) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek c = strchr(c+1, '/');
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (c)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek *c = 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) determine_space(s, false, false, &available, NULL);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering rl = journal_rate_limit_test(s->rate_limit, path, priority & LOG_PRIMASK, available);
db91ea32aa223d1b087d99811226a9c59a1bb281Zbigniew Jędrzejewski-Szmek if (rl == 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* Write a suppression message if we suppressed something */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (rl > 1)
db91ea32aa223d1b087d99811226a9c59a1bb281Zbigniew Jędrzejewski-Szmek server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED,
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek LOG_MESSAGE("Suppressed %u messages from %s", rl - 1, path),
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek NULL);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekfinish:
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id, priority, object_pid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
caa2f4c0c9613b2e02aafa308c8fb092576014a9Zbigniew Jędrzejewski-Szmekstatic int system_journal_open(Server *s, bool flush_requested) {
84267e4043cf88bf540b5bf9cd65e194670a4ffaLennart Poettering const char *fn;
09eba4d46b1119c758fba38a520a38c8d19af739Lennart Poettering int r = 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->system_journal &&
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
caa2f4c0c9613b2e02aafa308c8fb092576014a9Zbigniew Jędrzejewski-Szmek (flush_requested
caa2f4c0c9613b2e02aafa308c8fb092576014a9Zbigniew Jędrzejewski-Szmek || access("/run/systemd/journal/flushed", F_OK) >= 0)) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* If in auto mode: first try to create the machine
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * path, but not the prefix.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek *
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * If in persistent mode: create /var/log/journal and
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * the machine path */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->storage == STORAGE_PERSISTENT)
ac892057c2ddd8f06323c73ebd80423cc3ec7190Dimitri John Ledkov (void) mkdir_p("/var/log/journal/", 0755);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering fn = strjoina("/var/log/journal/", SERVER_MACHINE_ID(s));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek (void) mkdir(fn, 0755);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering fn = strjoina(fn, "/system.journal");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (r >= 0) {
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek server_add_acls(s->system_journal, 0);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) determine_space_for(s, &s->system_metrics, "/var/log/journal/", "System journal", true, true, NULL, NULL);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering } else if (r < 0) {
433dd100442e8197868def975c6fd38b48dc6439Lukas Nykryn if (r != -ENOENT && r != -EROFS)
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to open system journal: %m");
e40ec7aec5e64cd0cfa5fc556d6a9747229b5794Zbigniew Jędrzejewski-Szmek
433dd100442e8197868def975c6fd38b48dc6439Lukas Nykryn r = 0;
433dd100442e8197868def975c6fd38b48dc6439Lukas Nykryn }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->runtime_journal &&
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek (s->storage != STORAGE_NONE)) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering fn = strjoina("/run/log/journal/", SERVER_MACHINE_ID(s), "/system.journal");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->system_journal) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* Try to open the runtime journal, but only
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * if it already exists, so that we can flush
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * it into the system journal */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_open(fn, O_RDWR, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r != -ENOENT)
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to open runtime journal: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek } else {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek /* OK, we really need the runtime journal, so create
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek * it if necessary. */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
fc1d70af2101e16c9e6f3c5bfd5ab315ee9e6daeLennart Poettering (void) mkdir("/run/log", 0755);
fc1d70af2101e16c9e6f3c5bfd5ab315ee9e6daeLennart Poettering (void) mkdir("/run/log/journal", 0755);
fc1d70af2101e16c9e6f3c5bfd5ab315ee9e6daeLennart Poettering (void) mkdir_parents(fn, 0750);
fc1d70af2101e16c9e6f3c5bfd5ab315ee9e6daeLennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt if (r < 0)
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(r, "Failed to open runtime journal: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (s->runtime_journal) {
5c3bde3fa8613e09e694198862ea9038566af422Zbigniew Jędrzejewski-Szmek server_add_acls(s->runtime_journal, 0);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) determine_space_for(s, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", true, true, NULL, NULL);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint server_flush_to_var(Server *s) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek sd_id128_t machine;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek sd_journal *j = NULL;
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering char ts[FORMAT_TIMESPAN_MAX];
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering usec_t start;
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering unsigned n = 0;
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->storage != STORAGE_AUTO &&
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->storage != STORAGE_PERSISTENT)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->runtime_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) system_journal_open(s, true);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->system_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("Flushing to /var...");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering start = now(CLOCK_MONOTONIC);
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = sd_id128_get_machine(&machine);
00a168618906bea43c3c57e20b9152582c324bf8Olivier Brunel if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt if (r < 0)
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(r, "Failed to read runtime journal: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
93b73b064c663d6248bebfbbbd82989b5ca10fc5Lennart Poettering sd_journal_set_data_threshold(j, 0);
93b73b064c663d6248bebfbbbd82989b5ca10fc5Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek SD_JOURNAL_FOREACH(j) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Object *o = NULL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek f = j->current_file;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(f && f->current_offset > 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering n++;
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0) {
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Can't read entry: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek goto finish;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r >= 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek continue;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!shall_try_append_again(s->system_journal, r)) {
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Can't write entry: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek goto finish;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek server_rotate(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering server_vacuum(s, false, false);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering if (!s->system_journal) {
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering log_notice("Didn't flush runtime journal since rotation of system journal wasn't successful.");
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering r = -EIO;
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering goto finish;
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering }
253f59dff9c93ee1d2c33444b5715e42bc1c6889Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_debug("Retrying write.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0) {
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Can't write entry: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek goto finish;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
804ae586d475d77946debb22c1bc9ee049d4750cLennart Poettering r = 0;
804ae586d475d77946debb22c1bc9ee049d4750cLennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekfinish:
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_post_change(s->system_journal);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
804ae586d475d77946debb22c1bc9ee049d4750cLennart Poettering s->runtime_journal = journal_file_close(s->runtime_journal);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r >= 0)
c6878637502b1717a110a9a7e8bba32a8583fcdfLennart Poettering (void) rm_rf("/run/log/journal", REMOVE_ROOT);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
763c7aa288485cf5ab627fe1d25ff58e76f9dacbZbigniew Jędrzejewski-Szmek sd_journal_close(j);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek server_driver_message(s, SD_ID128_NULL,
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek LOG_MESSAGE("Time spent on flushing to /var is %s for %u entries.",
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0),
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek n),
8a03c9ef744e13dc700a7e7ca6cae8afdcf0d71cZbigniew Jędrzejewski-Szmek NULL);
fbb634117d0b0ebd5b105e65b141e75ae9af7f8fLennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8531ae707d4d0203e83304d4af948b8169a5fce1Lennart Poetteringint server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering Server *s = userdata;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct ucred *ucred = NULL;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct timeval *tv = NULL;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct cmsghdr *cmsg;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering char *label = NULL;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering size_t label_len = 0, m;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct iovec iovec;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering ssize_t n;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering int *fds = NULL, v = 0;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering unsigned n_fds = 0;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering union {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct cmsghdr cmsghdr;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering /* We use NAME_MAX space for the SELinux label
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * here. The kernel currently enforces no
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * limit, but according to suggestions from
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * the SELinux people this will change and it
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * will probably be identical to NAME_MAX. For
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * now we use that, but this should be updated
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * one day when the final limit is known. */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering CMSG_SPACE(sizeof(struct timeval)) +
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering CMSG_SPACE(sizeof(int)) + /* fd */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering CMSG_SPACE(NAME_MAX)]; /* selinux label */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering } control = {};
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering union sockaddr_union sa = {};
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering struct msghdr msghdr = {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_iov = &iovec,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_iovlen = 1,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_control = &control,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_controllen = sizeof(control),
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_name = &sa,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering .msg_namelen = sizeof(sa),
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering };
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering assert(fd == s->native_fd || fd == s->syslog_fd || fd == s->audit_fd);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (revents != EPOLLIN) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering log_error("Got invalid event from epoll for datagram fd: %"PRIx32, revents);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return -EIO;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering }
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering /* Try to get the right size, if we can. (Not all
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * sockets support SIOCINQ, hence we just try, but
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering * don't rely on it. */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering (void) ioctl(fd, SIOCINQ, &v);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering /* Fix it up, if it is too small. We use the same fixed value as auditd here. Awful! */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering m = PAGE_ALIGN(MAX3((size_t) v + 1,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering (size_t) LINE_MAX,
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering ALIGN(sizeof(struct nlmsghdr)) + ALIGN((size_t) MAX_AUDIT_MESSAGE_LENGTH)) + 1);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (!GREEDY_REALLOC(s->buffer, s->buffer_size, m))
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering return log_oom();
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering iovec.iov_base = s->buffer;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering iovec.iov_len = s->buffer_size - 1; /* Leave room for trailing NUL we add later */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering n = recvmsg(fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (n < 0) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (errno == EINTR || errno == EAGAIN)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering return 0;
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering return log_error_errno(errno, "recvmsg() failed: %m");
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering }
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering CMSG_FOREACH(cmsg, &msghdr) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (cmsg->cmsg_level == SOL_SOCKET &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_type == SCM_CREDENTIALS &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering ucred = (struct ucred*) CMSG_DATA(cmsg);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (cmsg->cmsg_level == SOL_SOCKET &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_type == SCM_SECURITY) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering label = (char*) CMSG_DATA(cmsg);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering label_len = cmsg->cmsg_len - CMSG_LEN(0);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering } else if (cmsg->cmsg_level == SOL_SOCKET &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_type == SO_TIMESTAMP &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering tv = (struct timeval*) CMSG_DATA(cmsg);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (cmsg->cmsg_level == SOL_SOCKET &&
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering cmsg->cmsg_type == SCM_RIGHTS) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering fds = (int*) CMSG_DATA(cmsg);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering /* And a trailing NUL, just in case */
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering s->buffer[n] = 0;
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (fd == s->syslog_fd) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (n > 0 && n_fds == 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering server_process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (n_fds > 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering log_warning("Got file descriptors via syslog socket. Ignoring.");
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering } else if (fd == s->native_fd) {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (n > 0 && n_fds == 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (n == 0 && n_fds == 1)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering server_process_native_file(s, fds[0], ucred, tv, label, label_len);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (n_fds > 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering log_warning("Got too many file descriptors via native socket. Ignoring.");
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering } else {
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering assert(fd == s->audit_fd);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering if (n > 0 && n_fds == 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering server_process_audit_message(s, s->buffer, n, ucred, &sa, msghdr.msg_namelen);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering else if (n_fds > 0)
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering log_warning("Got file descriptors via audit socket. Ignoring.");
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering }
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering close_many(fds, n_fds);
a315ac4e076c4ce7ce3e5c95792cf916d5e918c5Lennart Poettering return 0;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poetteringstatic int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering Server *s = userdata;
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering server_flush_to_var(s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering server_sync(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering server_vacuum(s, false, false);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering r = touch("/run/systemd/journal/flushed");
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering if (r < 0)
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering log_warning_errno(r, "Failed to touch /run/systemd/journal/flushed, ignoring: %m");
74055aa76278232ff05574fc47c4e6b3560554a7Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return 0;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poetteringstatic int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering Server *s = userdata;
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering log_info("Received request to rotate journal from PID " PID_FMT, si->ssi_pid);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering server_rotate(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering server_vacuum(s, true, true);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
dbd6e31cf91ab86a4a2fffeb50ccef211da3126dLennart Poettering /* Let clients know when the most recent rotation happened. */
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering r = write_timestamp_file_atomic("/run/systemd/journal/rotated", now(CLOCK_MONOTONIC));
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering if (r < 0)
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering log_warning_errno(r, "Failed to write /run/systemd/journal/rotated, ignoring: %m");
dbd6e31cf91ab86a4a2fffeb50ccef211da3126dLennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return 0;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poetteringstatic int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering Server *s = userdata;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
4daf54a851e4fb7ed1a13c3117bba12528fd2c7fZbigniew Jędrzejewski-Szmek log_received_signal(LOG_INFO, si);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
6203e07a83214a55bb1f88508fcda2005c601deaLennart Poettering sd_event_exit(s->event, 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poetteringstatic int dispatch_sigrtmin1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering Server *s = userdata;
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering int r;
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering assert(s);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering log_debug("Received request to sync from PID " PID_FMT, si->ssi_pid);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering server_sync(s);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering /* Let clients know when the most recent sync happened. */
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering r = write_timestamp_file_atomic("/run/systemd/journal/synced", now(CLOCK_MONOTONIC));
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering if (r < 0)
33d52ab92f2f0bfd706e6f343d172618d1e03f3dLennart Poettering log_warning_errno(r, "Failed to write /run/systemd/journal/synced, ignoring: %m");
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering return 0;
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering}
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poetteringstatic int setup_signals(Server *s) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering assert(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
151b9b9662a90455262ce575a8a8ae74bf4ff336Lennart Poettering r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
151b9b9662a90455262ce575a8a8ae74bf4ff336Lennart Poettering r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2, dispatch_sigusr2, s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
151b9b9662a90455262ce575a8a8ae74bf4ff336Lennart Poettering r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM, dispatch_sigterm, s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering /* Let's process SIGTERM late, so that we flush all queued
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering * messages to disk before we exit */
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering r = sd_event_source_set_priority(s->sigterm_event_source, SD_EVENT_PRIORITY_NORMAL+20);
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering if (r < 0)
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering return r;
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering /* When journald is invoked on the terminal (when debugging),
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering * it's useful if C-c is handled equivalent to SIGTERM. */
151b9b9662a90455262ce575a8a8ae74bf4ff336Lennart Poettering r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT, dispatch_sigterm, s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering r = sd_event_source_set_priority(s->sigint_event_source, SD_EVENT_PRIORITY_NORMAL+20);
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering if (r < 0)
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering return r;
b374689c02c681671a3c3c0b0fd3add32386b442Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering /* SIGRTMIN+1 causes an immediate sync. We process this very
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering * late, so that everything else queued at this point is
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering * really written to disk. Clients can watch
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering * /run/systemd/journal/synced with inotify until its mtime
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering * changes to see when a sync happened. */
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering r = sd_event_add_signal(s->event, &s->sigrtmin1_event_source, SIGRTMIN+1, dispatch_sigrtmin1, s);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering if (r < 0)
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering return r;
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering r = sd_event_source_set_priority(s->sigrtmin1_event_source, SD_EVENT_PRIORITY_NORMAL+15);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering if (r < 0)
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering return r;
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekstatic int server_parse_proc_cmdline(Server *s) {
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer _cleanup_free_ char *line = NULL;
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani const char *p;
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering int r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering r = proc_cmdline(&line);
b5884878a2874447b2a9f07f324a7cd909d96d48Lennart Poettering if (r < 0) {
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return 0;
b5884878a2874447b2a9f07f324a7cd909d96d48Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani p = line;
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani for(;;) {
ff82c36c792a23a03994af2ae40cbd441e128bb4Zbigniew Jędrzejewski-Szmek _cleanup_free_ char *word = NULL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani r = extract_first_word(&p, &word, NULL, 0);
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani if (r < 0)
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani return log_error_errno(r, "Failed to parse journald syntax \"%s\": %m", line);
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani if (r == 0)
d581d9d91fa5c42ce7828a7d0b1334d370cf1670Susant Sahani break;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (startswith(word, "systemd.journald.forward_to_syslog=")) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = parse_boolean(word + 35);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->forward_to_syslog = r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = parse_boolean(word + 33);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->forward_to_kmsg = r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.journald.forward_to_console=")) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = parse_boolean(word + 36);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->forward_to_console = r;
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen } else if (startswith(word, "systemd.journald.forward_to_wall=")) {
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen r = parse_boolean(word + 33);
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen if (r < 0)
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen log_warning("Failed to parse forward to wall switch %s. Ignoring.", word + 33);
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen else
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen s->forward_to_wall = r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.journald"))
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_warning("Invalid systemd.journald parameter. Ignoring.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
804ae586d475d77946debb22c1bc9ee049d4750cLennart Poettering /* do not warn about state here, since probably systemd already did */
db91ea32aa223d1b087d99811226a9c59a1bb281Zbigniew Jędrzejewski-Szmek return 0;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekstatic int server_parse_config_file(Server *s) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
75eb615480afd787fa412f0a529523f568f79b26Lennart Poettering return config_parse_many(PKGSYSCONFDIR "/journald.conf",
75eb615480afd787fa412f0a529523f568f79b26Lennart Poettering CONF_PATHS_NULSTR("systemd/journald.conf.d"),
a9edaeff8481573764288ccf7e433a95b6dc7c03Josh Triplett "Journal\0",
a9edaeff8481573764288ccf7e433a95b6dc7c03Josh Triplett config_item_perf_lookup, journald_gperf_lookup,
a9edaeff8481573764288ccf7e433a95b6dc7c03Josh Triplett false, s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poetteringstatic int server_dispatch_sync(sd_event_source *es, usec_t t, void *userdata) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering Server *s = userdata;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk assert(s);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering server_sync(s);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk return 0;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk}
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poetteringint server_schedule_sync(Server *s, int priority) {
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk int r;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk assert(s);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering if (priority <= LOG_CRIT) {
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering /* Immediately sync to disk when this is of priority CRIT, ALERT, EMERG */
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering server_sync(s);
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering return 0;
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering }
d07f7b9ef2835c290d6beadebd17d15308608eeaLennart Poettering
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (s->sync_scheduled)
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk return 0;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (s->sync_interval_usec > 0) {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering usec_t when;
ca2670162464b98f44d3f30a1d8b47b02609784cMichał Bartoszkiewicz
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering when += s->sync_interval_usec;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (!s->sync_event_source) {
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering r = sd_event_add_time(
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering s->event,
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering &s->sync_event_source,
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering CLOCK_MONOTONIC,
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering when, 0,
6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222bLennart Poettering server_dispatch_sync, s);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = sd_event_source_set_priority(s->sync_event_source, SD_EVENT_PRIORITY_IMPORTANT);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering } else {
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = sd_event_source_set_time(s->sync_event_source, when);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_ONESHOT);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering }
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk if (r < 0)
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering return r;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering s->sync_scheduled = true;
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering }
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk return 0;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk}
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poetteringstatic int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering Server *s = userdata;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering assert(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering server_cache_hostname(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return 0;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering}
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poetteringstatic int server_open_hostname(Server *s) {
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering int r;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering assert(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering s->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (s->hostname_fd < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to open /proc/sys/kernel/hostname: %m");
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
151b9b9662a90455262ce575a8a8ae74bf4ff336Lennart Poettering r = sd_event_add_io(s->event, &s->hostname_event_source, s->hostname_fd, 0, dispatch_hostname_change, s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (r < 0) {
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner /* kernels prior to 3.2 don't support polling this file. Ignore
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner * the failure. */
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner if (r == -EPERM) {
e53fc357a9bb9d0a5362ccc4246d598cb0febd5eLennart Poettering log_warning_errno(r, "Failed to register hostname fd in event loop, ignoring: %m");
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering s->hostname_fd = safe_close(s->hostname_fd);
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner return 0;
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner }
28def94cc8fd4394b20e2155d7130166662343c4Dave Reisner
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(r, "Failed to register hostname fd in event loop: %m");
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering }
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering r = sd_event_source_set_priority(s->hostname_event_source, SD_EVENT_PRIORITY_IMPORTANT-10);
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt if (r < 0)
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(r, "Failed to adjust priority of host name event source: %m");
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return 0;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering}
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poetteringstatic int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering Server *s = userdata;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering int r;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(s);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(s->notify_event_source == es);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(s->notify_fd == fd);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /* The $NOTIFY_SOCKET is writable again, now send exactly one
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering * message on it. Either it's the wtachdog event, the initial
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering * READY=1 event or an stdout stream event. If there's nothing
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering * to write anymore, turn our event source off. The next time
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering * there's something to send it will be turned on again. */
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (!s->sent_notify_ready) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering static const char p[] =
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering "READY=1\n"
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering "STATUS=Processing requests...";
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering ssize_t l;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering l = send(s->notify_fd, p, strlen(p), MSG_DONTWAIT);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (l < 0) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (errno == EAGAIN)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return log_error_errno(errno, "Failed to send READY=1 notification message: %m");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering }
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering s->sent_notify_ready = true;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering log_debug("Sent READY=1 notification.");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering } else if (s->send_watchdog) {
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering static const char p[] =
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering "WATCHDOG=1";
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering ssize_t l;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering l = send(s->notify_fd, p, strlen(p), MSG_DONTWAIT);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (l < 0) {
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (errno == EAGAIN)
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return 0;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return log_error_errno(errno, "Failed to send WATCHDOG=1 notification message: %m");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering }
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering s->send_watchdog = false;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering log_debug("Sent WATCHDOG=1 notification.");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering } else if (s->stdout_streams_notify_queue)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /* Dispatch one stream notification event */
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering stdout_stream_send_notify(s->stdout_streams_notify_queue);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /* Leave us enabled if there's still more to to do. */
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (s->send_watchdog || s->stdout_streams_notify_queue)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /* There was nothing to do anymore, let's turn ourselves off. */
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering r = sd_event_source_set_enabled(es, SD_EVENT_OFF);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (r < 0)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return log_error_errno(r, "Failed to turn off notify event source: %m");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering}
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poetteringstatic int dispatch_watchdog(sd_event_source *es, uint64_t usec, void *userdata) {
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering Server *s = userdata;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering int r;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering assert(s);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering s->send_watchdog = true;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering r = sd_event_source_set_enabled(s->notify_event_source, SD_EVENT_ON);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (r < 0)
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering log_warning_errno(r, "Failed to turn on notify event source: %m");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering r = sd_event_source_set_time(s->watchdog_event_source, usec + s->watchdog_usec / 2);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (r < 0)
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return log_error_errno(r, "Failed to restart watchdog event source: %m");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering r = sd_event_source_set_enabled(s->watchdog_event_source, SD_EVENT_ON);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (r < 0)
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return log_error_errno(r, "Failed to enable watchdog event source: %m");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return 0;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering}
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poetteringstatic int server_connect_notify(Server *s) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering union sockaddr_union sa = {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering .un.sun_family = AF_UNIX,
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering };
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering const char *e;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering int r;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(s);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(s->notify_fd < 0);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering assert(!s->notify_event_source);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /*
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering So here's the problem: we'd like to send notification
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering messages to PID 1, but we cannot do that via sd_notify(),
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering since that's synchronous, and we might end up blocking on
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering it. Specifically: given that PID 1 might block on
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering dbus-daemon during IPC, and dbus-daemon is logging to us,
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering and might hence block on us, we might end up in a deadlock
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if we block on sending PID 1 notification messages -- by
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering generating a full blocking circle. To avoid this, let's
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering create a non-blocking socket, and connect it to the
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering notification socket, and then wait for POLLOUT before we
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering send anything. This should efficiently avoid any deadlocks,
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering as we'll never block on PID 1, hence PID 1 can safely block
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering on dbus-daemon which can safely block on us again.
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering Don't think that this issue is real? It is, see:
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering https://github.com/systemd/systemd/issues/1505
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering */
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering e = getenv("NOTIFY_SOCKET");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (!e)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering log_error("NOTIFY_SOCKET set to an invalid value: %s", e);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return -EINVAL;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering }
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (strlen(e) > sizeof(sa.un.sun_path)) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering log_error("NOTIFY_SOCKET path too long: %s", e);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return -EINVAL;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering }
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering s->notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (s->notify_fd < 0)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return log_error_errno(errno, "Failed to create notify socket: %m");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering (void) fd_inc_sndbuf(s->notify_fd, NOTIFY_SNDBUF_SIZE);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering strncpy(sa.un.sun_path, e, sizeof(sa.un.sun_path));
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (sa.un.sun_path[0] == '@')
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering sa.un.sun_path[0] = 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering r = connect(s->notify_fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(e));
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (r < 0)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return log_error_errno(errno, "Failed to connect to notify socket: %m");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering r = sd_event_add_io(s->event, &s->notify_event_source, s->notify_fd, EPOLLOUT, dispatch_notify_event, s);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering if (r < 0)
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return log_error_errno(r, "Failed to watch notification socket: %m");
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (sd_watchdog_enabled(false, &s->watchdog_usec) > 0) {
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering s->send_watchdog = true;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
4de2402b603ea2f518f451d06f09e15aeae54fabLennart Poettering r = sd_event_add_time(s->event, &s->watchdog_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + s->watchdog_usec/2, s->watchdog_usec/4, dispatch_watchdog, s);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering if (r < 0)
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering return log_error_errno(r, "Failed to add watchdog time event: %m");
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering }
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering /* This should fire pretty soon, which we'll use to send the
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering * READY=1 event. */
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering return 0;
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering}
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint server_init(Server *s) {
13790add4bf648fed816361794d8277a75253410Lennart Poettering _cleanup_fdset_free_ FDSet *fds = NULL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek int n, r, fd;
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek bool no_sockets;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek zero(*s);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering s->syslog_fd = s->native_fd = s->stdout_fd = s->dev_kmsg_fd = s->audit_fd = s->hostname_fd = s->notify_fd = -1;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->compress = true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->seal = true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering s->watchdog_usec = USEC_INFINITY;
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk s->sync_interval_usec = DEFAULT_SYNC_INTERVAL_USEC;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk s->sync_scheduled = false;
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen s->forward_to_wall = true;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
e150e82097211f09b911c7784a89ef9efed713caMichał Bartoszkiewicz s->max_file_usec = DEFAULT_MAX_FILE_USEC;
e150e82097211f09b911c7784a89ef9efed713caMichał Bartoszkiewicz
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->max_level_store = LOG_DEBUG;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->max_level_syslog = LOG_DEBUG;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->max_level_kmsg = LOG_NOTICE;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->max_level_console = LOG_INFO;
40b71e89bae4e51768db4dc50ec64c1e9c96eec4Sebastian Thorarensen s->max_level_wall = LOG_EMERG;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering journal_reset_metrics(&s->system_metrics);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering journal_reset_metrics(&s->runtime_metrics);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek server_parse_config_file(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek server_parse_proc_cmdline(s);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
d288f79fb4a2fe4a93cf99f74dacd2cebd3f2440Zbigniew Jędrzejewski-Szmek if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
b1389b0d0805392570085acc7cb10eafcf885405Zbigniew Jędrzejewski-Szmek log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",
b1389b0d0805392570085acc7cb10eafcf885405Zbigniew Jędrzejewski-Szmek s->rate_limit_interval, s->rate_limit_burst);
d288f79fb4a2fe4a93cf99f74dacd2cebd3f2440Zbigniew Jędrzejewski-Szmek s->rate_limit_interval = s->rate_limit_burst = 0;
d288f79fb4a2fe4a93cf99f74dacd2cebd3f2440Zbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering (void) mkdir_p("/run/systemd/journal", 0755);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt s->user_journals = ordered_hashmap_new(NULL);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->user_journals)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return log_oom();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->mmap = mmap_cache_new();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->mmap)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return log_oom();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = sd_event_default(&s->event);
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt if (r < 0)
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(r, "Failed to create event loop: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek n = sd_listen_fds(true);
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt if (n < 0)
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt return log_error_errno(n, "Failed to read listening file descriptors from environment: %m");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->native_fd >= 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_error("Too many native sockets passed.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return -EINVAL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->native_fd = fd;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->stdout_fd >= 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_error("Too many stdout sockets passed.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return -EINVAL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->stdout_fd = fd;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
03ee5c38cb0da193dd08733fb4c0c2809cee6a99Lennart Poettering } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0 ||
03ee5c38cb0da193dd08733fb4c0c2809cee6a99Lennart Poettering sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/dev-log", 0) > 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->syslog_fd >= 0) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek log_error("Too many /dev/log sockets passed.");
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return -EINVAL;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->syslog_fd = fd;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering } else if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering if (s->audit_fd >= 0) {
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering log_error("Too many audit sockets passed.");
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering return -EINVAL;
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering }
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering s->audit_fd = fd;
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
4ec3cd7391e119b597375c547cf4ed50fce9f115Lennart Poettering } else {
4ec3cd7391e119b597375c547cf4ed50fce9f115Lennart Poettering
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (!fds) {
13790add4bf648fed816361794d8277a75253410Lennart Poettering fds = fdset_new();
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (!fds)
13790add4bf648fed816361794d8277a75253410Lennart Poettering return log_oom();
13790add4bf648fed816361794d8277a75253410Lennart Poettering }
4ec3cd7391e119b597375c547cf4ed50fce9f115Lennart Poettering
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = fdset_put(fds, fd);
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (r < 0)
13790add4bf648fed816361794d8277a75253410Lennart Poettering return log_oom();
4ec3cd7391e119b597375c547cf4ed50fce9f115Lennart Poettering }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek /* Try to restore streams, but don't bother if this fails */
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek (void) server_restore_streams(s, fds);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (fdset_size(fds) > 0) {
13790add4bf648fed816361794d8277a75253410Lennart Poettering log_warning("%u unknown file descriptors passed, closing.", fdset_size(fds));
13790add4bf648fed816361794d8277a75253410Lennart Poettering fds = fdset_free(fds);
13790add4bf648fed816361794d8277a75253410Lennart Poettering }
13790add4bf648fed816361794d8277a75253410Lennart Poettering
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek no_sockets = s->native_fd < 0 && s->stdout_fd < 0 && s->syslog_fd < 0 && s->audit_fd < 0;
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek /* always open stdout, syslog, native, and kmsg sockets */
37b7affefde5443680d73642a990ce86776e28afZbigniew Jędrzejewski-Szmek
37b7affefde5443680d73642a990ce86776e28afZbigniew Jędrzejewski-Szmek /* systemd-journald.socket: /run/systemd/journal/stdout */
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek r = server_open_stdout_socket(s);
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek if (r < 0)
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek return r;
15d91bff36c61d38df8edff258d1702a017a0e66Zbigniew Jędrzejewski-Szmek
37b7affefde5443680d73642a990ce86776e28afZbigniew Jędrzejewski-Szmek /* systemd-journald-dev-log.socket: /run/systemd/journal/dev-log */
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = server_open_syslog_socket(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
37b7affefde5443680d73642a990ce86776e28afZbigniew Jędrzejewski-Szmek /* systemd-journald.socket: /run/systemd/journal/socket */
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = server_open_native_socket(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
37b7affefde5443680d73642a990ce86776e28afZbigniew Jędrzejewski-Szmek /* /dev/ksmg */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = server_open_dev_kmsg(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek /* Unless we got *some* sockets and not audit, open audit socket */
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek if (s->audit_fd >= 0 || no_sockets) {
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek r = server_open_audit(s);
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek if (r < 0)
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek return r;
7d18d348da26fdbb392c76b0f5edb7f06282afbbZbigniew Jędrzejewski-Szmek }
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek r = server_open_kernel_seqnum(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering r = server_open_hostname(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering if (r < 0)
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering return r;
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering r = setup_signals(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (r < 0)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return r;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek s->udev = udev_new();
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->udev)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return -ENOMEM;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (!s->rate_limit)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek return -ENOMEM;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering r = cg_get_root_path(&s->cgroup_root);
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering if (r < 0)
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering return r;
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering server_cache_hostname(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering server_cache_boot_id(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering server_cache_machine_id(s);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering (void) server_connect_notify(s);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering
804ae586d475d77946debb22c1bc9ee049d4750cLennart Poettering return system_journal_open(s, false);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekvoid server_maybe_append_tags(Server *s) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#ifdef HAVE_GCRYPT
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Iterator i;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek usec_t n;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek n = now(CLOCK_REALTIME);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->system_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_maybe_append_tag(s->system_journal, n);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt ORDERED_HASHMAP_FOREACH(f, s->user_journals, i)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_maybe_append_tag(f, n);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#endif
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekvoid server_done(Server *s) {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek JournalFile *f;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek assert(s);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek while (s->stdout_streams)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek stdout_stream_free(s->stdout_streams);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->system_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_close(s->system_journal);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->runtime_journal)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_close(s->runtime_journal);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt while ((f = ordered_hashmap_steal_first(s->user_journals)))
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_file_close(f);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
43cf8388ea4ffed1801468d4b650d6e48eefce9eMichal Schmidt ordered_hashmap_free(s->user_journals);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->syslog_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->native_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->stdout_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->dev_kmsg_event_source);
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering sd_event_source_unref(s->audit_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->sync_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->sigusr1_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->sigusr2_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->sigterm_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_source_unref(s->sigint_event_source);
94b6551662e0db8eb09768ed70f77759f322b4c6Lennart Poettering sd_event_source_unref(s->sigrtmin1_event_source);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering sd_event_source_unref(s->hostname_event_source);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering sd_event_source_unref(s->notify_event_source);
119e9655dc36f18ed74f9a256d5c693b5aeb43abLennart Poettering sd_event_source_unref(s->watchdog_event_source);
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering sd_event_unref(s->event);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering safe_close(s->syslog_fd);
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering safe_close(s->native_fd);
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering safe_close(s->stdout_fd);
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering safe_close(s->dev_kmsg_fd);
875c2e220e2611165e09051c4747971811f1de58Lennart Poettering safe_close(s->audit_fd);
03e334a1c7dc8c20c38902aa039440763acc9b17Lennart Poettering safe_close(s->hostname_fd);
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering safe_close(s->notify_fd);
0c24bb2346b6b6232d67aacd5236b56ea4989de4Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->rate_limit)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek journal_rate_limit_free(s->rate_limit);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->kernel_seqnum)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek munmap(s->kernel_seqnum, sizeof(uint64_t));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek free(s->buffer);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek free(s->tty_path);
e9174f29c7e3ee45137537b126458718913a3ec5Lennart Poettering free(s->cgroup_root);
99d0966e75a984bed4f117c888ecc93e16e7b7b6Lennart Poettering free(s->hostname_field);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek if (s->mmap)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek mmap_cache_unref(s->mmap);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
3e044c492e3ebe64f4e3175c94f9db8a62557b82Markus Elfring udev_unref(s->udev);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek}
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringstatic const char* const storage_table[_STORAGE_MAX] = {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [STORAGE_AUTO] = "auto",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [STORAGE_VOLATILE] = "volatile",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [STORAGE_PERSISTENT] = "persistent",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [STORAGE_NONE] = "none"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering};
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_STRING_TABLE_LOOKUP(storage, Storage);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringstatic const char* const split_mode_table[_SPLIT_MAX] = {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [SPLIT_LOGIN] = "login",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [SPLIT_UID] = "uid",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering [SPLIT_NONE] = "none",
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering};
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting");