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