]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald-server.c
util-lib: move is_main_thread() to process-util.[ch]
[thirdparty/systemd.git] / src / journal / journald-server.c
CommitLineData
d025f1e4
ZJS
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2011 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
24882e06
LP
22#ifdef HAVE_SELINUX
23#include <selinux/selinux.h>
24#endif
8580d1f7
LP
25#include <sys/ioctl.h>
26#include <sys/mman.h>
27#include <sys/signalfd.h>
28#include <sys/statvfs.h>
07630cea 29#include <linux/sockios.h>
24882e06 30
8580d1f7
LP
31#include "libudev.h"
32#include "sd-daemon.h"
74df0fca
LP
33#include "sd-journal.h"
34#include "sd-messages.h"
8580d1f7
LP
35
36#include "acl-util.h"
430f0182 37#include "audit-util.h"
d025f1e4 38#include "cgroup-util.h"
d025f1e4 39#include "conf-parser.h"
a0956174 40#include "dirent-util.h"
0dec689b 41#include "extract-word.h"
3ffd4af2 42#include "fd-util.h"
958b66ea 43#include "formats-util.h"
f4f15635 44#include "fs-util.h"
8580d1f7 45#include "hashmap.h"
958b66ea 46#include "hostname-util.h"
8580d1f7
LP
47#include "journal-authenticate.h"
48#include "journal-file.h"
d025f1e4
ZJS
49#include "journal-internal.h"
50#include "journal-vacuum.h"
8580d1f7 51#include "journald-audit.h"
d025f1e4 52#include "journald-kmsg.h"
d025f1e4 53#include "journald-native.h"
8580d1f7 54#include "journald-rate-limit.h"
3ffd4af2 55#include "journald-server.h"
8580d1f7
LP
56#include "journald-stream.h"
57#include "journald-syslog.h"
07630cea
LP
58#include "missing.h"
59#include "mkdir.h"
6bedfcbb 60#include "parse-util.h"
07630cea
LP
61#include "process-util.h"
62#include "rm-rf.h"
63#include "selinux-util.h"
64#include "signal-util.h"
65#include "socket-util.h"
8b43440b 66#include "string-table.h"
07630cea 67#include "string-util.h"
d025f1e4 68
d025f1e4
ZJS
69#define USER_JOURNALS_MAX 1024
70
26687bf8 71#define DEFAULT_SYNC_INTERVAL_USEC (5*USEC_PER_MINUTE)
7f1ad696
LP
72#define DEFAULT_RATE_LIMIT_INTERVAL (30*USEC_PER_SEC)
73#define DEFAULT_RATE_LIMIT_BURST 1000
e150e820 74#define DEFAULT_MAX_FILE_USEC USEC_PER_MONTH
d025f1e4 75
8580d1f7 76#define RECHECK_SPACE_USEC (30*USEC_PER_SEC)
d025f1e4 77
8580d1f7
LP
78static int determine_space_for(
79 Server *s,
80 JournalMetrics *metrics,
81 const char *path,
82 const char *name,
83 bool verbose,
84 bool patch_min_use,
85 uint64_t *available,
86 uint64_t *limit) {
87
88 uint64_t sum = 0, ss_avail, avail;
7fd1b19b 89 _cleanup_closedir_ DIR *d = NULL;
8580d1f7
LP
90 struct dirent *de;
91 struct statvfs ss;
92 const char *p;
d025f1e4 93 usec_t ts;
d025f1e4 94
8580d1f7
LP
95 assert(s);
96 assert(metrics);
97 assert(path);
98 assert(name);
d025f1e4 99
8580d1f7 100 ts = now(CLOCK_MONOTONIC);
d025f1e4 101
8580d1f7 102 if (!verbose && s->cached_space_timestamp + RECHECK_SPACE_USEC > ts) {
d025f1e4 103
8580d1f7
LP
104 if (available)
105 *available = s->cached_space_available;
106 if (limit)
107 *limit = s->cached_space_limit;
d025f1e4 108
d025f1e4 109 return 0;
8580d1f7 110 }
d025f1e4 111
8580d1f7 112 p = strjoina(path, SERVER_MACHINE_ID(s));
d025f1e4 113 d = opendir(p);
d025f1e4 114 if (!d)
8580d1f7 115 return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, "Failed to open %s: %m", p);
d025f1e4
ZJS
116
117 if (fstatvfs(dirfd(d), &ss) < 0)
8580d1f7 118 return log_error_errno(errno, "Failed to fstatvfs(%s): %m", p);
d025f1e4 119
8580d1f7 120 FOREACH_DIRENT_ALL(de, d, break) {
d025f1e4 121 struct stat st;
d025f1e4
ZJS
122
123 if (!endswith(de->d_name, ".journal") &&
124 !endswith(de->d_name, ".journal~"))
125 continue;
126
8580d1f7
LP
127 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
128 log_debug_errno(errno, "Failed to stat %s/%s, ignoring: %m", p, de->d_name);
d025f1e4 129 continue;
8580d1f7 130 }
d025f1e4
ZJS
131
132 if (!S_ISREG(st.st_mode))
133 continue;
134
135 sum += (uint64_t) st.st_blocks * 512UL;
136 }
137
8580d1f7
LP
138 /* If request, then let's bump the min_use limit to the
139 * current usage on disk. We do this when starting up and
140 * first opening the journal files. This way sudden spikes in
141 * disk usage will not cause journald to vacuum files without
142 * bounds. Note that this means that only a restart of
143 * journald will make it reset this value. */
d025f1e4 144
8580d1f7
LP
145 if (patch_min_use)
146 metrics->min_use = MAX(metrics->min_use, sum);
348ced90 147
8580d1f7
LP
148 ss_avail = ss.f_bsize * ss.f_bavail;
149 avail = LESS_BY(ss_avail, metrics->keep_free);
348ced90 150
8580d1f7
LP
151 s->cached_space_limit = MIN(MAX(sum + avail, metrics->min_use), metrics->max_use);
152 s->cached_space_available = LESS_BY(s->cached_space_limit, sum);
153 s->cached_space_timestamp = ts;
d025f1e4 154
670b110c
ZJS
155 if (verbose) {
156 char fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
8580d1f7 157 fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX], fb6[FORMAT_BYTES_MAX];
670b110c
ZJS
158
159 server_driver_message(s, SD_MESSAGE_JOURNAL_USAGE,
8580d1f7 160 "%s (%s) is currently using %s.\n"
da2e288b
LP
161 "Maximum allowed usage is set to %s.\n"
162 "Leaving at least %s free (of currently available %s of space).\n"
8580d1f7
LP
163 "Enforced usage limit is thus %s, of which %s are still available.",
164 name, path,
670b110c 165 format_bytes(fb1, sizeof(fb1), sum),
8580d1f7
LP
166 format_bytes(fb2, sizeof(fb2), metrics->max_use),
167 format_bytes(fb3, sizeof(fb3), metrics->keep_free),
670b110c 168 format_bytes(fb4, sizeof(fb4), ss_avail),
8580d1f7
LP
169 format_bytes(fb5, sizeof(fb5), s->cached_space_limit),
170 format_bytes(fb6, sizeof(fb6), s->cached_space_available));
171 }
172
173 if (available)
174 *available = s->cached_space_available;
175 if (limit)
176 *limit = s->cached_space_limit;
177
178 return 1;
179}
180
181static int determine_space(Server *s, bool verbose, bool patch_min_use, uint64_t *available, uint64_t *limit) {
182 JournalMetrics *metrics;
183 const char *path, *name;
184
185 assert(s);
186
187 if (s->system_journal) {
188 path = "/var/log/journal/";
189 metrics = &s->system_metrics;
190 name = "System journal";
191 } else {
192 path = "/run/log/journal/";
193 metrics = &s->runtime_metrics;
194 name = "Runtime journal";
670b110c
ZJS
195 }
196
8580d1f7 197 return determine_space_for(s, metrics, path, name, verbose, patch_min_use, available, limit);
d025f1e4
ZJS
198}
199
d025f1e4
ZJS
200void server_fix_perms(Server *s, JournalFile *f, uid_t uid) {
201 int r;
202#ifdef HAVE_ACL
0fb39831 203 _cleanup_(acl_freep) acl_t acl = NULL;
d025f1e4
ZJS
204 acl_entry_t entry;
205 acl_permset_t permset;
206#endif
207
208 assert(f);
209
4608af43 210 r = fchmod(f->fd, 0640);
d025f1e4 211 if (r < 0)
65089b82 212 log_warning_errno(errno, "Failed to fix access mode on %s, ignoring: %m", f->path);
d025f1e4
ZJS
213
214#ifdef HAVE_ACL
34c10968 215 if (uid <= SYSTEM_UID_MAX)
d025f1e4
ZJS
216 return;
217
218 acl = acl_get_fd(f->fd);
219 if (!acl) {
56f64d95 220 log_warning_errno(errno, "Failed to read ACL on %s, ignoring: %m", f->path);
d025f1e4
ZJS
221 return;
222 }
223
224 r = acl_find_uid(acl, uid, &entry);
225 if (r <= 0) {
226
227 if (acl_create_entry(&acl, &entry) < 0 ||
228 acl_set_tag_type(entry, ACL_USER) < 0 ||
229 acl_set_qualifier(entry, &uid) < 0) {
56f64d95 230 log_warning_errno(errno, "Failed to patch ACL on %s, ignoring: %m", f->path);
0fb39831 231 return;
d025f1e4
ZJS
232 }
233 }
234
23ad4dd8
JAS
235 /* We do not recalculate the mask unconditionally here,
236 * so that the fchmod() mask above stays intact. */
d025f1e4 237 if (acl_get_permset(entry, &permset) < 0 ||
23ad4dd8
JAS
238 acl_add_perm(permset, ACL_READ) < 0 ||
239 calc_acl_mask_if_needed(&acl) < 0) {
56f64d95 240 log_warning_errno(errno, "Failed to patch ACL on %s, ignoring: %m", f->path);
0fb39831 241 return;
d025f1e4
ZJS
242 }
243
244 if (acl_set_fd(f->fd, acl) < 0)
56f64d95 245 log_warning_errno(errno, "Failed to set ACL on %s, ignoring: %m", f->path);
d025f1e4 246
d025f1e4
ZJS
247#endif
248}
249
250static JournalFile* find_journal(Server *s, uid_t uid) {
ed375beb 251 _cleanup_free_ char *p = NULL;
d025f1e4
ZJS
252 int r;
253 JournalFile *f;
254 sd_id128_t machine;
255
256 assert(s);
257
258 /* We split up user logs only on /var, not on /run. If the
259 * runtime file is open, we write to it exclusively, in order
260 * to guarantee proper order as soon as we flush /run to
261 * /var and close the runtime file. */
262
263 if (s->runtime_journal)
264 return s->runtime_journal;
265
f7dc3ab9 266 if (uid <= SYSTEM_UID_MAX)
d025f1e4
ZJS
267 return s->system_journal;
268
269 r = sd_id128_get_machine(&machine);
270 if (r < 0)
271 return s->system_journal;
272
43cf8388 273 f = ordered_hashmap_get(s->user_journals, UINT32_TO_PTR(uid));
d025f1e4
ZJS
274 if (f)
275 return f;
276
de0671ee
ZJS
277 if (asprintf(&p, "/var/log/journal/" SD_ID128_FORMAT_STR "/user-"UID_FMT".journal",
278 SD_ID128_FORMAT_VAL(machine), uid) < 0)
d025f1e4
ZJS
279 return s->system_journal;
280
43cf8388 281 while (ordered_hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
d025f1e4 282 /* Too many open? Then let's close one */
43cf8388 283 f = ordered_hashmap_steal_first(s->user_journals);
d025f1e4
ZJS
284 assert(f);
285 journal_file_close(f);
286 }
287
cbd67177 288 r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &f);
d025f1e4
ZJS
289 if (r < 0)
290 return s->system_journal;
291
292 server_fix_perms(s, f, uid);
293
43cf8388 294 r = ordered_hashmap_put(s->user_journals, UINT32_TO_PTR(uid), f);
d025f1e4
ZJS
295 if (r < 0) {
296 journal_file_close(f);
297 return s->system_journal;
298 }
299
300 return f;
301}
302
ea69bd41
LP
303static int do_rotate(
304 Server *s,
305 JournalFile **f,
306 const char* name,
307 bool seal,
308 uint32_t uid) {
309
fc55baee
ZJS
310 int r;
311 assert(s);
312
313 if (!*f)
314 return -EINVAL;
315
316 r = journal_file_rotate(f, s->compress, seal);
317 if (r < 0)
318 if (*f)
ea69bd41 319 log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
fc55baee 320 else
ea69bd41 321 log_error_errno(r, "Failed to create new %s journal: %m", name);
fc55baee
ZJS
322 else
323 server_fix_perms(s, *f, uid);
2678031a 324
fc55baee
ZJS
325 return r;
326}
327
d025f1e4
ZJS
328void server_rotate(Server *s) {
329 JournalFile *f;
330 void *k;
331 Iterator i;
332 int r;
333
334 log_debug("Rotating...");
335
8580d1f7
LP
336 (void) do_rotate(s, &s->runtime_journal, "runtime", false, 0);
337 (void) do_rotate(s, &s->system_journal, "system", s->seal, 0);
d025f1e4 338
43cf8388 339 ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
fc55baee
ZJS
340 r = do_rotate(s, &f, "user", s->seal, PTR_TO_UINT32(k));
341 if (r >= 0)
43cf8388 342 ordered_hashmap_replace(s->user_journals, k, f);
fc55baee
ZJS
343 else if (!f)
344 /* Old file has been closed and deallocated */
43cf8388 345 ordered_hashmap_remove(s->user_journals, k);
d025f1e4
ZJS
346 }
347}
348
26687bf8
OS
349void server_sync(Server *s) {
350 JournalFile *f;
351 void *k;
352 Iterator i;
353 int r;
354
26687bf8
OS
355 if (s->system_journal) {
356 r = journal_file_set_offline(s->system_journal);
357 if (r < 0)
65089b82 358 log_warning_errno(r, "Failed to sync system journal, ignoring: %m");
26687bf8
OS
359 }
360
43cf8388 361 ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
26687bf8
OS
362 r = journal_file_set_offline(f);
363 if (r < 0)
65089b82 364 log_warning_errno(r, "Failed to sync user journal, ignoring: %m");
26687bf8
OS
365 }
366
f9a810be
LP
367 if (s->sync_event_source) {
368 r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_OFF);
369 if (r < 0)
da927ba9 370 log_error_errno(r, "Failed to disable sync timer source: %m");
f9a810be 371 }
26687bf8
OS
372
373 s->sync_scheduled = false;
374}
375
ea69bd41
LP
376static void do_vacuum(
377 Server *s,
ea69bd41 378 JournalFile *f,
8580d1f7
LP
379 JournalMetrics *metrics,
380 const char *path,
381 const char *name,
382 bool verbose,
383 bool patch_min_use) {
ea69bd41
LP
384
385 const char *p;
8580d1f7 386 uint64_t limit;
63c8666b
ZJS
387 int r;
388
8580d1f7
LP
389 assert(s);
390 assert(metrics);
391 assert(path);
392 assert(name);
393
63c8666b
ZJS
394 if (!f)
395 return;
396
8580d1f7
LP
397 p = strjoina(path, SERVER_MACHINE_ID(s));
398
399 limit = metrics->max_use;
400 (void) determine_space_for(s, metrics, path, name, verbose, patch_min_use, NULL, &limit);
401
402 r = journal_directory_vacuum(p, limit, metrics->n_max_files, s->max_retention_usec, &s->oldest_file_usec, verbose);
63c8666b 403 if (r < 0 && r != -ENOENT)
8580d1f7 404 log_warning_errno(r, "Failed to vacuum %s, ignoring: %m", p);
63c8666b
ZJS
405}
406
8580d1f7
LP
407int server_vacuum(Server *s, bool verbose, bool patch_min_use) {
408 assert(s);
d025f1e4
ZJS
409
410 log_debug("Vacuuming...");
411
412 s->oldest_file_usec = 0;
413
8580d1f7
LP
414 do_vacuum(s, s->system_journal, &s->system_metrics, "/var/log/journal/", "System journal", verbose, patch_min_use);
415 do_vacuum(s, s->runtime_journal, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", verbose, patch_min_use);
d025f1e4 416
8580d1f7
LP
417 s->cached_space_limit = 0;
418 s->cached_space_available = 0;
419 s->cached_space_timestamp = 0;
d025f1e4 420
8580d1f7 421 return 0;
d025f1e4
ZJS
422}
423
0c24bb23
LP
424static void server_cache_machine_id(Server *s) {
425 sd_id128_t id;
426 int r;
427
428 assert(s);
429
430 r = sd_id128_get_machine(&id);
431 if (r < 0)
432 return;
433
434 sd_id128_to_string(id, stpcpy(s->machine_id_field, "_MACHINE_ID="));
435}
436
437static void server_cache_boot_id(Server *s) {
438 sd_id128_t id;
439 int r;
440
441 assert(s);
442
443 r = sd_id128_get_boot(&id);
444 if (r < 0)
445 return;
446
447 sd_id128_to_string(id, stpcpy(s->boot_id_field, "_BOOT_ID="));
448}
449
450static void server_cache_hostname(Server *s) {
451 _cleanup_free_ char *t = NULL;
452 char *x;
453
454 assert(s);
455
456 t = gethostname_malloc();
457 if (!t)
458 return;
459
460 x = strappend("_HOSTNAME=", t);
461 if (!x)
462 return;
463
464 free(s->hostname_field);
465 s->hostname_field = x;
466}
467
8531ae70 468static bool shall_try_append_again(JournalFile *f, int r) {
d025f1e4
ZJS
469
470 /* -E2BIG Hit configured limit
471 -EFBIG Hit fs limit
472 -EDQUOT Quota limit hit
473 -ENOSPC Disk full
fa6ac760 474 -EIO I/O error of some kind (mmap)
d025f1e4
ZJS
475 -EHOSTDOWN Other machine
476 -EBUSY Unclean shutdown
477 -EPROTONOSUPPORT Unsupported feature
478 -EBADMSG Corrupted
479 -ENODATA Truncated
2678031a
LP
480 -ESHUTDOWN Already archived
481 -EIDRM Journal file has been deleted */
d025f1e4
ZJS
482
483 if (r == -E2BIG || r == -EFBIG || r == -EDQUOT || r == -ENOSPC)
484 log_debug("%s: Allocation limit reached, rotating.", f->path);
485 else if (r == -EHOSTDOWN)
486 log_info("%s: Journal file from other machine, rotating.", f->path);
487 else if (r == -EBUSY)
488 log_info("%s: Unclean shutdown, rotating.", f->path);
489 else if (r == -EPROTONOSUPPORT)
490 log_info("%s: Unsupported feature, rotating.", f->path);
491 else if (r == -EBADMSG || r == -ENODATA || r == ESHUTDOWN)
492 log_warning("%s: Journal file corrupted, rotating.", f->path);
fa6ac760
LP
493 else if (r == -EIO)
494 log_warning("%s: IO error, rotating.", f->path);
2678031a
LP
495 else if (r == -EIDRM)
496 log_warning("%s: Journal file has been deleted, rotating.", f->path);
d025f1e4
ZJS
497 else
498 return false;
499
500 return true;
501}
502
d07f7b9e 503static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n, int priority) {
d025f1e4
ZJS
504 JournalFile *f;
505 bool vacuumed = false;
506 int r;
507
508 assert(s);
509 assert(iovec);
510 assert(n > 0);
511
512 f = find_journal(s, uid);
513 if (!f)
514 return;
515
516 if (journal_file_rotate_suggested(f, s->max_file_usec)) {
517 log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
518 server_rotate(s);
8580d1f7 519 server_vacuum(s, false, false);
d025f1e4
ZJS
520 vacuumed = true;
521
522 f = find_journal(s, uid);
523 if (!f)
524 return;
525 }
526
527 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
26687bf8 528 if (r >= 0) {
d07f7b9e 529 server_schedule_sync(s, priority);
d025f1e4 530 return;
26687bf8 531 }
d025f1e4
ZJS
532
533 if (vacuumed || !shall_try_append_again(f, r)) {
8266e1c0 534 log_error_errno(r, "Failed to write entry (%d items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
d025f1e4
ZJS
535 return;
536 }
537
538 server_rotate(s);
8580d1f7 539 server_vacuum(s, false, false);
d025f1e4
ZJS
540
541 f = find_journal(s, uid);
542 if (!f)
543 return;
544
545 log_debug("Retrying write.");
546 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
8266e1c0
LP
547 if (r < 0)
548 log_error_errno(r, "Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
549 else
d07f7b9e 550 server_schedule_sync(s, priority);
d025f1e4
ZJS
551}
552
553static void dispatch_message_real(
554 Server *s,
555 struct iovec *iovec, unsigned n, unsigned m,
3b3154df
LP
556 const struct ucred *ucred,
557 const struct timeval *tv,
d025f1e4 558 const char *label, size_t label_len,
968f3196 559 const char *unit_id,
d07f7b9e 560 int priority,
968f3196 561 pid_t object_pid) {
d025f1e4 562
968f3196 563 char pid[sizeof("_PID=") + DECIMAL_STR_MAX(pid_t)],
ae018d9b
LP
564 uid[sizeof("_UID=") + DECIMAL_STR_MAX(uid_t)],
565 gid[sizeof("_GID=") + DECIMAL_STR_MAX(gid_t)],
566 owner_uid[sizeof("_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)],
d3789917 567 source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)],
968f3196
ZJS
568 o_uid[sizeof("OBJECT_UID=") + DECIMAL_STR_MAX(uid_t)],
569 o_gid[sizeof("OBJECT_GID=") + DECIMAL_STR_MAX(gid_t)],
570 o_owner_uid[sizeof("OBJECT_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)];
571 uid_t object_uid;
572 gid_t object_gid;
968f3196 573 char *x;
d025f1e4 574 int r;
ae018d9b 575 char *t, *c;
82499507
LP
576 uid_t realuid = 0, owner = 0, journal_uid;
577 bool owner_valid = false;
ae018d9b 578#ifdef HAVE_AUDIT
968f3196
ZJS
579 char audit_session[sizeof("_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
580 audit_loginuid[sizeof("_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)],
581 o_audit_session[sizeof("OBJECT_AUDIT_SESSION=") + DECIMAL_STR_MAX(uint32_t)],
582 o_audit_loginuid[sizeof("OBJECT_AUDIT_LOGINUID=") + DECIMAL_STR_MAX(uid_t)];
ae018d9b
LP
583
584 uint32_t audit;
585 uid_t loginuid;
586#endif
d025f1e4
ZJS
587
588 assert(s);
589 assert(iovec);
590 assert(n > 0);
968f3196 591 assert(n + N_IOVEC_META_FIELDS + (object_pid ? N_IOVEC_OBJECT_FIELDS : 0) <= m);
d025f1e4
ZJS
592
593 if (ucred) {
d025f1e4
ZJS
594 realuid = ucred->uid;
595
de0671ee 596 sprintf(pid, "_PID="PID_FMT, ucred->pid);
c2457105 597 IOVEC_SET_STRING(iovec[n++], pid);
d025f1e4 598
de0671ee 599 sprintf(uid, "_UID="UID_FMT, ucred->uid);
c2457105 600 IOVEC_SET_STRING(iovec[n++], uid);
d025f1e4 601
de0671ee 602 sprintf(gid, "_GID="GID_FMT, ucred->gid);
c2457105 603 IOVEC_SET_STRING(iovec[n++], gid);
d025f1e4
ZJS
604
605 r = get_process_comm(ucred->pid, &t);
606 if (r >= 0) {
63c372cb 607 x = strjoina("_COMM=", t);
d025f1e4 608 free(t);
968f3196 609 IOVEC_SET_STRING(iovec[n++], x);
d025f1e4
ZJS
610 }
611
612 r = get_process_exe(ucred->pid, &t);
613 if (r >= 0) {
63c372cb 614 x = strjoina("_EXE=", t);
d025f1e4 615 free(t);
968f3196 616 IOVEC_SET_STRING(iovec[n++], x);
d025f1e4
ZJS
617 }
618
9bdbc2e2 619 r = get_process_cmdline(ucred->pid, 0, false, &t);
d025f1e4 620 if (r >= 0) {
63c372cb 621 x = strjoina("_CMDLINE=", t);
d025f1e4 622 free(t);
3a832116
SL
623 IOVEC_SET_STRING(iovec[n++], x);
624 }
625
626 r = get_process_capeff(ucred->pid, &t);
627 if (r >= 0) {
63c372cb 628 x = strjoina("_CAP_EFFECTIVE=", t);
3a832116 629 free(t);
968f3196 630 IOVEC_SET_STRING(iovec[n++], x);
d025f1e4
ZJS
631 }
632
0a20e3c1 633#ifdef HAVE_AUDIT
d025f1e4 634 r = audit_session_from_pid(ucred->pid, &audit);
ae018d9b 635 if (r >= 0) {
de0671ee 636 sprintf(audit_session, "_AUDIT_SESSION=%"PRIu32, audit);
ae018d9b
LP
637 IOVEC_SET_STRING(iovec[n++], audit_session);
638 }
d025f1e4
ZJS
639
640 r = audit_loginuid_from_pid(ucred->pid, &loginuid);
7027ff61 641 if (r >= 0) {
de0671ee 642 sprintf(audit_loginuid, "_AUDIT_LOGINUID="UID_FMT, loginuid);
ae018d9b 643 IOVEC_SET_STRING(iovec[n++], audit_loginuid);
d025f1e4 644 }
ae018d9b 645#endif
d025f1e4 646
e9174f29 647 r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &c);
7027ff61 648 if (r >= 0) {
968f3196
ZJS
649 char *session = NULL;
650
63c372cb 651 x = strjoina("_SYSTEMD_CGROUP=", c);
968f3196 652 IOVEC_SET_STRING(iovec[n++], x);
d025f1e4 653
ae018d9b
LP
654 r = cg_path_get_session(c, &t);
655 if (r >= 0) {
63c372cb 656 session = strjoina("_SYSTEMD_SESSION=", t);
ae018d9b 657 free(t);
d025f1e4 658 IOVEC_SET_STRING(iovec[n++], session);
ae018d9b
LP
659 }
660
661 if (cg_path_get_owner_uid(c, &owner) >= 0) {
662 owner_valid = true;
d025f1e4 663
de0671ee 664 sprintf(owner_uid, "_SYSTEMD_OWNER_UID="UID_FMT, owner);
d025f1e4 665 IOVEC_SET_STRING(iovec[n++], owner_uid);
ae018d9b 666 }
d025f1e4 667
ae018d9b 668 if (cg_path_get_unit(c, &t) >= 0) {
63c372cb 669 x = strjoina("_SYSTEMD_UNIT=", t);
ae018d9b 670 free(t);
19cace37
LP
671 IOVEC_SET_STRING(iovec[n++], x);
672 } else if (unit_id && !session) {
63c372cb 673 x = strjoina("_SYSTEMD_UNIT=", unit_id);
19cace37
LP
674 IOVEC_SET_STRING(iovec[n++], x);
675 }
676
677 if (cg_path_get_user_unit(c, &t) >= 0) {
63c372cb 678 x = strjoina("_SYSTEMD_USER_UNIT=", t);
ae018d9b 679 free(t);
968f3196 680 IOVEC_SET_STRING(iovec[n++], x);
19cace37 681 } else if (unit_id && session) {
63c372cb 682 x = strjoina("_SYSTEMD_USER_UNIT=", unit_id);
19cace37
LP
683 IOVEC_SET_STRING(iovec[n++], x);
684 }
ae018d9b 685
0a244b8e 686 if (cg_path_get_slice(c, &t) >= 0) {
63c372cb 687 x = strjoina("_SYSTEMD_SLICE=", t);
0a244b8e
LP
688 free(t);
689 IOVEC_SET_STRING(iovec[n++], x);
690 }
691
ae018d9b 692 free(c);
2d43b190 693 } else if (unit_id) {
63c372cb 694 x = strjoina("_SYSTEMD_UNIT=", unit_id);
2d43b190 695 IOVEC_SET_STRING(iovec[n++], x);
ef1673d1 696 }
d025f1e4 697
d025f1e4 698#ifdef HAVE_SELINUX
6baa7db0 699 if (mac_selinux_use()) {
d682b3a7 700 if (label) {
f8294e41 701 x = alloca(strlen("_SELINUX_CONTEXT=") + label_len + 1);
ae018d9b 702
d682b3a7
LP
703 *((char*) mempcpy(stpcpy(x, "_SELINUX_CONTEXT="), label, label_len)) = 0;
704 IOVEC_SET_STRING(iovec[n++], x);
705 } else {
706 security_context_t con;
d025f1e4 707
d682b3a7 708 if (getpidcon(ucred->pid, &con) >= 0) {
63c372cb 709 x = strjoina("_SELINUX_CONTEXT=", con);
e7ff4e7f 710
d682b3a7
LP
711 freecon(con);
712 IOVEC_SET_STRING(iovec[n++], x);
713 }
d025f1e4
ZJS
714 }
715 }
716#endif
717 }
968f3196
ZJS
718 assert(n <= m);
719
720 if (object_pid) {
721 r = get_process_uid(object_pid, &object_uid);
722 if (r >= 0) {
de0671ee 723 sprintf(o_uid, "OBJECT_UID="UID_FMT, object_uid);
968f3196
ZJS
724 IOVEC_SET_STRING(iovec[n++], o_uid);
725 }
726
727 r = get_process_gid(object_pid, &object_gid);
728 if (r >= 0) {
de0671ee 729 sprintf(o_gid, "OBJECT_GID="GID_FMT, object_gid);
968f3196
ZJS
730 IOVEC_SET_STRING(iovec[n++], o_gid);
731 }
732
733 r = get_process_comm(object_pid, &t);
734 if (r >= 0) {
63c372cb 735 x = strjoina("OBJECT_COMM=", t);
968f3196
ZJS
736 free(t);
737 IOVEC_SET_STRING(iovec[n++], x);
738 }
739
740 r = get_process_exe(object_pid, &t);
741 if (r >= 0) {
63c372cb 742 x = strjoina("OBJECT_EXE=", t);
968f3196
ZJS
743 free(t);
744 IOVEC_SET_STRING(iovec[n++], x);
745 }
746
747 r = get_process_cmdline(object_pid, 0, false, &t);
748 if (r >= 0) {
63c372cb 749 x = strjoina("OBJECT_CMDLINE=", t);
968f3196
ZJS
750 free(t);
751 IOVEC_SET_STRING(iovec[n++], x);
752 }
753
754#ifdef HAVE_AUDIT
755 r = audit_session_from_pid(object_pid, &audit);
756 if (r >= 0) {
de0671ee 757 sprintf(o_audit_session, "OBJECT_AUDIT_SESSION=%"PRIu32, audit);
968f3196
ZJS
758 IOVEC_SET_STRING(iovec[n++], o_audit_session);
759 }
760
761 r = audit_loginuid_from_pid(object_pid, &loginuid);
762 if (r >= 0) {
de0671ee 763 sprintf(o_audit_loginuid, "OBJECT_AUDIT_LOGINUID="UID_FMT, loginuid);
968f3196
ZJS
764 IOVEC_SET_STRING(iovec[n++], o_audit_loginuid);
765 }
766#endif
767
e9174f29 768 r = cg_pid_get_path_shifted(object_pid, s->cgroup_root, &c);
968f3196 769 if (r >= 0) {
63c372cb 770 x = strjoina("OBJECT_SYSTEMD_CGROUP=", c);
968f3196
ZJS
771 IOVEC_SET_STRING(iovec[n++], x);
772
773 r = cg_path_get_session(c, &t);
774 if (r >= 0) {
63c372cb 775 x = strjoina("OBJECT_SYSTEMD_SESSION=", t);
968f3196
ZJS
776 free(t);
777 IOVEC_SET_STRING(iovec[n++], x);
778 }
779
780 if (cg_path_get_owner_uid(c, &owner) >= 0) {
de0671ee 781 sprintf(o_owner_uid, "OBJECT_SYSTEMD_OWNER_UID="UID_FMT, owner);
968f3196
ZJS
782 IOVEC_SET_STRING(iovec[n++], o_owner_uid);
783 }
784
785 if (cg_path_get_unit(c, &t) >= 0) {
63c372cb 786 x = strjoina("OBJECT_SYSTEMD_UNIT=", t);
968f3196 787 free(t);
19cace37
LP
788 IOVEC_SET_STRING(iovec[n++], x);
789 }
790
791 if (cg_path_get_user_unit(c, &t) >= 0) {
63c372cb 792 x = strjoina("OBJECT_SYSTEMD_USER_UNIT=", t);
968f3196 793 free(t);
968f3196 794 IOVEC_SET_STRING(iovec[n++], x);
19cace37 795 }
968f3196
ZJS
796
797 free(c);
798 }
799 }
800 assert(n <= m);
d025f1e4
ZJS
801
802 if (tv) {
ae018d9b 803 sprintf(source_time, "_SOURCE_REALTIME_TIMESTAMP=%llu", (unsigned long long) timeval_load(tv));
a5693989 804 IOVEC_SET_STRING(iovec[n++], source_time);
d025f1e4
ZJS
805 }
806
807 /* Note that strictly speaking storing the boot id here is
808 * redundant since the entry includes this in-line
809 * anyway. However, we need this indexed, too. */
0c24bb23
LP
810 if (!isempty(s->boot_id_field))
811 IOVEC_SET_STRING(iovec[n++], s->boot_id_field);
d025f1e4 812
0c24bb23
LP
813 if (!isempty(s->machine_id_field))
814 IOVEC_SET_STRING(iovec[n++], s->machine_id_field);
d025f1e4 815
0c24bb23
LP
816 if (!isempty(s->hostname_field))
817 IOVEC_SET_STRING(iovec[n++], s->hostname_field);
d025f1e4
ZJS
818
819 assert(n <= m);
820
da499392 821 if (s->split_mode == SPLIT_UID && realuid > 0)
40adcda8 822 /* Split up strictly by any UID */
759c945a 823 journal_uid = realuid;
82499507 824 else if (s->split_mode == SPLIT_LOGIN && realuid > 0 && owner_valid && owner > 0)
edc3797f
LP
825 /* Split up by login UIDs. We do this only if the
826 * realuid is not root, in order not to accidentally
827 * leak privileged information to the user that is
828 * logged by a privileged process that is part of an
7517e174 829 * unprivileged session. */
8a0889df 830 journal_uid = owner;
da499392
KS
831 else
832 journal_uid = 0;
759c945a 833
d07f7b9e 834 write_to_journal(s, journal_uid, iovec, n, priority);
d025f1e4
ZJS
835}
836
837void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
838 char mid[11 + 32 + 1];
839 char buffer[16 + LINE_MAX + 1];
b6fa2555 840 struct iovec iovec[N_IOVEC_META_FIELDS + 6];
d025f1e4
ZJS
841 int n = 0;
842 va_list ap;
b92bea5d 843 struct ucred ucred = {};
d025f1e4
ZJS
844
845 assert(s);
846 assert(format);
847
b6fa2555
EV
848 IOVEC_SET_STRING(iovec[n++], "SYSLOG_FACILITY=3");
849 IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=systemd-journald");
850
d025f1e4
ZJS
851 IOVEC_SET_STRING(iovec[n++], "PRIORITY=6");
852 IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=driver");
853
854 memcpy(buffer, "MESSAGE=", 8);
855 va_start(ap, format);
856 vsnprintf(buffer + 8, sizeof(buffer) - 8, format, ap);
857 va_end(ap);
d025f1e4
ZJS
858 IOVEC_SET_STRING(iovec[n++], buffer);
859
860 if (!sd_id128_equal(message_id, SD_ID128_NULL)) {
e2cc6eca 861 snprintf(mid, sizeof(mid), LOG_MESSAGE_ID(message_id));
d025f1e4
ZJS
862 IOVEC_SET_STRING(iovec[n++], mid);
863 }
864
d025f1e4
ZJS
865 ucred.pid = getpid();
866 ucred.uid = getuid();
867 ucred.gid = getgid();
868
d07f7b9e 869 dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0);
d025f1e4
ZJS
870}
871
872void server_dispatch_message(
873 Server *s,
874 struct iovec *iovec, unsigned n, unsigned m,
3b3154df
LP
875 const struct ucred *ucred,
876 const struct timeval *tv,
d025f1e4
ZJS
877 const char *label, size_t label_len,
878 const char *unit_id,
968f3196
ZJS
879 int priority,
880 pid_t object_pid) {
d025f1e4 881
7027ff61 882 int rl, r;
7fd1b19b 883 _cleanup_free_ char *path = NULL;
8580d1f7 884 uint64_t available = 0;
db91ea32 885 char *c;
d025f1e4
ZJS
886
887 assert(s);
888 assert(iovec || n == 0);
889
890 if (n == 0)
891 return;
892
893 if (LOG_PRI(priority) > s->max_level_store)
894 return;
895
2f5df74a
HHPF
896 /* Stop early in case the information will not be stored
897 * in a journal. */
898 if (s->storage == STORAGE_NONE)
899 return;
900
d025f1e4
ZJS
901 if (!ucred)
902 goto finish;
903
e9174f29 904 r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &path);
7027ff61 905 if (r < 0)
d025f1e4
ZJS
906 goto finish;
907
908 /* example: /user/lennart/3/foobar
909 * /system/dbus.service/foobar
910 *
911 * So let's cut of everything past the third /, since that is
912 * where user directories start */
913
914 c = strchr(path, '/');
915 if (c) {
916 c = strchr(c+1, '/');
917 if (c) {
918 c = strchr(c+1, '/');
919 if (c)
920 *c = 0;
921 }
922 }
923
8580d1f7
LP
924 (void) determine_space(s, false, false, &available, NULL);
925 rl = journal_rate_limit_test(s->rate_limit, path, priority & LOG_PRIMASK, available);
db91ea32 926 if (rl == 0)
d025f1e4 927 return;
d025f1e4
ZJS
928
929 /* Write a suppression message if we suppressed something */
930 if (rl > 1)
db91ea32
ZJS
931 server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED,
932 "Suppressed %u messages from %s", rl - 1, path);
d025f1e4
ZJS
933
934finish:
d07f7b9e 935 dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id, priority, object_pid);
d025f1e4
ZJS
936}
937
938
caa2f4c0 939static int system_journal_open(Server *s, bool flush_requested) {
84267e40 940 const char *fn;
09eba4d4 941 int r = 0;
d025f1e4
ZJS
942
943 if (!s->system_journal &&
944 (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
caa2f4c0
ZJS
945 (flush_requested
946 || access("/run/systemd/journal/flushed", F_OK) >= 0)) {
d025f1e4
ZJS
947
948 /* If in auto mode: first try to create the machine
949 * path, but not the prefix.
950 *
951 * If in persistent mode: create /var/log/journal and
952 * the machine path */
953
954 if (s->storage == STORAGE_PERSISTENT)
ac892057 955 (void) mkdir_p("/var/log/journal/", 0755);
d025f1e4 956
8580d1f7 957 fn = strjoina("/var/log/journal/", SERVER_MACHINE_ID(s));
d025f1e4 958 (void) mkdir(fn, 0755);
d025f1e4 959
63c372cb 960 fn = strjoina(fn, "/system.journal");
d025f1e4 961 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal);
8580d1f7 962 if (r >= 0) {
d025f1e4 963 server_fix_perms(s, s->system_journal, 0);
8580d1f7
LP
964 (void) determine_space_for(s, &s->system_metrics, "/var/log/journal/", "System journal", true, true, NULL, NULL);
965 } else if (r < 0) {
433dd100 966 if (r != -ENOENT && r != -EROFS)
da927ba9 967 log_warning_errno(r, "Failed to open system journal: %m");
e40ec7ae 968
433dd100
LN
969 r = 0;
970 }
d025f1e4
ZJS
971 }
972
973 if (!s->runtime_journal &&
974 (s->storage != STORAGE_NONE)) {
975
8580d1f7 976 fn = strjoina("/run/log/journal/", SERVER_MACHINE_ID(s), "/system.journal");
d025f1e4
ZJS
977
978 if (s->system_journal) {
979
980 /* Try to open the runtime journal, but only
981 * if it already exists, so that we can flush
982 * it into the system journal */
983
984 r = journal_file_open(fn, O_RDWR, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
d025f1e4
ZJS
985 if (r < 0) {
986 if (r != -ENOENT)
da927ba9 987 log_warning_errno(r, "Failed to open runtime journal: %m");
d025f1e4
ZJS
988
989 r = 0;
990 }
991
992 } else {
993
994 /* OK, we really need the runtime journal, so create
995 * it if necessary. */
996
fc1d70af
LP
997 (void) mkdir("/run/log", 0755);
998 (void) mkdir("/run/log/journal", 0755);
999 (void) mkdir_parents(fn, 0750);
1000
d025f1e4 1001 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
23bbb0de
MS
1002 if (r < 0)
1003 return log_error_errno(r, "Failed to open runtime journal: %m");
d025f1e4
ZJS
1004 }
1005
8580d1f7 1006 if (s->runtime_journal) {
d025f1e4 1007 server_fix_perms(s, s->runtime_journal, 0);
8580d1f7
LP
1008 (void) determine_space_for(s, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", true, true, NULL, NULL);
1009 }
d025f1e4
ZJS
1010 }
1011
1012 return r;
1013}
1014
1015int server_flush_to_var(Server *s) {
d025f1e4
ZJS
1016 sd_id128_t machine;
1017 sd_journal *j = NULL;
fbb63411
LP
1018 char ts[FORMAT_TIMESPAN_MAX];
1019 usec_t start;
1020 unsigned n = 0;
1021 int r;
d025f1e4
ZJS
1022
1023 assert(s);
1024
1025 if (s->storage != STORAGE_AUTO &&
1026 s->storage != STORAGE_PERSISTENT)
1027 return 0;
1028
1029 if (!s->runtime_journal)
1030 return 0;
1031
8580d1f7 1032 (void) system_journal_open(s, true);
d025f1e4
ZJS
1033
1034 if (!s->system_journal)
1035 return 0;
1036
1037 log_debug("Flushing to /var...");
1038
fbb63411
LP
1039 start = now(CLOCK_MONOTONIC);
1040
d025f1e4 1041 r = sd_id128_get_machine(&machine);
00a16861 1042 if (r < 0)
d025f1e4 1043 return r;
d025f1e4
ZJS
1044
1045 r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
23bbb0de
MS
1046 if (r < 0)
1047 return log_error_errno(r, "Failed to read runtime journal: %m");
d025f1e4 1048
93b73b06
LP
1049 sd_journal_set_data_threshold(j, 0);
1050
d025f1e4
ZJS
1051 SD_JOURNAL_FOREACH(j) {
1052 Object *o = NULL;
1053 JournalFile *f;
1054
1055 f = j->current_file;
1056 assert(f && f->current_offset > 0);
1057
fbb63411
LP
1058 n++;
1059
d025f1e4
ZJS
1060 r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
1061 if (r < 0) {
da927ba9 1062 log_error_errno(r, "Can't read entry: %m");
d025f1e4
ZJS
1063 goto finish;
1064 }
1065
1066 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
1067 if (r >= 0)
1068 continue;
1069
1070 if (!shall_try_append_again(s->system_journal, r)) {
da927ba9 1071 log_error_errno(r, "Can't write entry: %m");
d025f1e4
ZJS
1072 goto finish;
1073 }
1074
1075 server_rotate(s);
8580d1f7 1076 server_vacuum(s, false, false);
d025f1e4 1077
253f59df
LP
1078 if (!s->system_journal) {
1079 log_notice("Didn't flush runtime journal since rotation of system journal wasn't successful.");
1080 r = -EIO;
1081 goto finish;
1082 }
1083
d025f1e4
ZJS
1084 log_debug("Retrying write.");
1085 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
1086 if (r < 0) {
da927ba9 1087 log_error_errno(r, "Can't write entry: %m");
d025f1e4
ZJS
1088 goto finish;
1089 }
1090 }
1091
804ae586
LP
1092 r = 0;
1093
d025f1e4
ZJS
1094finish:
1095 journal_file_post_change(s->system_journal);
1096
804ae586 1097 s->runtime_journal = journal_file_close(s->runtime_journal);
d025f1e4
ZJS
1098
1099 if (r >= 0)
c6878637 1100 (void) rm_rf("/run/log/journal", REMOVE_ROOT);
d025f1e4 1101
763c7aa2 1102 sd_journal_close(j);
d025f1e4 1103
fbb63411
LP
1104 server_driver_message(s, SD_ID128_NULL, "Time spent on flushing to /var is %s for %u entries.", format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0), n);
1105
d025f1e4
ZJS
1106 return r;
1107}
1108
8531ae70 1109int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
f9a810be 1110 Server *s = userdata;
a315ac4e
LP
1111 struct ucred *ucred = NULL;
1112 struct timeval *tv = NULL;
1113 struct cmsghdr *cmsg;
1114 char *label = NULL;
1115 size_t label_len = 0, m;
1116 struct iovec iovec;
1117 ssize_t n;
1118 int *fds = NULL, v = 0;
1119 unsigned n_fds = 0;
1120
1121 union {
1122 struct cmsghdr cmsghdr;
1123
1124 /* We use NAME_MAX space for the SELinux label
1125 * here. The kernel currently enforces no
1126 * limit, but according to suggestions from
1127 * the SELinux people this will change and it
1128 * will probably be identical to NAME_MAX. For
1129 * now we use that, but this should be updated
1130 * one day when the final limit is known. */
1131 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
1132 CMSG_SPACE(sizeof(struct timeval)) +
1133 CMSG_SPACE(sizeof(int)) + /* fd */
1134 CMSG_SPACE(NAME_MAX)]; /* selinux label */
1135 } control = {};
1136
1137 union sockaddr_union sa = {};
1138
1139 struct msghdr msghdr = {
1140 .msg_iov = &iovec,
1141 .msg_iovlen = 1,
1142 .msg_control = &control,
1143 .msg_controllen = sizeof(control),
1144 .msg_name = &sa,
1145 .msg_namelen = sizeof(sa),
1146 };
f9a810be 1147
d025f1e4 1148 assert(s);
875c2e22 1149 assert(fd == s->native_fd || fd == s->syslog_fd || fd == s->audit_fd);
f9a810be
LP
1150
1151 if (revents != EPOLLIN) {
1152 log_error("Got invalid event from epoll for datagram fd: %"PRIx32, revents);
1153 return -EIO;
1154 }
1155
a315ac4e
LP
1156 /* Try to get the right size, if we can. (Not all
1157 * sockets support SIOCINQ, hence we just try, but
1158 * don't rely on it. */
1159 (void) ioctl(fd, SIOCINQ, &v);
d025f1e4 1160
a315ac4e
LP
1161 /* Fix it up, if it is too small. We use the same fixed value as auditd here. Awful! */
1162 m = PAGE_ALIGN(MAX3((size_t) v + 1,
1163 (size_t) LINE_MAX,
1164 ALIGN(sizeof(struct nlmsghdr)) + ALIGN((size_t) MAX_AUDIT_MESSAGE_LENGTH)) + 1);
d025f1e4 1165
a315ac4e
LP
1166 if (!GREEDY_REALLOC(s->buffer, s->buffer_size, m))
1167 return log_oom();
875c2e22 1168
a315ac4e
LP
1169 iovec.iov_base = s->buffer;
1170 iovec.iov_len = s->buffer_size - 1; /* Leave room for trailing NUL we add later */
d025f1e4 1171
a315ac4e
LP
1172 n = recvmsg(fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
1173 if (n < 0) {
1174 if (errno == EINTR || errno == EAGAIN)
1175 return 0;
875c2e22 1176
a315ac4e
LP
1177 return log_error_errno(errno, "recvmsg() failed: %m");
1178 }
875c2e22 1179
a315ac4e
LP
1180 CMSG_FOREACH(cmsg, &msghdr) {
1181
1182 if (cmsg->cmsg_level == SOL_SOCKET &&
1183 cmsg->cmsg_type == SCM_CREDENTIALS &&
1184 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
1185 ucred = (struct ucred*) CMSG_DATA(cmsg);
1186 else if (cmsg->cmsg_level == SOL_SOCKET &&
1187 cmsg->cmsg_type == SCM_SECURITY) {
1188 label = (char*) CMSG_DATA(cmsg);
1189 label_len = cmsg->cmsg_len - CMSG_LEN(0);
1190 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1191 cmsg->cmsg_type == SO_TIMESTAMP &&
1192 cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
1193 tv = (struct timeval*) CMSG_DATA(cmsg);
1194 else if (cmsg->cmsg_level == SOL_SOCKET &&
1195 cmsg->cmsg_type == SCM_RIGHTS) {
1196 fds = (int*) CMSG_DATA(cmsg);
1197 n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
d025f1e4 1198 }
a315ac4e 1199 }
d025f1e4 1200
a315ac4e
LP
1201 /* And a trailing NUL, just in case */
1202 s->buffer[n] = 0;
1203
1204 if (fd == s->syslog_fd) {
1205 if (n > 0 && n_fds == 0)
1206 server_process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
1207 else if (n_fds > 0)
1208 log_warning("Got file descriptors via syslog socket. Ignoring.");
1209
1210 } else if (fd == s->native_fd) {
1211 if (n > 0 && n_fds == 0)
1212 server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
1213 else if (n == 0 && n_fds == 1)
1214 server_process_native_file(s, fds[0], ucred, tv, label, label_len);
1215 else if (n_fds > 0)
1216 log_warning("Got too many file descriptors via native socket. Ignoring.");
1217
1218 } else {
1219 assert(fd == s->audit_fd);
1220
1221 if (n > 0 && n_fds == 0)
1222 server_process_audit_message(s, s->buffer, n, ucred, &sa, msghdr.msg_namelen);
1223 else if (n_fds > 0)
1224 log_warning("Got file descriptors via audit socket. Ignoring.");
f9a810be 1225 }
a315ac4e
LP
1226
1227 close_many(fds, n_fds);
1228 return 0;
f9a810be 1229}
d025f1e4 1230
f9a810be
LP
1231static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1232 Server *s = userdata;
d025f1e4 1233
f9a810be 1234 assert(s);
d025f1e4 1235
f9a810be 1236 log_info("Received request to flush runtime journal from PID %"PRIu32, si->ssi_pid);
d025f1e4 1237
f9a810be
LP
1238 server_flush_to_var(s);
1239 server_sync(s);
8580d1f7 1240 server_vacuum(s, false, false);
d025f1e4 1241
ac5b0c13 1242 (void) touch("/run/systemd/journal/flushed");
74055aa7 1243
f9a810be
LP
1244 return 0;
1245}
d025f1e4 1246
f9a810be
LP
1247static int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1248 Server *s = userdata;
d025f1e4 1249
f9a810be 1250 assert(s);
d025f1e4 1251
f9a810be
LP
1252 log_info("Received request to rotate journal from PID %"PRIu32, si->ssi_pid);
1253 server_rotate(s);
8580d1f7 1254 server_vacuum(s, true, true);
d025f1e4 1255
f9a810be
LP
1256 return 0;
1257}
d025f1e4 1258
f9a810be
LP
1259static int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1260 Server *s = userdata;
d025f1e4 1261
f9a810be 1262 assert(s);
d025f1e4 1263
4daf54a8 1264 log_received_signal(LOG_INFO, si);
d025f1e4 1265
6203e07a 1266 sd_event_exit(s->event, 0);
d025f1e4
ZJS
1267 return 0;
1268}
1269
f9a810be 1270static int setup_signals(Server *s) {
f9a810be 1271 int r;
d025f1e4
ZJS
1272
1273 assert(s);
1274
72c0a2c2 1275 assert(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1) >= 0);
d025f1e4 1276
151b9b96 1277 r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s);
f9a810be
LP
1278 if (r < 0)
1279 return r;
1280
151b9b96 1281 r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2, dispatch_sigusr2, s);
f9a810be
LP
1282 if (r < 0)
1283 return r;
d025f1e4 1284
151b9b96 1285 r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM, dispatch_sigterm, s);
f9a810be
LP
1286 if (r < 0)
1287 return r;
d025f1e4 1288
151b9b96 1289 r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT, dispatch_sigterm, s);
f9a810be
LP
1290 if (r < 0)
1291 return r;
d025f1e4
ZJS
1292
1293 return 0;
1294}
1295
1296static int server_parse_proc_cmdline(Server *s) {
7fd1b19b 1297 _cleanup_free_ char *line = NULL;
d581d9d9 1298 const char *p;
74df0fca 1299 int r;
d025f1e4 1300
74df0fca 1301 r = proc_cmdline(&line);
b5884878 1302 if (r < 0) {
da927ba9 1303 log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
d025f1e4 1304 return 0;
b5884878 1305 }
d025f1e4 1306
d581d9d9
SS
1307 p = line;
1308 for(;;) {
7fd1b19b 1309 _cleanup_free_ char *word;
d025f1e4 1310
d581d9d9
SS
1311 r = extract_first_word(&p, &word, NULL, 0);
1312 if (r < 0)
1313 return log_error_errno(r, "Failed to parse journald syntax \"%s\": %m", line);
1314
1315 if (r == 0)
1316 break;
d025f1e4
ZJS
1317
1318 if (startswith(word, "systemd.journald.forward_to_syslog=")) {
1319 r = parse_boolean(word + 35);
1320 if (r < 0)
1321 log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
1322 else
1323 s->forward_to_syslog = r;
1324 } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
1325 r = parse_boolean(word + 33);
1326 if (r < 0)
1327 log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
1328 else
1329 s->forward_to_kmsg = r;
1330 } else if (startswith(word, "systemd.journald.forward_to_console=")) {
1331 r = parse_boolean(word + 36);
1332 if (r < 0)
1333 log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
1334 else
1335 s->forward_to_console = r;
40b71e89
ST
1336 } else if (startswith(word, "systemd.journald.forward_to_wall=")) {
1337 r = parse_boolean(word + 33);
1338 if (r < 0)
1339 log_warning("Failed to parse forward to wall switch %s. Ignoring.", word + 33);
1340 else
1341 s->forward_to_wall = r;
d025f1e4
ZJS
1342 } else if (startswith(word, "systemd.journald"))
1343 log_warning("Invalid systemd.journald parameter. Ignoring.");
d025f1e4
ZJS
1344 }
1345
804ae586 1346 /* do not warn about state here, since probably systemd already did */
db91ea32 1347 return 0;
d025f1e4
ZJS
1348}
1349
1350static int server_parse_config_file(Server *s) {
d025f1e4
ZJS
1351 assert(s);
1352
a9edaeff
JT
1353 return config_parse_many("/etc/systemd/journald.conf",
1354 CONF_DIRS_NULSTR("systemd/journald.conf"),
1355 "Journal\0",
1356 config_item_perf_lookup, journald_gperf_lookup,
1357 false, s);
d025f1e4
ZJS
1358}
1359
f9a810be
LP
1360static int server_dispatch_sync(sd_event_source *es, usec_t t, void *userdata) {
1361 Server *s = userdata;
26687bf8
OS
1362
1363 assert(s);
1364
f9a810be 1365 server_sync(s);
26687bf8
OS
1366 return 0;
1367}
1368
d07f7b9e 1369int server_schedule_sync(Server *s, int priority) {
26687bf8
OS
1370 int r;
1371
26687bf8
OS
1372 assert(s);
1373
d07f7b9e
LP
1374 if (priority <= LOG_CRIT) {
1375 /* Immediately sync to disk when this is of priority CRIT, ALERT, EMERG */
1376 server_sync(s);
1377 return 0;
1378 }
1379
26687bf8
OS
1380 if (s->sync_scheduled)
1381 return 0;
1382
f9a810be
LP
1383 if (s->sync_interval_usec > 0) {
1384 usec_t when;
ca267016 1385
6a0f1f6d 1386 r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
f9a810be
LP
1387 if (r < 0)
1388 return r;
26687bf8 1389
f9a810be
LP
1390 when += s->sync_interval_usec;
1391
1392 if (!s->sync_event_source) {
6a0f1f6d
LP
1393 r = sd_event_add_time(
1394 s->event,
1395 &s->sync_event_source,
1396 CLOCK_MONOTONIC,
1397 when, 0,
1398 server_dispatch_sync, s);
f9a810be
LP
1399 if (r < 0)
1400 return r;
1401
1402 r = sd_event_source_set_priority(s->sync_event_source, SD_EVENT_PRIORITY_IMPORTANT);
1403 } else {
1404 r = sd_event_source_set_time(s->sync_event_source, when);
1405 if (r < 0)
1406 return r;
1407
1408 r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_ONESHOT);
1409 }
26687bf8 1410 if (r < 0)
f9a810be 1411 return r;
26687bf8 1412
f9a810be
LP
1413 s->sync_scheduled = true;
1414 }
26687bf8
OS
1415
1416 return 0;
1417}
1418
0c24bb23
LP
1419static int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
1420 Server *s = userdata;
1421
1422 assert(s);
1423
1424 server_cache_hostname(s);
1425 return 0;
1426}
1427
1428static int server_open_hostname(Server *s) {
1429 int r;
1430
1431 assert(s);
1432
1433 s->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
4a62c710
MS
1434 if (s->hostname_fd < 0)
1435 return log_error_errno(errno, "Failed to open /proc/sys/kernel/hostname: %m");
0c24bb23 1436
151b9b96 1437 r = sd_event_add_io(s->event, &s->hostname_event_source, s->hostname_fd, 0, dispatch_hostname_change, s);
0c24bb23 1438 if (r < 0) {
28def94c
DR
1439 /* kernels prior to 3.2 don't support polling this file. Ignore
1440 * the failure. */
1441 if (r == -EPERM) {
e53fc357 1442 log_warning_errno(r, "Failed to register hostname fd in event loop, ignoring: %m");
03e334a1 1443 s->hostname_fd = safe_close(s->hostname_fd);
28def94c
DR
1444 return 0;
1445 }
1446
23bbb0de 1447 return log_error_errno(r, "Failed to register hostname fd in event loop: %m");
0c24bb23
LP
1448 }
1449
1450 r = sd_event_source_set_priority(s->hostname_event_source, SD_EVENT_PRIORITY_IMPORTANT-10);
23bbb0de
MS
1451 if (r < 0)
1452 return log_error_errno(r, "Failed to adjust priority of host name event source: %m");
0c24bb23
LP
1453
1454 return 0;
1455}
1456
d025f1e4 1457int server_init(Server *s) {
13790add 1458 _cleanup_fdset_free_ FDSet *fds = NULL;
d025f1e4 1459 int n, r, fd;
7d18d348 1460 bool no_sockets;
d025f1e4
ZJS
1461
1462 assert(s);
1463
1464 zero(*s);
875c2e22 1465 s->syslog_fd = s->native_fd = s->stdout_fd = s->dev_kmsg_fd = s->audit_fd = s->hostname_fd = -1;
d025f1e4
ZJS
1466 s->compress = true;
1467 s->seal = true;
1468
26687bf8
OS
1469 s->sync_interval_usec = DEFAULT_SYNC_INTERVAL_USEC;
1470 s->sync_scheduled = false;
1471
d025f1e4
ZJS
1472 s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
1473 s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
1474
40b71e89 1475 s->forward_to_wall = true;
d025f1e4 1476
e150e820
MB
1477 s->max_file_usec = DEFAULT_MAX_FILE_USEC;
1478
d025f1e4
ZJS
1479 s->max_level_store = LOG_DEBUG;
1480 s->max_level_syslog = LOG_DEBUG;
1481 s->max_level_kmsg = LOG_NOTICE;
1482 s->max_level_console = LOG_INFO;
40b71e89 1483 s->max_level_wall = LOG_EMERG;
d025f1e4 1484
8580d1f7
LP
1485 journal_reset_metrics(&s->system_metrics);
1486 journal_reset_metrics(&s->runtime_metrics);
d025f1e4
ZJS
1487
1488 server_parse_config_file(s);
1489 server_parse_proc_cmdline(s);
8580d1f7 1490
d288f79f 1491 if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
b1389b0d
ZJS
1492 log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",
1493 s->rate_limit_interval, s->rate_limit_burst);
d288f79f
ZJS
1494 s->rate_limit_interval = s->rate_limit_burst = 0;
1495 }
d025f1e4 1496
8580d1f7 1497 (void) mkdir_p("/run/systemd/journal", 0755);
d025f1e4 1498
43cf8388 1499 s->user_journals = ordered_hashmap_new(NULL);
d025f1e4
ZJS
1500 if (!s->user_journals)
1501 return log_oom();
1502
1503 s->mmap = mmap_cache_new();
1504 if (!s->mmap)
1505 return log_oom();
1506
f9a810be 1507 r = sd_event_default(&s->event);
23bbb0de
MS
1508 if (r < 0)
1509 return log_error_errno(r, "Failed to create event loop: %m");
d025f1e4 1510
f9a810be
LP
1511 sd_event_set_watchdog(s->event, true);
1512
d025f1e4 1513 n = sd_listen_fds(true);
23bbb0de
MS
1514 if (n < 0)
1515 return log_error_errno(n, "Failed to read listening file descriptors from environment: %m");
d025f1e4
ZJS
1516
1517 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
1518
1519 if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
1520
1521 if (s->native_fd >= 0) {
1522 log_error("Too many native sockets passed.");
1523 return -EINVAL;
1524 }
1525
1526 s->native_fd = fd;
1527
1528 } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
1529
1530 if (s->stdout_fd >= 0) {
1531 log_error("Too many stdout sockets passed.");
1532 return -EINVAL;
1533 }
1534
1535 s->stdout_fd = fd;
1536
03ee5c38
LP
1537 } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0 ||
1538 sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/dev-log", 0) > 0) {
d025f1e4
ZJS
1539
1540 if (s->syslog_fd >= 0) {
1541 log_error("Too many /dev/log sockets passed.");
1542 return -EINVAL;
1543 }
1544
1545 s->syslog_fd = fd;
1546
875c2e22
LP
1547 } else if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
1548
1549 if (s->audit_fd >= 0) {
1550 log_error("Too many audit sockets passed.");
1551 return -EINVAL;
1552 }
1553
1554 s->audit_fd = fd;
1555
4ec3cd73 1556 } else {
4ec3cd73 1557
13790add
LP
1558 if (!fds) {
1559 fds = fdset_new();
1560 if (!fds)
1561 return log_oom();
1562 }
4ec3cd73 1563
13790add
LP
1564 r = fdset_put(fds, fd);
1565 if (r < 0)
1566 return log_oom();
4ec3cd73 1567 }
d025f1e4
ZJS
1568 }
1569
15d91bff
ZJS
1570 /* Try to restore streams, but don't bother if this fails */
1571 (void) server_restore_streams(s, fds);
d025f1e4 1572
13790add
LP
1573 if (fdset_size(fds) > 0) {
1574 log_warning("%u unknown file descriptors passed, closing.", fdset_size(fds));
1575 fds = fdset_free(fds);
1576 }
1577
7d18d348
ZJS
1578 no_sockets = s->native_fd < 0 && s->stdout_fd < 0 && s->syslog_fd < 0 && s->audit_fd < 0;
1579
1580 /* always open stdout, syslog, native, and kmsg sockets */
37b7affe
ZJS
1581
1582 /* systemd-journald.socket: /run/systemd/journal/stdout */
15d91bff
ZJS
1583 r = server_open_stdout_socket(s);
1584 if (r < 0)
1585 return r;
1586
37b7affe 1587 /* systemd-journald-dev-log.socket: /run/systemd/journal/dev-log */
13790add 1588 r = server_open_syslog_socket(s);
d025f1e4
ZJS
1589 if (r < 0)
1590 return r;
1591
37b7affe 1592 /* systemd-journald.socket: /run/systemd/journal/socket */
13790add 1593 r = server_open_native_socket(s);
d025f1e4
ZJS
1594 if (r < 0)
1595 return r;
1596
37b7affe 1597 /* /dev/ksmg */
d025f1e4
ZJS
1598 r = server_open_dev_kmsg(s);
1599 if (r < 0)
1600 return r;
1601
7d18d348
ZJS
1602 /* Unless we got *some* sockets and not audit, open audit socket */
1603 if (s->audit_fd >= 0 || no_sockets) {
1604 r = server_open_audit(s);
1605 if (r < 0)
1606 return r;
1607 }
875c2e22 1608
d025f1e4
ZJS
1609 r = server_open_kernel_seqnum(s);
1610 if (r < 0)
1611 return r;
1612
0c24bb23
LP
1613 r = server_open_hostname(s);
1614 if (r < 0)
1615 return r;
1616
f9a810be 1617 r = setup_signals(s);
d025f1e4
ZJS
1618 if (r < 0)
1619 return r;
1620
1621 s->udev = udev_new();
1622 if (!s->udev)
1623 return -ENOMEM;
1624
f9a810be 1625 s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst);
d025f1e4
ZJS
1626 if (!s->rate_limit)
1627 return -ENOMEM;
1628
e9174f29
LP
1629 r = cg_get_root_path(&s->cgroup_root);
1630 if (r < 0)
1631 return r;
1632
0c24bb23
LP
1633 server_cache_hostname(s);
1634 server_cache_boot_id(s);
1635 server_cache_machine_id(s);
1636
804ae586 1637 return system_journal_open(s, false);
d025f1e4
ZJS
1638}
1639
1640void server_maybe_append_tags(Server *s) {
1641#ifdef HAVE_GCRYPT
1642 JournalFile *f;
1643 Iterator i;
1644 usec_t n;
1645
1646 n = now(CLOCK_REALTIME);
1647
1648 if (s->system_journal)
1649 journal_file_maybe_append_tag(s->system_journal, n);
1650
43cf8388 1651 ORDERED_HASHMAP_FOREACH(f, s->user_journals, i)
d025f1e4
ZJS
1652 journal_file_maybe_append_tag(f, n);
1653#endif
1654}
1655
1656void server_done(Server *s) {
1657 JournalFile *f;
1658 assert(s);
1659
1660 while (s->stdout_streams)
1661 stdout_stream_free(s->stdout_streams);
1662
1663 if (s->system_journal)
1664 journal_file_close(s->system_journal);
1665
1666 if (s->runtime_journal)
1667 journal_file_close(s->runtime_journal);
1668
43cf8388 1669 while ((f = ordered_hashmap_steal_first(s->user_journals)))
d025f1e4
ZJS
1670 journal_file_close(f);
1671
43cf8388 1672 ordered_hashmap_free(s->user_journals);
d025f1e4 1673
f9a810be
LP
1674 sd_event_source_unref(s->syslog_event_source);
1675 sd_event_source_unref(s->native_event_source);
1676 sd_event_source_unref(s->stdout_event_source);
1677 sd_event_source_unref(s->dev_kmsg_event_source);
875c2e22 1678 sd_event_source_unref(s->audit_event_source);
f9a810be
LP
1679 sd_event_source_unref(s->sync_event_source);
1680 sd_event_source_unref(s->sigusr1_event_source);
1681 sd_event_source_unref(s->sigusr2_event_source);
1682 sd_event_source_unref(s->sigterm_event_source);
1683 sd_event_source_unref(s->sigint_event_source);
0c24bb23 1684 sd_event_source_unref(s->hostname_event_source);
f9a810be 1685 sd_event_unref(s->event);
d025f1e4 1686
03e334a1
LP
1687 safe_close(s->syslog_fd);
1688 safe_close(s->native_fd);
1689 safe_close(s->stdout_fd);
1690 safe_close(s->dev_kmsg_fd);
875c2e22 1691 safe_close(s->audit_fd);
03e334a1 1692 safe_close(s->hostname_fd);
0c24bb23 1693
d025f1e4
ZJS
1694 if (s->rate_limit)
1695 journal_rate_limit_free(s->rate_limit);
1696
1697 if (s->kernel_seqnum)
1698 munmap(s->kernel_seqnum, sizeof(uint64_t));
1699
1700 free(s->buffer);
1701 free(s->tty_path);
e9174f29 1702 free(s->cgroup_root);
99d0966e 1703 free(s->hostname_field);
d025f1e4
ZJS
1704
1705 if (s->mmap)
1706 mmap_cache_unref(s->mmap);
1707
3e044c49 1708 udev_unref(s->udev);
d025f1e4 1709}
8580d1f7
LP
1710
1711static const char* const storage_table[_STORAGE_MAX] = {
1712 [STORAGE_AUTO] = "auto",
1713 [STORAGE_VOLATILE] = "volatile",
1714 [STORAGE_PERSISTENT] = "persistent",
1715 [STORAGE_NONE] = "none"
1716};
1717
1718DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
1719DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
1720
1721static const char* const split_mode_table[_SPLIT_MAX] = {
1722 [SPLIT_LOGIN] = "login",
1723 [SPLIT_UID] = "uid",
1724 [SPLIT_NONE] = "none",
1725};
1726
1727DEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode);
1728DEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting");