]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald-server.c
util: modernization and test for load_env_file
[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
22#include <sys/signalfd.h>
23#include <sys/ioctl.h>
24#include <linux/sockios.h>
25#include <sys/statvfs.h>
26#include <sys/mman.h>
27
28#include <libudev.h>
29#include <systemd/sd-journal.h>
30#include <systemd/sd-messages.h>
31#include <systemd/sd-daemon.h>
32
33#ifdef HAVE_LOGIND
34#include <systemd/sd-login.h>
35#endif
36
37#include "mkdir.h"
38#include "hashmap.h"
39#include "journal-file.h"
40#include "socket-util.h"
41#include "cgroup-util.h"
42#include "list.h"
43#include "virt.h"
44#include "missing.h"
45#include "conf-parser.h"
46#include "journal-internal.h"
47#include "journal-vacuum.h"
48#include "journal-authenticate.h"
49#include "journald-server.h"
50#include "journald-rate-limit.h"
51#include "journald-kmsg.h"
52#include "journald-syslog.h"
53#include "journald-stream.h"
54#include "journald-console.h"
55#include "journald-native.h"
56
57#ifdef HAVE_ACL
58#include <sys/acl.h>
59#include <acl/libacl.h>
60#include "acl-util.h"
61#endif
62
63#ifdef HAVE_SELINUX
64#include <selinux/selinux.h>
65#endif
66
67#define USER_JOURNALS_MAX 1024
68
69#define DEFAULT_RATE_LIMIT_INTERVAL (10*USEC_PER_SEC)
70#define DEFAULT_RATE_LIMIT_BURST 200
71
72#define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
73
74static const char* const storage_table[] = {
75 [STORAGE_AUTO] = "auto",
76 [STORAGE_VOLATILE] = "volatile",
77 [STORAGE_PERSISTENT] = "persistent",
78 [STORAGE_NONE] = "none"
79};
80
81DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
82DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
83
84static const char* const split_mode_table[] = {
85 [SPLIT_NONE] = "none",
86 [SPLIT_UID] = "uid",
87 [SPLIT_LOGIN] = "login"
88};
89
90DEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode);
91DEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting");
92
93static uint64_t available_space(Server *s) {
db91ea32
ZJS
94 char ids[33];
95 char _cleanup_free_ *p = NULL;
d025f1e4
ZJS
96 const char *f;
97 sd_id128_t machine;
98 struct statvfs ss;
99 uint64_t sum = 0, avail = 0, ss_avail = 0;
100 int r;
db91ea32 101 DIR _cleanup_closedir_ *d = NULL;
d025f1e4
ZJS
102 usec_t ts;
103 JournalMetrics *m;
104
105 ts = now(CLOCK_MONOTONIC);
106
107 if (s->cached_available_space_timestamp + RECHECK_AVAILABLE_SPACE_USEC > ts)
108 return s->cached_available_space;
109
110 r = sd_id128_get_machine(&machine);
111 if (r < 0)
112 return 0;
113
114 if (s->system_journal) {
115 f = "/var/log/journal/";
116 m = &s->system_metrics;
117 } else {
118 f = "/run/log/journal/";
119 m = &s->runtime_metrics;
120 }
121
122 assert(m);
123
124 p = strappend(f, sd_id128_to_string(machine, ids));
125 if (!p)
126 return 0;
127
128 d = opendir(p);
d025f1e4
ZJS
129 if (!d)
130 return 0;
131
132 if (fstatvfs(dirfd(d), &ss) < 0)
db91ea32 133 return 0;
d025f1e4
ZJS
134
135 for (;;) {
136 struct stat st;
137 struct dirent *de;
138 union dirent_storage buf;
139
140 r = readdir_r(d, &buf.de, &de);
141 if (r != 0)
142 break;
143
144 if (!de)
145 break;
146
147 if (!endswith(de->d_name, ".journal") &&
148 !endswith(de->d_name, ".journal~"))
149 continue;
150
151 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
152 continue;
153
154 if (!S_ISREG(st.st_mode))
155 continue;
156
157 sum += (uint64_t) st.st_blocks * 512UL;
158 }
159
160 avail = sum >= m->max_use ? 0 : m->max_use - sum;
161
162 ss_avail = ss.f_bsize * ss.f_bavail;
163
164 ss_avail = ss_avail < m->keep_free ? 0 : ss_avail - m->keep_free;
165
166 if (ss_avail < avail)
167 avail = ss_avail;
168
169 s->cached_available_space = avail;
170 s->cached_available_space_timestamp = ts;
171
d025f1e4
ZJS
172 return avail;
173}
174
175static void server_read_file_gid(Server *s) {
176 const char *adm = "adm";
177 int r;
178
179 assert(s);
180
181 if (s->file_gid_valid)
182 return;
183
184 r = get_group_creds(&adm, &s->file_gid);
185 if (r < 0)
186 log_warning("Failed to resolve 'adm' group: %s", strerror(-r));
187
188 /* if we couldn't read the gid, then it will be 0, but that's
189 * fine and we shouldn't try to resolve the group again, so
190 * let's just pretend it worked right-away. */
191 s->file_gid_valid = true;
192}
193
194void server_fix_perms(Server *s, JournalFile *f, uid_t uid) {
195 int r;
196#ifdef HAVE_ACL
197 acl_t acl;
198 acl_entry_t entry;
199 acl_permset_t permset;
200#endif
201
202 assert(f);
203
204 server_read_file_gid(s);
205
206 r = fchmod_and_fchown(f->fd, 0640, 0, s->file_gid);
207 if (r < 0)
208 log_warning("Failed to fix access mode/rights on %s, ignoring: %s", f->path, strerror(-r));
209
210#ifdef HAVE_ACL
211 if (uid <= 0)
212 return;
213
214 acl = acl_get_fd(f->fd);
215 if (!acl) {
216 log_warning("Failed to read ACL on %s, ignoring: %m", f->path);
217 return;
218 }
219
220 r = acl_find_uid(acl, uid, &entry);
221 if (r <= 0) {
222
223 if (acl_create_entry(&acl, &entry) < 0 ||
224 acl_set_tag_type(entry, ACL_USER) < 0 ||
225 acl_set_qualifier(entry, &uid) < 0) {
226 log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
227 goto finish;
228 }
229 }
230
231 if (acl_get_permset(entry, &permset) < 0 ||
232 acl_add_perm(permset, ACL_READ) < 0 ||
233 acl_calc_mask(&acl) < 0) {
234 log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
235 goto finish;
236 }
237
238 if (acl_set_fd(f->fd, acl) < 0)
239 log_warning("Failed to set ACL on %s, ignoring: %m", f->path);
240
241finish:
242 acl_free(acl);
243#endif
244}
245
246static JournalFile* find_journal(Server *s, uid_t uid) {
247 char *p;
248 int r;
249 JournalFile *f;
250 sd_id128_t machine;
251
252 assert(s);
253
254 /* We split up user logs only on /var, not on /run. If the
255 * runtime file is open, we write to it exclusively, in order
256 * to guarantee proper order as soon as we flush /run to
257 * /var and close the runtime file. */
258
259 if (s->runtime_journal)
260 return s->runtime_journal;
261
262 if (uid <= 0)
263 return s->system_journal;
264
265 r = sd_id128_get_machine(&machine);
266 if (r < 0)
267 return s->system_journal;
268
269 f = hashmap_get(s->user_journals, UINT32_TO_PTR(uid));
270 if (f)
271 return f;
272
273 if (asprintf(&p, "/var/log/journal/" SD_ID128_FORMAT_STR "/user-%lu.journal",
274 SD_ID128_FORMAT_VAL(machine), (unsigned long) uid) < 0)
275 return s->system_journal;
276
277 while (hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
278 /* Too many open? Then let's close one */
279 f = hashmap_steal_first(s->user_journals);
280 assert(f);
281 journal_file_close(f);
282 }
283
284 r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, s->system_journal, &f);
285 free(p);
286
287 if (r < 0)
288 return s->system_journal;
289
290 server_fix_perms(s, f, uid);
291
292 r = hashmap_put(s->user_journals, UINT32_TO_PTR(uid), f);
293 if (r < 0) {
294 journal_file_close(f);
295 return s->system_journal;
296 }
297
298 return f;
299}
300
301void server_rotate(Server *s) {
302 JournalFile *f;
303 void *k;
304 Iterator i;
305 int r;
306
307 log_debug("Rotating...");
308
309 if (s->runtime_journal) {
310 r = journal_file_rotate(&s->runtime_journal, s->compress, false);
311 if (r < 0)
312 if (s->runtime_journal)
313 log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
314 else
315 log_error("Failed to create new runtime journal: %s", strerror(-r));
316 else
317 server_fix_perms(s, s->runtime_journal, 0);
318 }
319
320 if (s->system_journal) {
321 r = journal_file_rotate(&s->system_journal, s->compress, s->seal);
322 if (r < 0)
323 if (s->system_journal)
324 log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
325 else
326 log_error("Failed to create new system journal: %s", strerror(-r));
327
328 else
329 server_fix_perms(s, s->system_journal, 0);
330 }
331
332 HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
333 r = journal_file_rotate(&f, s->compress, s->seal);
334 if (r < 0)
7d73c134 335 if (f)
d025f1e4
ZJS
336 log_error("Failed to rotate %s: %s", f->path, strerror(-r));
337 else
338 log_error("Failed to create user journal: %s", strerror(-r));
339 else {
340 hashmap_replace(s->user_journals, k, f);
341 server_fix_perms(s, f, PTR_TO_UINT32(k));
342 }
343 }
344}
345
346void server_vacuum(Server *s) {
347 char *p;
348 char ids[33];
349 sd_id128_t machine;
350 int r;
351
352 log_debug("Vacuuming...");
353
354 s->oldest_file_usec = 0;
355
356 r = sd_id128_get_machine(&machine);
357 if (r < 0) {
358 log_error("Failed to get machine ID: %s", strerror(-r));
359 return;
360 }
361
362 sd_id128_to_string(machine, ids);
363
364 if (s->system_journal) {
365 p = strappend("/var/log/journal/", ids);
366 if (!p) {
367 log_oom();
368 return;
369 }
370
371 r = journal_directory_vacuum(p, s->system_metrics.max_use, s->system_metrics.keep_free, s->max_retention_usec, &s->oldest_file_usec);
372 if (r < 0 && r != -ENOENT)
373 log_error("Failed to vacuum %s: %s", p, strerror(-r));
374 free(p);
375 }
376
377 if (s->runtime_journal) {
378 p = strappend("/run/log/journal/", ids);
379 if (!p) {
380 log_oom();
381 return;
382 }
383
384 r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->runtime_metrics.keep_free, s->max_retention_usec, &s->oldest_file_usec);
385 if (r < 0 && r != -ENOENT)
386 log_error("Failed to vacuum %s: %s", p, strerror(-r));
387 free(p);
388 }
389
390 s->cached_available_space_timestamp = 0;
391}
392
393static char *shortened_cgroup_path(pid_t pid) {
394 int r;
db91ea32
ZJS
395 char _cleanup_free_ *process_path = NULL, *init_path = NULL;
396 char *path;
d025f1e4
ZJS
397
398 assert(pid > 0);
399
400 r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &process_path);
401 if (r < 0)
402 return NULL;
403
404 r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &init_path);
db91ea32 405 if (r < 0)
d025f1e4 406 return NULL;
d025f1e4
ZJS
407
408 if (endswith(init_path, "/system"))
409 init_path[strlen(init_path) - 7] = 0;
410 else if (streq(init_path, "/"))
411 init_path[0] = 0;
412
413 if (startswith(process_path, init_path)) {
db91ea32 414 path = strdup(process_path + strlen(init_path));
d025f1e4
ZJS
415 } else {
416 path = process_path;
417 process_path = NULL;
418 }
419
d025f1e4
ZJS
420 return path;
421}
422
423bool shall_try_append_again(JournalFile *f, int r) {
424
425 /* -E2BIG Hit configured limit
426 -EFBIG Hit fs limit
427 -EDQUOT Quota limit hit
428 -ENOSPC Disk full
429 -EHOSTDOWN Other machine
430 -EBUSY Unclean shutdown
431 -EPROTONOSUPPORT Unsupported feature
432 -EBADMSG Corrupted
433 -ENODATA Truncated
434 -ESHUTDOWN Already archived */
435
436 if (r == -E2BIG || r == -EFBIG || r == -EDQUOT || r == -ENOSPC)
437 log_debug("%s: Allocation limit reached, rotating.", f->path);
438 else if (r == -EHOSTDOWN)
439 log_info("%s: Journal file from other machine, rotating.", f->path);
440 else if (r == -EBUSY)
441 log_info("%s: Unclean shutdown, rotating.", f->path);
442 else if (r == -EPROTONOSUPPORT)
443 log_info("%s: Unsupported feature, rotating.", f->path);
444 else if (r == -EBADMSG || r == -ENODATA || r == ESHUTDOWN)
445 log_warning("%s: Journal file corrupted, rotating.", f->path);
446 else
447 return false;
448
449 return true;
450}
451
452static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n) {
453 JournalFile *f;
454 bool vacuumed = false;
455 int r;
456
457 assert(s);
458 assert(iovec);
459 assert(n > 0);
460
461 f = find_journal(s, uid);
462 if (!f)
463 return;
464
465 if (journal_file_rotate_suggested(f, s->max_file_usec)) {
466 log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
467 server_rotate(s);
468 server_vacuum(s);
469 vacuumed = true;
470
471 f = find_journal(s, uid);
472 if (!f)
473 return;
474 }
475
476 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
477 if (r >= 0)
478 return;
479
480 if (vacuumed || !shall_try_append_again(f, r)) {
481 log_error("Failed to write entry, ignoring: %s", strerror(-r));
482 return;
483 }
484
485 server_rotate(s);
486 server_vacuum(s);
487
488 f = find_journal(s, uid);
489 if (!f)
490 return;
491
492 log_debug("Retrying write.");
493 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
494 if (r < 0)
495 log_error("Failed to write entry, ignoring: %s", strerror(-r));
496}
497
498static void dispatch_message_real(
499 Server *s,
500 struct iovec *iovec, unsigned n, unsigned m,
501 struct ucred *ucred,
502 struct timeval *tv,
503 const char *label, size_t label_len,
504 const char *unit_id) {
505
db91ea32 506 char _cleanup_free_ *pid = NULL, *uid = NULL, *gid = NULL,
d025f1e4
ZJS
507 *source_time = NULL, *boot_id = NULL, *machine_id = NULL,
508 *comm = NULL, *cmdline = NULL, *hostname = NULL,
509 *audit_session = NULL, *audit_loginuid = NULL,
510 *exe = NULL, *cgroup = NULL, *session = NULL,
511 *owner_uid = NULL, *unit = NULL, *selinux_context = NULL;
512
513 char idbuf[33];
514 sd_id128_t id;
515 int r;
516 char *t;
517 uid_t loginuid = 0, realuid = 0;
518
519 assert(s);
520 assert(iovec);
521 assert(n > 0);
522 assert(n + N_IOVEC_META_FIELDS <= m);
523
524 if (ucred) {
525 uint32_t audit;
526#ifdef HAVE_LOGIND
527 uid_t owner;
528#endif
529
530 realuid = ucred->uid;
531
532 if (asprintf(&pid, "_PID=%lu", (unsigned long) ucred->pid) >= 0)
533 IOVEC_SET_STRING(iovec[n++], pid);
534
535 if (asprintf(&uid, "_UID=%lu", (unsigned long) ucred->uid) >= 0)
536 IOVEC_SET_STRING(iovec[n++], uid);
537
538 if (asprintf(&gid, "_GID=%lu", (unsigned long) ucred->gid) >= 0)
539 IOVEC_SET_STRING(iovec[n++], gid);
540
541 r = get_process_comm(ucred->pid, &t);
542 if (r >= 0) {
543 comm = strappend("_COMM=", t);
544 free(t);
545
546 if (comm)
547 IOVEC_SET_STRING(iovec[n++], comm);
548 }
549
550 r = get_process_exe(ucred->pid, &t);
551 if (r >= 0) {
552 exe = strappend("_EXE=", t);
553 free(t);
554
555 if (exe)
556 IOVEC_SET_STRING(iovec[n++], exe);
557 }
558
9bdbc2e2 559 r = get_process_cmdline(ucred->pid, 0, false, &t);
d025f1e4
ZJS
560 if (r >= 0) {
561 cmdline = strappend("_CMDLINE=", t);
562 free(t);
563
564 if (cmdline)
565 IOVEC_SET_STRING(iovec[n++], cmdline);
566 }
567
568 r = audit_session_from_pid(ucred->pid, &audit);
569 if (r >= 0)
570 if (asprintf(&audit_session, "_AUDIT_SESSION=%lu", (unsigned long) audit) >= 0)
571 IOVEC_SET_STRING(iovec[n++], audit_session);
572
573 r = audit_loginuid_from_pid(ucred->pid, &loginuid);
574 if (r >= 0)
575 if (asprintf(&audit_loginuid, "_AUDIT_LOGINUID=%lu", (unsigned long) loginuid) >= 0)
576 IOVEC_SET_STRING(iovec[n++], audit_loginuid);
577
578 t = shortened_cgroup_path(ucred->pid);
579 if (t) {
580 cgroup = strappend("_SYSTEMD_CGROUP=", t);
581 free(t);
582
583 if (cgroup)
584 IOVEC_SET_STRING(iovec[n++], cgroup);
585 }
586
587#ifdef HAVE_LOGIND
588 if (sd_pid_get_session(ucred->pid, &t) >= 0) {
589 session = strappend("_SYSTEMD_SESSION=", t);
590 free(t);
591
592 if (session)
593 IOVEC_SET_STRING(iovec[n++], session);
594 }
595
596 if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0)
597 if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0)
598 IOVEC_SET_STRING(iovec[n++], owner_uid);
599#endif
600
601 if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
602 unit = strappend("_SYSTEMD_UNIT=", t);
603 free(t);
604 } else if (unit_id)
605 unit = strappend("_SYSTEMD_UNIT=", unit_id);
606
607 if (unit)
608 IOVEC_SET_STRING(iovec[n++], unit);
609
610#ifdef HAVE_SELINUX
611 if (label) {
612 selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len);
613 if (selinux_context) {
614 memcpy(selinux_context, "_SELINUX_CONTEXT=", sizeof("_SELINUX_CONTEXT=")-1);
615 memcpy(selinux_context+sizeof("_SELINUX_CONTEXT=")-1, label, label_len);
616 selinux_context[sizeof("_SELINUX_CONTEXT=")-1+label_len] = 0;
617 IOVEC_SET_STRING(iovec[n++], selinux_context);
618 }
619 } else {
620 security_context_t con;
621
622 if (getpidcon(ucred->pid, &con) >= 0) {
623 selinux_context = strappend("_SELINUX_CONTEXT=", con);
624 if (selinux_context)
625 IOVEC_SET_STRING(iovec[n++], selinux_context);
626
627 freecon(con);
628 }
629 }
630#endif
631 }
632
633 if (tv) {
634 if (asprintf(&source_time, "_SOURCE_REALTIME_TIMESTAMP=%llu",
635 (unsigned long long) timeval_load(tv)) >= 0)
636 IOVEC_SET_STRING(iovec[n++], source_time);
637 }
638
639 /* Note that strictly speaking storing the boot id here is
640 * redundant since the entry includes this in-line
641 * anyway. However, we need this indexed, too. */
642 r = sd_id128_get_boot(&id);
643 if (r >= 0)
644 if (asprintf(&boot_id, "_BOOT_ID=%s", sd_id128_to_string(id, idbuf)) >= 0)
645 IOVEC_SET_STRING(iovec[n++], boot_id);
646
647 r = sd_id128_get_machine(&id);
648 if (r >= 0)
649 if (asprintf(&machine_id, "_MACHINE_ID=%s", sd_id128_to_string(id, idbuf)) >= 0)
650 IOVEC_SET_STRING(iovec[n++], machine_id);
651
652 t = gethostname_malloc();
653 if (t) {
654 hostname = strappend("_HOSTNAME=", t);
655 free(t);
656 if (hostname)
657 IOVEC_SET_STRING(iovec[n++], hostname);
658 }
659
660 assert(n <= m);
661
662 write_to_journal(s,
663 s->split_mode == SPLIT_NONE ? 0 :
664 (s->split_mode == SPLIT_UID ? realuid :
665 (realuid == 0 ? 0 : loginuid)), iovec, n);
d025f1e4
ZJS
666}
667
668void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
669 char mid[11 + 32 + 1];
670 char buffer[16 + LINE_MAX + 1];
671 struct iovec iovec[N_IOVEC_META_FIELDS + 4];
672 int n = 0;
673 va_list ap;
674 struct ucred ucred;
675
676 assert(s);
677 assert(format);
678
679 IOVEC_SET_STRING(iovec[n++], "PRIORITY=6");
680 IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=driver");
681
682 memcpy(buffer, "MESSAGE=", 8);
683 va_start(ap, format);
684 vsnprintf(buffer + 8, sizeof(buffer) - 8, format, ap);
685 va_end(ap);
686 char_array_0(buffer);
687 IOVEC_SET_STRING(iovec[n++], buffer);
688
689 if (!sd_id128_equal(message_id, SD_ID128_NULL)) {
690 snprintf(mid, sizeof(mid), MESSAGE_ID(message_id));
691 char_array_0(mid);
692 IOVEC_SET_STRING(iovec[n++], mid);
693 }
694
695 zero(ucred);
696 ucred.pid = getpid();
697 ucred.uid = getuid();
698 ucred.gid = getgid();
699
700 dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL);
701}
702
703void server_dispatch_message(
704 Server *s,
705 struct iovec *iovec, unsigned n, unsigned m,
706 struct ucred *ucred,
707 struct timeval *tv,
708 const char *label, size_t label_len,
709 const char *unit_id,
710 int priority) {
711
712 int rl;
db91ea32
ZJS
713 char _cleanup_free_ *path = NULL;
714 char *c;
d025f1e4
ZJS
715
716 assert(s);
717 assert(iovec || n == 0);
718
719 if (n == 0)
720 return;
721
722 if (LOG_PRI(priority) > s->max_level_store)
723 return;
724
725 if (!ucred)
726 goto finish;
727
728 path = shortened_cgroup_path(ucred->pid);
729 if (!path)
730 goto finish;
731
732 /* example: /user/lennart/3/foobar
733 * /system/dbus.service/foobar
734 *
735 * So let's cut of everything past the third /, since that is
736 * where user directories start */
737
738 c = strchr(path, '/');
739 if (c) {
740 c = strchr(c+1, '/');
741 if (c) {
742 c = strchr(c+1, '/');
743 if (c)
744 *c = 0;
745 }
746 }
747
db91ea32
ZJS
748 rl = journal_rate_limit_test(s->rate_limit, path,
749 priority & LOG_PRIMASK, available_space(s));
d025f1e4 750
db91ea32 751 if (rl == 0)
d025f1e4 752 return;
d025f1e4
ZJS
753
754 /* Write a suppression message if we suppressed something */
755 if (rl > 1)
db91ea32
ZJS
756 server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED,
757 "Suppressed %u messages from %s", rl - 1, path);
d025f1e4
ZJS
758
759finish:
760 dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id);
761}
762
763
764static int system_journal_open(Server *s) {
765 int r;
766 char *fn;
767 sd_id128_t machine;
768 char ids[33];
769
770 r = sd_id128_get_machine(&machine);
771 if (r < 0)
772 return r;
773
774 sd_id128_to_string(machine, ids);
775
776 if (!s->system_journal &&
777 (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
778 access("/run/systemd/journal/flushed", F_OK) >= 0) {
779
780 /* If in auto mode: first try to create the machine
781 * path, but not the prefix.
782 *
783 * If in persistent mode: create /var/log/journal and
784 * the machine path */
785
786 if (s->storage == STORAGE_PERSISTENT)
787 (void) mkdir("/var/log/journal/", 0755);
788
789 fn = strappend("/var/log/journal/", ids);
790 if (!fn)
791 return -ENOMEM;
792
793 (void) mkdir(fn, 0755);
794 free(fn);
795
796 fn = strjoin("/var/log/journal/", ids, "/system.journal", NULL);
797 if (!fn)
798 return -ENOMEM;
799
800 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal);
801 free(fn);
802
803 if (r >= 0) {
804 char fb[FORMAT_BYTES_MAX];
805
806 server_fix_perms(s, s->system_journal, 0);
807 server_driver_message(s, SD_ID128_NULL, "Allowing system journal files to grow to %s.",
808 format_bytes(fb, sizeof(fb), s->system_metrics.max_use));
809
810 } else if (r < 0) {
811
812 if (r != -ENOENT && r != -EROFS)
813 log_warning("Failed to open system journal: %s", strerror(-r));
814
815 r = 0;
816 }
817 }
818
819 if (!s->runtime_journal &&
820 (s->storage != STORAGE_NONE)) {
821
822 fn = strjoin("/run/log/journal/", ids, "/system.journal", NULL);
823 if (!fn)
824 return -ENOMEM;
825
826 if (s->system_journal) {
827
828 /* Try to open the runtime journal, but only
829 * if it already exists, so that we can flush
830 * it into the system journal */
831
832 r = journal_file_open(fn, O_RDWR, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
833 free(fn);
834
835 if (r < 0) {
836 if (r != -ENOENT)
837 log_warning("Failed to open runtime journal: %s", strerror(-r));
838
839 r = 0;
840 }
841
842 } else {
843
844 /* OK, we really need the runtime journal, so create
845 * it if necessary. */
846
847 (void) mkdir_parents(fn, 0755);
848 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
849 free(fn);
850
851 if (r < 0) {
852 log_error("Failed to open runtime journal: %s", strerror(-r));
853 return r;
854 }
855 }
856
857 if (s->runtime_journal) {
858 char fb[FORMAT_BYTES_MAX];
859
860 server_fix_perms(s, s->runtime_journal, 0);
861 server_driver_message(s, SD_ID128_NULL, "Allowing runtime journal files to grow to %s.",
862 format_bytes(fb, sizeof(fb), s->runtime_metrics.max_use));
863 }
864 }
865
866 return r;
867}
868
869int server_flush_to_var(Server *s) {
870 int r;
871 sd_id128_t machine;
872 sd_journal *j = NULL;
873
874 assert(s);
875
876 if (s->storage != STORAGE_AUTO &&
877 s->storage != STORAGE_PERSISTENT)
878 return 0;
879
880 if (!s->runtime_journal)
881 return 0;
882
883 system_journal_open(s);
884
885 if (!s->system_journal)
886 return 0;
887
888 log_debug("Flushing to /var...");
889
890 r = sd_id128_get_machine(&machine);
891 if (r < 0) {
892 log_error("Failed to get machine id: %s", strerror(-r));
893 return r;
894 }
895
896 r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
897 if (r < 0) {
898 log_error("Failed to read runtime journal: %s", strerror(-r));
899 return r;
900 }
901
93b73b06
LP
902 sd_journal_set_data_threshold(j, 0);
903
d025f1e4
ZJS
904 SD_JOURNAL_FOREACH(j) {
905 Object *o = NULL;
906 JournalFile *f;
907
908 f = j->current_file;
909 assert(f && f->current_offset > 0);
910
911 r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
912 if (r < 0) {
913 log_error("Can't read entry: %s", strerror(-r));
914 goto finish;
915 }
916
917 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
918 if (r >= 0)
919 continue;
920
921 if (!shall_try_append_again(s->system_journal, r)) {
922 log_error("Can't write entry: %s", strerror(-r));
923 goto finish;
924 }
925
926 server_rotate(s);
927 server_vacuum(s);
928
929 log_debug("Retrying write.");
930 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
931 if (r < 0) {
932 log_error("Can't write entry: %s", strerror(-r));
933 goto finish;
934 }
935 }
936
937finish:
938 journal_file_post_change(s->system_journal);
939
940 journal_file_close(s->runtime_journal);
941 s->runtime_journal = NULL;
942
943 if (r >= 0)
944 rm_rf("/run/log/journal", false, true, false);
945
946 if (j)
947 sd_journal_close(j);
948
949 return r;
950}
951
952int process_event(Server *s, struct epoll_event *ev) {
953 assert(s);
954 assert(ev);
955
956 if (ev->data.fd == s->signal_fd) {
957 struct signalfd_siginfo sfsi;
958 ssize_t n;
959
960 if (ev->events != EPOLLIN) {
961 log_error("Got invalid event from epoll.");
962 return -EIO;
963 }
964
965 n = read(s->signal_fd, &sfsi, sizeof(sfsi));
966 if (n != sizeof(sfsi)) {
967
968 if (n >= 0)
969 return -EIO;
970
971 if (errno == EINTR || errno == EAGAIN)
972 return 1;
973
974 return -errno;
975 }
976
977 log_info("Received SIG%s", signal_to_string(sfsi.ssi_signo));
978
979 if (sfsi.ssi_signo == SIGUSR1) {
980 touch("/run/systemd/journal/flushed");
981 server_flush_to_var(s);
982 return 1;
983 }
984
985 if (sfsi.ssi_signo == SIGUSR2) {
986 server_rotate(s);
987 server_vacuum(s);
988 return 1;
989 }
990
991 return 0;
992
993 } else if (ev->data.fd == s->dev_kmsg_fd) {
994 int r;
995
996 if (ev->events != EPOLLIN) {
997 log_error("Got invalid event from epoll.");
998 return -EIO;
999 }
1000
1001 r = server_read_dev_kmsg(s);
1002 if (r < 0)
1003 return r;
1004
1005 return 1;
1006
1007 } else if (ev->data.fd == s->native_fd ||
1008 ev->data.fd == s->syslog_fd) {
1009
1010 if (ev->events != EPOLLIN) {
1011 log_error("Got invalid event from epoll.");
1012 return -EIO;
1013 }
1014
1015 for (;;) {
1016 struct msghdr msghdr;
1017 struct iovec iovec;
1018 struct ucred *ucred = NULL;
1019 struct timeval *tv = NULL;
1020 struct cmsghdr *cmsg;
1021 char *label = NULL;
1022 size_t label_len = 0;
1023 union {
1024 struct cmsghdr cmsghdr;
1025
1026 /* We use NAME_MAX space for the
1027 * SELinux label here. The kernel
1028 * currently enforces no limit, but
1029 * according to suggestions from the
1030 * SELinux people this will change and
1031 * it will probably be identical to
1032 * NAME_MAX. For now we use that, but
1033 * this should be updated one day when
1034 * the final limit is known.*/
1035 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
1036 CMSG_SPACE(sizeof(struct timeval)) +
1037 CMSG_SPACE(sizeof(int)) + /* fd */
1038 CMSG_SPACE(NAME_MAX)]; /* selinux label */
1039 } control;
1040 ssize_t n;
1041 int v;
1042 int *fds = NULL;
1043 unsigned n_fds = 0;
1044
1045 if (ioctl(ev->data.fd, SIOCINQ, &v) < 0) {
1046 log_error("SIOCINQ failed: %m");
1047 return -errno;
1048 }
1049
1050 if (s->buffer_size < (size_t) v) {
1051 void *b;
1052 size_t l;
1053
1054 l = MAX(LINE_MAX + (size_t) v, s->buffer_size * 2);
1055 b = realloc(s->buffer, l+1);
1056
1057 if (!b) {
1058 log_error("Couldn't increase buffer.");
1059 return -ENOMEM;
1060 }
1061
1062 s->buffer_size = l;
1063 s->buffer = b;
1064 }
1065
1066 zero(iovec);
1067 iovec.iov_base = s->buffer;
1068 iovec.iov_len = s->buffer_size;
1069
1070 zero(control);
1071 zero(msghdr);
1072 msghdr.msg_iov = &iovec;
1073 msghdr.msg_iovlen = 1;
1074 msghdr.msg_control = &control;
1075 msghdr.msg_controllen = sizeof(control);
1076
1077 n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
1078 if (n < 0) {
1079
1080 if (errno == EINTR || errno == EAGAIN)
1081 return 1;
1082
1083 log_error("recvmsg() failed: %m");
1084 return -errno;
1085 }
1086
1087 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
1088
1089 if (cmsg->cmsg_level == SOL_SOCKET &&
1090 cmsg->cmsg_type == SCM_CREDENTIALS &&
1091 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
1092 ucred = (struct ucred*) CMSG_DATA(cmsg);
1093 else if (cmsg->cmsg_level == SOL_SOCKET &&
1094 cmsg->cmsg_type == SCM_SECURITY) {
1095 label = (char*) CMSG_DATA(cmsg);
1096 label_len = cmsg->cmsg_len - CMSG_LEN(0);
1097 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1098 cmsg->cmsg_type == SO_TIMESTAMP &&
1099 cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
1100 tv = (struct timeval*) CMSG_DATA(cmsg);
1101 else if (cmsg->cmsg_level == SOL_SOCKET &&
1102 cmsg->cmsg_type == SCM_RIGHTS) {
1103 fds = (int*) CMSG_DATA(cmsg);
1104 n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
1105 }
1106 }
1107
1108 if (ev->data.fd == s->syslog_fd) {
1109 char *e;
1110
1111 if (n > 0 && n_fds == 0) {
1112 e = memchr(s->buffer, '\n', n);
1113 if (e)
1114 *e = 0;
1115 else
1116 s->buffer[n] = 0;
1117
1118 server_process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
1119 } else if (n_fds > 0)
1120 log_warning("Got file descriptors via syslog socket. Ignoring.");
1121
1122 } else {
1123 if (n > 0 && n_fds == 0)
1124 server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
1125 else if (n == 0 && n_fds == 1)
1126 server_process_native_file(s, fds[0], ucred, tv, label, label_len);
1127 else if (n_fds > 0)
1128 log_warning("Got too many file descriptors via native socket. Ignoring.");
1129 }
1130
1131 close_many(fds, n_fds);
1132 }
1133
1134 return 1;
1135
1136 } else if (ev->data.fd == s->stdout_fd) {
1137
1138 if (ev->events != EPOLLIN) {
1139 log_error("Got invalid event from epoll.");
1140 return -EIO;
1141 }
1142
1143 stdout_stream_new(s);
1144 return 1;
1145
1146 } else {
1147 StdoutStream *stream;
1148
1149 if ((ev->events|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) {
1150 log_error("Got invalid event from epoll.");
1151 return -EIO;
1152 }
1153
1154 /* If it is none of the well-known fds, it must be an
1155 * stdout stream fd. Note that this is a bit ugly here
1156 * (since we rely that none of the well-known fds
1157 * could be interpreted as pointer), but nonetheless
1158 * safe, since the well-known fds would never get an
1159 * fd > 4096, i.e. beyond the first memory page */
1160
1161 stream = ev->data.ptr;
1162
1163 if (stdout_stream_process(stream) <= 0)
1164 stdout_stream_free(stream);
1165
1166 return 1;
1167 }
1168
1169 log_error("Unknown event.");
1170 return 0;
1171}
1172
1173static int open_signalfd(Server *s) {
1174 sigset_t mask;
1175 struct epoll_event ev;
1176
1177 assert(s);
1178
1179 assert_se(sigemptyset(&mask) == 0);
1180 sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1);
1181 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
1182
1183 s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
1184 if (s->signal_fd < 0) {
1185 log_error("signalfd(): %m");
1186 return -errno;
1187 }
1188
1189 zero(ev);
1190 ev.events = EPOLLIN;
1191 ev.data.fd = s->signal_fd;
1192
1193 if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->signal_fd, &ev) < 0) {
1194 log_error("epoll_ctl(): %m");
1195 return -errno;
1196 }
1197
1198 return 0;
1199}
1200
1201static int server_parse_proc_cmdline(Server *s) {
db91ea32
ZJS
1202 char _cleanup_free_ *line = NULL;
1203 char *w, *state;
d025f1e4
ZJS
1204 int r;
1205 size_t l;
1206
1207 if (detect_container(NULL) > 0)
1208 return 0;
1209
1210 r = read_one_line_file("/proc/cmdline", &line);
1211 if (r < 0) {
1212 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
1213 return 0;
1214 }
1215
1216 FOREACH_WORD_QUOTED(w, l, line, state) {
db91ea32 1217 char _cleanup_free_ *word;
d025f1e4
ZJS
1218
1219 word = strndup(w, l);
db91ea32
ZJS
1220 if (!word)
1221 return -ENOMEM;
d025f1e4
ZJS
1222
1223 if (startswith(word, "systemd.journald.forward_to_syslog=")) {
1224 r = parse_boolean(word + 35);
1225 if (r < 0)
1226 log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
1227 else
1228 s->forward_to_syslog = r;
1229 } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
1230 r = parse_boolean(word + 33);
1231 if (r < 0)
1232 log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
1233 else
1234 s->forward_to_kmsg = r;
1235 } else if (startswith(word, "systemd.journald.forward_to_console=")) {
1236 r = parse_boolean(word + 36);
1237 if (r < 0)
1238 log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
1239 else
1240 s->forward_to_console = r;
1241 } else if (startswith(word, "systemd.journald"))
1242 log_warning("Invalid systemd.journald parameter. Ignoring.");
d025f1e4
ZJS
1243 }
1244
db91ea32 1245 return 0;
d025f1e4
ZJS
1246}
1247
1248static int server_parse_config_file(Server *s) {
db91ea32
ZJS
1249 static const char *fn = "/etc/systemd/journald.conf";
1250 FILE _cleanup_fclose_ *f = NULL;
d025f1e4
ZJS
1251 int r;
1252
1253 assert(s);
1254
d025f1e4
ZJS
1255 f = fopen(fn, "re");
1256 if (!f) {
1257 if (errno == ENOENT)
1258 return 0;
1259
1260 log_warning("Failed to open configuration file %s: %m", fn);
1261 return -errno;
1262 }
1263
db91ea32
ZJS
1264 r = config_parse(fn, f, "Journal\0", config_item_perf_lookup,
1265 (void*) journald_gperf_lookup, false, s);
d025f1e4
ZJS
1266 if (r < 0)
1267 log_warning("Failed to parse configuration file: %s", strerror(-r));
1268
d025f1e4
ZJS
1269 return r;
1270}
1271
1272int server_init(Server *s) {
1273 int n, r, fd;
1274
1275 assert(s);
1276
1277 zero(*s);
1278 s->syslog_fd = s->native_fd = s->stdout_fd = s->signal_fd = s->epoll_fd = s->dev_kmsg_fd = -1;
1279 s->compress = true;
1280 s->seal = true;
1281
1282 s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
1283 s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
1284
1285 s->forward_to_syslog = true;
1286
1287 s->max_level_store = LOG_DEBUG;
1288 s->max_level_syslog = LOG_DEBUG;
1289 s->max_level_kmsg = LOG_NOTICE;
1290 s->max_level_console = LOG_INFO;
1291
1292 memset(&s->system_metrics, 0xFF, sizeof(s->system_metrics));
1293 memset(&s->runtime_metrics, 0xFF, sizeof(s->runtime_metrics));
1294
1295 server_parse_config_file(s);
1296 server_parse_proc_cmdline(s);
1297
1298 mkdir_p("/run/systemd/journal", 0755);
1299
1300 s->user_journals = hashmap_new(trivial_hash_func, trivial_compare_func);
1301 if (!s->user_journals)
1302 return log_oom();
1303
1304 s->mmap = mmap_cache_new();
1305 if (!s->mmap)
1306 return log_oom();
1307
1308 s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
1309 if (s->epoll_fd < 0) {
1310 log_error("Failed to create epoll object: %m");
1311 return -errno;
1312 }
1313
1314 n = sd_listen_fds(true);
1315 if (n < 0) {
1316 log_error("Failed to read listening file descriptors from environment: %s", strerror(-n));
1317 return n;
1318 }
1319
1320 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
1321
1322 if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
1323
1324 if (s->native_fd >= 0) {
1325 log_error("Too many native sockets passed.");
1326 return -EINVAL;
1327 }
1328
1329 s->native_fd = fd;
1330
1331 } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
1332
1333 if (s->stdout_fd >= 0) {
1334 log_error("Too many stdout sockets passed.");
1335 return -EINVAL;
1336 }
1337
1338 s->stdout_fd = fd;
1339
1340 } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0) {
1341
1342 if (s->syslog_fd >= 0) {
1343 log_error("Too many /dev/log sockets passed.");
1344 return -EINVAL;
1345 }
1346
1347 s->syslog_fd = fd;
1348
1349 } else {
1350 log_error("Unknown socket passed.");
1351 return -EINVAL;
1352 }
1353 }
1354
1355 r = server_open_syslog_socket(s);
1356 if (r < 0)
1357 return r;
1358
1359 r = server_open_native_socket(s);
1360 if (r < 0)
1361 return r;
1362
1363 r = server_open_stdout_socket(s);
1364 if (r < 0)
1365 return r;
1366
1367 r = server_open_dev_kmsg(s);
1368 if (r < 0)
1369 return r;
1370
1371 r = server_open_kernel_seqnum(s);
1372 if (r < 0)
1373 return r;
1374
1375 r = open_signalfd(s);
1376 if (r < 0)
1377 return r;
1378
1379 s->udev = udev_new();
1380 if (!s->udev)
1381 return -ENOMEM;
1382
1383 s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst);
1384 if (!s->rate_limit)
1385 return -ENOMEM;
1386
1387 r = system_journal_open(s);
1388 if (r < 0)
1389 return r;
1390
1391 return 0;
1392}
1393
1394void server_maybe_append_tags(Server *s) {
1395#ifdef HAVE_GCRYPT
1396 JournalFile *f;
1397 Iterator i;
1398 usec_t n;
1399
1400 n = now(CLOCK_REALTIME);
1401
1402 if (s->system_journal)
1403 journal_file_maybe_append_tag(s->system_journal, n);
1404
1405 HASHMAP_FOREACH(f, s->user_journals, i)
1406 journal_file_maybe_append_tag(f, n);
1407#endif
1408}
1409
1410void server_done(Server *s) {
1411 JournalFile *f;
1412 assert(s);
1413
1414 while (s->stdout_streams)
1415 stdout_stream_free(s->stdout_streams);
1416
1417 if (s->system_journal)
1418 journal_file_close(s->system_journal);
1419
1420 if (s->runtime_journal)
1421 journal_file_close(s->runtime_journal);
1422
1423 while ((f = hashmap_steal_first(s->user_journals)))
1424 journal_file_close(f);
1425
1426 hashmap_free(s->user_journals);
1427
1428 if (s->epoll_fd >= 0)
1429 close_nointr_nofail(s->epoll_fd);
1430
1431 if (s->signal_fd >= 0)
1432 close_nointr_nofail(s->signal_fd);
1433
1434 if (s->syslog_fd >= 0)
1435 close_nointr_nofail(s->syslog_fd);
1436
1437 if (s->native_fd >= 0)
1438 close_nointr_nofail(s->native_fd);
1439
1440 if (s->stdout_fd >= 0)
1441 close_nointr_nofail(s->stdout_fd);
1442
1443 if (s->dev_kmsg_fd >= 0)
1444 close_nointr_nofail(s->dev_kmsg_fd);
1445
1446 if (s->rate_limit)
1447 journal_rate_limit_free(s->rate_limit);
1448
1449 if (s->kernel_seqnum)
1450 munmap(s->kernel_seqnum, sizeof(uint64_t));
1451
1452 free(s->buffer);
1453 free(s->tty_path);
1454
1455 if (s->mmap)
1456 mmap_cache_unref(s->mmap);
1457
1458 if (s->udev)
1459 udev_unref(s->udev);
1460}