]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/journal/journald.c
journalctl: complain if unprivileged users attempt to access the journal and persista...
[thirdparty/systemd.git] / src / journal / journald.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/epoll.h>
23 #include <sys/socket.h>
24 #include <errno.h>
25 #include <sys/signalfd.h>
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <stddef.h>
29 #include <sys/ioctl.h>
30 #include <linux/sockios.h>
31 #include <sys/statvfs.h>
32 #include <sys/mman.h>
33
34 #include <libudev.h>
35 #include <systemd/sd-journal.h>
36 #include <systemd/sd-messages.h>
37 #include <systemd/sd-daemon.h>
38
39 #ifdef HAVE_LOGIND
40 #include <systemd/sd-login.h>
41 #endif
42
43 #include "mkdir.h"
44 #include "hashmap.h"
45 #include "journal-file.h"
46 #include "socket-util.h"
47 #include "cgroup-util.h"
48 #include "list.h"
49 #include "virt.h"
50 #include "missing.h"
51 #include "conf-parser.h"
52 #include "journal-internal.h"
53 #include "journal-vacuum.h"
54 #include "journal-authenticate.h"
55 #include "journald.h"
56 #include "journald-rate-limit.h"
57 #include "journald-kmsg.h"
58 #include "journald-syslog.h"
59 #include "journald-stream.h"
60 #include "journald-console.h"
61 #include "journald-native.h"
62
63 #ifdef HAVE_ACL
64 #include <sys/acl.h>
65 #include <acl/libacl.h>
66 #include "acl-util.h"
67 #endif
68
69 #ifdef HAVE_SELINUX
70 #include <selinux/selinux.h>
71 #endif
72
73 #define USER_JOURNALS_MAX 1024
74
75 #define DEFAULT_RATE_LIMIT_INTERVAL (10*USEC_PER_SEC)
76 #define DEFAULT_RATE_LIMIT_BURST 200
77
78 #define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
79
80 static const char* const storage_table[] = {
81 [STORAGE_AUTO] = "auto",
82 [STORAGE_VOLATILE] = "volatile",
83 [STORAGE_PERSISTENT] = "persistent",
84 [STORAGE_NONE] = "none"
85 };
86
87 DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
88 DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
89
90 static uint64_t available_space(Server *s) {
91 char ids[33], *p;
92 const char *f;
93 sd_id128_t machine;
94 struct statvfs ss;
95 uint64_t sum = 0, avail = 0, ss_avail = 0;
96 int r;
97 DIR *d;
98 usec_t ts;
99 JournalMetrics *m;
100
101 ts = now(CLOCK_MONOTONIC);
102
103 if (s->cached_available_space_timestamp + RECHECK_AVAILABLE_SPACE_USEC > ts)
104 return s->cached_available_space;
105
106 r = sd_id128_get_machine(&machine);
107 if (r < 0)
108 return 0;
109
110 if (s->system_journal) {
111 f = "/var/log/journal/";
112 m = &s->system_metrics;
113 } else {
114 f = "/run/log/journal/";
115 m = &s->runtime_metrics;
116 }
117
118 assert(m);
119
120 p = strappend(f, sd_id128_to_string(machine, ids));
121 if (!p)
122 return 0;
123
124 d = opendir(p);
125 free(p);
126
127 if (!d)
128 return 0;
129
130 if (fstatvfs(dirfd(d), &ss) < 0)
131 goto finish;
132
133 for (;;) {
134 struct stat st;
135 struct dirent buf, *de;
136
137 r = readdir_r(d, &buf, &de);
138 if (r != 0)
139 break;
140
141 if (!de)
142 break;
143
144 if (!endswith(de->d_name, ".journal") &&
145 !endswith(de->d_name, ".journal~"))
146 continue;
147
148 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
149 continue;
150
151 if (!S_ISREG(st.st_mode))
152 continue;
153
154 sum += (uint64_t) st.st_blocks * 512UL;
155 }
156
157 avail = sum >= m->max_use ? 0 : m->max_use - sum;
158
159 ss_avail = ss.f_bsize * ss.f_bavail;
160
161 ss_avail = ss_avail < m->keep_free ? 0 : ss_avail - m->keep_free;
162
163 if (ss_avail < avail)
164 avail = ss_avail;
165
166 s->cached_available_space = avail;
167 s->cached_available_space_timestamp = ts;
168
169 finish:
170 closedir(d);
171
172 return avail;
173 }
174
175 static 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
194 static void 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
241 finish:
242 acl_free(acl);
243 #endif
244 }
245
246 static 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
301 static void server_rotate(Server *s) {
302 JournalFile *f;
303 void *k;
304 Iterator i;
305 int r;
306
307 log_info("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)
335 if (f->path)
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, s->system_journal, PTR_TO_UINT32(k));
342 }
343 }
344 }
345
346 static void server_vacuum(Server *s) {
347 char *p;
348 char ids[33];
349 sd_id128_t machine;
350 int r;
351
352 log_info("Vacuuming...");
353
354 r = sd_id128_get_machine(&machine);
355 if (r < 0) {
356 log_error("Failed to get machine ID: %s", strerror(-r));
357 return;
358 }
359
360 sd_id128_to_string(machine, ids);
361
362 if (s->system_journal) {
363 p = strappend("/var/log/journal/", ids);
364 if (!p) {
365 log_oom();
366 return;
367 }
368
369 r = journal_directory_vacuum(p, s->system_metrics.max_use, s->system_metrics.keep_free);
370 if (r < 0 && r != -ENOENT)
371 log_error("Failed to vacuum %s: %s", p, strerror(-r));
372 free(p);
373 }
374
375 if (s->runtime_journal) {
376 p = strappend("/run/log/journal/", ids);
377 if (!p) {
378 log_oom();
379 return;
380 }
381
382 r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->runtime_metrics.keep_free);
383 if (r < 0 && r != -ENOENT)
384 log_error("Failed to vacuum %s: %s", p, strerror(-r));
385 free(p);
386 }
387
388 s->cached_available_space_timestamp = 0;
389 }
390
391 static char *shortened_cgroup_path(pid_t pid) {
392 int r;
393 char *process_path, *init_path, *path;
394
395 assert(pid > 0);
396
397 r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &process_path);
398 if (r < 0)
399 return NULL;
400
401 r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &init_path);
402 if (r < 0) {
403 free(process_path);
404 return NULL;
405 }
406
407 if (endswith(init_path, "/system"))
408 init_path[strlen(init_path) - 7] = 0;
409 else if (streq(init_path, "/"))
410 init_path[0] = 0;
411
412 if (startswith(process_path, init_path)) {
413 char *p;
414
415 p = strdup(process_path + strlen(init_path));
416 if (!p) {
417 free(process_path);
418 free(init_path);
419 return NULL;
420 }
421 path = p;
422 } else {
423 path = process_path;
424 process_path = NULL;
425 }
426
427 free(process_path);
428 free(init_path);
429
430 return path;
431 }
432
433 static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n) {
434 JournalFile *f;
435 bool vacuumed = false;
436 int r;
437
438 assert(s);
439 assert(iovec);
440 assert(n > 0);
441
442 f = find_journal(s, uid);
443 if (!f)
444 return;
445
446 if (journal_file_rotate_suggested(f)) {
447 log_info("Journal header limits reached or header out-of-date, rotating.");
448 server_rotate(s);
449 server_vacuum(s);
450 vacuumed = true;
451
452 f = find_journal(s, uid);
453 if (!f)
454 return;
455 }
456
457 for (;;) {
458 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
459 if (r >= 0)
460 return;
461
462 if (vacuumed ||
463 (r != -E2BIG && /* hit limit */
464 r != -EFBIG && /* hit fs limit */
465 r != -EDQUOT && /* quota hit */
466 r != -ENOSPC && /* disk full */
467 r != -EBADMSG && /* corrupted */
468 r != -ENODATA && /* truncated */
469 r != -EHOSTDOWN && /* other machine */
470 r != -EPROTONOSUPPORT && /* unsupported feature */
471 r != -EBUSY && /* unclean shutdown */
472 r != -ESHUTDOWN /* already archived */)) {
473 log_error("Failed to write entry, ignoring: %s", strerror(-r));
474 return;
475 }
476
477 if (r == -E2BIG || r == -EFBIG || r == EDQUOT || r == ENOSPC)
478 log_info("Allocation limit reached, rotating.");
479 else if (r == -EHOSTDOWN)
480 log_info("Journal file from other machine, rotating.");
481 else if (r == -EBUSY)
482 log_info("Unlcean shutdown, rotating.");
483 else
484 log_warning("Journal file corrupted, rotating.");
485
486 server_rotate(s);
487 server_vacuum(s);
488 vacuumed = true;
489
490 f = find_journal(s, uid);
491 if (!f)
492 return;
493
494 log_info("Retrying write.");
495 }
496 }
497
498 static 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
506 char *pid = NULL, *uid = NULL, *gid = NULL,
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
559 r = get_process_cmdline(ucred->pid, LINE_MAX, 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 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, realuid == 0 ? 0 : loginuid, iovec, n);
663
664 free(pid);
665 free(uid);
666 free(gid);
667 free(comm);
668 free(exe);
669 free(cmdline);
670 free(source_time);
671 free(boot_id);
672 free(machine_id);
673 free(hostname);
674 free(audit_session);
675 free(audit_loginuid);
676 free(cgroup);
677 free(session);
678 free(owner_uid);
679 free(unit);
680 free(selinux_context);
681 }
682
683 void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
684 char mid[11 + 32 + 1];
685 char buffer[16 + LINE_MAX + 1];
686 struct iovec iovec[N_IOVEC_META_FIELDS + 4];
687 int n = 0;
688 va_list ap;
689 struct ucred ucred;
690
691 assert(s);
692 assert(format);
693
694 IOVEC_SET_STRING(iovec[n++], "PRIORITY=6");
695 IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=driver");
696
697 memcpy(buffer, "MESSAGE=", 8);
698 va_start(ap, format);
699 vsnprintf(buffer + 8, sizeof(buffer) - 8, format, ap);
700 va_end(ap);
701 char_array_0(buffer);
702 IOVEC_SET_STRING(iovec[n++], buffer);
703
704 snprintf(mid, sizeof(mid), "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(message_id));
705 char_array_0(mid);
706 IOVEC_SET_STRING(iovec[n++], mid);
707
708 zero(ucred);
709 ucred.pid = getpid();
710 ucred.uid = getuid();
711 ucred.gid = getgid();
712
713 dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL);
714 }
715
716 void server_dispatch_message(
717 Server *s,
718 struct iovec *iovec, unsigned n, unsigned m,
719 struct ucred *ucred,
720 struct timeval *tv,
721 const char *label, size_t label_len,
722 const char *unit_id,
723 int priority) {
724
725 int rl;
726 char *path = NULL, *c;
727
728 assert(s);
729 assert(iovec || n == 0);
730
731 if (n == 0)
732 return;
733
734 if (LOG_PRI(priority) > s->max_level_store)
735 return;
736
737 if (!ucred)
738 goto finish;
739
740 path = shortened_cgroup_path(ucred->pid);
741 if (!path)
742 goto finish;
743
744 /* example: /user/lennart/3/foobar
745 * /system/dbus.service/foobar
746 *
747 * So let's cut of everything past the third /, since that is
748 * wher user directories start */
749
750 c = strchr(path, '/');
751 if (c) {
752 c = strchr(c+1, '/');
753 if (c) {
754 c = strchr(c+1, '/');
755 if (c)
756 *c = 0;
757 }
758 }
759
760 rl = journal_rate_limit_test(s->rate_limit, path, priority & LOG_PRIMASK, available_space(s));
761
762 if (rl == 0) {
763 free(path);
764 return;
765 }
766
767 /* Write a suppression message if we suppressed something */
768 if (rl > 1)
769 server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED, "Suppressed %u messages from %s", rl - 1, path);
770
771 free(path);
772
773 finish:
774 dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id);
775 }
776
777
778 static int system_journal_open(Server *s) {
779 int r;
780 char *fn;
781 sd_id128_t machine;
782 char ids[33];
783
784 r = sd_id128_get_machine(&machine);
785 if (r < 0)
786 return r;
787
788 sd_id128_to_string(machine, ids);
789
790 if (!s->system_journal &&
791 (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
792 access("/run/systemd/journal/flushed", F_OK) >= 0) {
793
794 /* If in auto mode: first try to create the machine
795 * path, but not the prefix.
796 *
797 * If in persistent mode: create /var/log/journal and
798 * the machine path */
799
800 if (s->storage == STORAGE_PERSISTENT)
801 (void) mkdir("/var/log/journal/", 0755);
802
803 fn = strappend("/var/log/journal/", ids);
804 if (!fn)
805 return -ENOMEM;
806
807 (void) mkdir(fn, 0755);
808 free(fn);
809
810 fn = strjoin("/var/log/journal/", ids, "/system.journal", NULL);
811 if (!fn)
812 return -ENOMEM;
813
814 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, s->seal, &s->system_metrics, s->mmap, NULL, &s->system_journal);
815 free(fn);
816
817 if (r >= 0)
818 server_fix_perms(s, s->system_journal, 0);
819 else if (r < 0) {
820
821 if (r != -ENOENT && r != -EROFS)
822 log_warning("Failed to open system journal: %s", strerror(-r));
823
824 r = 0;
825 }
826 }
827
828 if (!s->runtime_journal &&
829 (s->storage != STORAGE_NONE)) {
830
831 fn = strjoin("/run/log/journal/", ids, "/system.journal", NULL);
832 if (!fn)
833 return -ENOMEM;
834
835 if (s->system_journal) {
836
837 /* Try to open the runtime journal, but only
838 * if it already exists, so that we can flush
839 * it into the system journal */
840
841 r = journal_file_open(fn, O_RDWR, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
842 free(fn);
843
844 if (r < 0) {
845 if (r != -ENOENT)
846 log_warning("Failed to open runtime journal: %s", strerror(-r));
847
848 r = 0;
849 }
850
851 } else {
852
853 /* OK, we really need the runtime journal, so create
854 * it if necessary. */
855
856 (void) mkdir_parents(fn, 0755);
857 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, s->compress, false, &s->runtime_metrics, s->mmap, NULL, &s->runtime_journal);
858 free(fn);
859
860 if (r < 0) {
861 log_error("Failed to open runtime journal: %s", strerror(-r));
862 return r;
863 }
864 }
865
866 if (s->runtime_journal)
867 server_fix_perms(s, s->runtime_journal, 0);
868 }
869
870 return r;
871 }
872
873 static int server_flush_to_var(Server *s) {
874 Object *o = NULL;
875 int r;
876 sd_id128_t machine;
877 sd_journal *j;
878
879 assert(s);
880
881 if (s->storage != STORAGE_AUTO &&
882 s->storage != STORAGE_PERSISTENT)
883 return 0;
884
885 if (!s->runtime_journal)
886 return 0;
887
888 system_journal_open(s);
889
890 if (!s->system_journal)
891 return 0;
892
893 log_info("Flushing to /var...");
894
895 r = sd_id128_get_machine(&machine);
896 if (r < 0) {
897 log_error("Failed to get machine id: %s", strerror(-r));
898 return r;
899 }
900
901 r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
902 if (r < 0) {
903 log_error("Failed to read runtime journal: %s", strerror(-r));
904 return r;
905 }
906
907 SD_JOURNAL_FOREACH(j) {
908 JournalFile *f;
909
910 f = j->current_file;
911 assert(f && f->current_offset > 0);
912
913 r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
914 if (r < 0) {
915 log_error("Can't read entry: %s", strerror(-r));
916 goto finish;
917 }
918
919 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
920 if (r == -E2BIG) {
921 log_info("Allocation limit reached.");
922
923 journal_file_post_change(s->system_journal);
924 server_rotate(s);
925 server_vacuum(s);
926
927 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
928 }
929
930 if (r < 0) {
931 log_error("Can't write entry: %s", strerror(-r));
932 goto finish;
933 }
934 }
935
936 finish:
937 journal_file_post_change(s->system_journal);
938
939 journal_file_close(s->runtime_journal);
940 s->runtime_journal = NULL;
941
942 if (r >= 0)
943 rm_rf("/run/log/journal", false, true, false);
944
945 return r;
946 }
947
948 static int process_event(Server *s, struct epoll_event *ev) {
949 assert(s);
950 assert(ev);
951
952 if (ev->data.fd == s->signal_fd) {
953 struct signalfd_siginfo sfsi;
954 ssize_t n;
955
956 if (ev->events != EPOLLIN) {
957 log_info("Got invalid event from epoll.");
958 return -EIO;
959 }
960
961 n = read(s->signal_fd, &sfsi, sizeof(sfsi));
962 if (n != sizeof(sfsi)) {
963
964 if (n >= 0)
965 return -EIO;
966
967 if (errno == EINTR || errno == EAGAIN)
968 return 1;
969
970 return -errno;
971 }
972
973 log_info("Received SIG%s", signal_to_string(sfsi.ssi_signo));
974
975 if (sfsi.ssi_signo == SIGUSR1) {
976 touch("/run/systemd/journal/flushed");
977 server_flush_to_var(s);
978 return 1;
979 }
980
981 if (sfsi.ssi_signo == SIGUSR2) {
982 server_rotate(s);
983 server_vacuum(s);
984 return 1;
985 }
986
987 return 0;
988
989 } else if (ev->data.fd == s->dev_kmsg_fd) {
990 int r;
991
992 if (ev->events != EPOLLIN) {
993 log_info("Got invalid event from epoll.");
994 return -EIO;
995 }
996
997 r = server_read_dev_kmsg(s);
998 if (r < 0)
999 return r;
1000
1001 return 1;
1002
1003 } else if (ev->data.fd == s->native_fd ||
1004 ev->data.fd == s->syslog_fd) {
1005
1006 if (ev->events != EPOLLIN) {
1007 log_info("Got invalid event from epoll.");
1008 return -EIO;
1009 }
1010
1011 for (;;) {
1012 struct msghdr msghdr;
1013 struct iovec iovec;
1014 struct ucred *ucred = NULL;
1015 struct timeval *tv = NULL;
1016 struct cmsghdr *cmsg;
1017 char *label = NULL;
1018 size_t label_len = 0;
1019 union {
1020 struct cmsghdr cmsghdr;
1021
1022 /* We use NAME_MAX space for the
1023 * SELinux label here. The kernel
1024 * currently enforces no limit, but
1025 * according to suggestions from the
1026 * SELinux people this will change and
1027 * it will probably be identical to
1028 * NAME_MAX. For now we use that, but
1029 * this should be updated one day when
1030 * the final limit is known.*/
1031 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
1032 CMSG_SPACE(sizeof(struct timeval)) +
1033 CMSG_SPACE(sizeof(int)) + /* fd */
1034 CMSG_SPACE(NAME_MAX)]; /* selinux label */
1035 } control;
1036 ssize_t n;
1037 int v;
1038 int *fds = NULL;
1039 unsigned n_fds = 0;
1040
1041 if (ioctl(ev->data.fd, SIOCINQ, &v) < 0) {
1042 log_error("SIOCINQ failed: %m");
1043 return -errno;
1044 }
1045
1046 if (s->buffer_size < (size_t) v) {
1047 void *b;
1048 size_t l;
1049
1050 l = MAX(LINE_MAX + (size_t) v, s->buffer_size * 2);
1051 b = realloc(s->buffer, l+1);
1052
1053 if (!b) {
1054 log_error("Couldn't increase buffer.");
1055 return -ENOMEM;
1056 }
1057
1058 s->buffer_size = l;
1059 s->buffer = b;
1060 }
1061
1062 zero(iovec);
1063 iovec.iov_base = s->buffer;
1064 iovec.iov_len = s->buffer_size;
1065
1066 zero(control);
1067 zero(msghdr);
1068 msghdr.msg_iov = &iovec;
1069 msghdr.msg_iovlen = 1;
1070 msghdr.msg_control = &control;
1071 msghdr.msg_controllen = sizeof(control);
1072
1073 n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
1074 if (n < 0) {
1075
1076 if (errno == EINTR || errno == EAGAIN)
1077 return 1;
1078
1079 log_error("recvmsg() failed: %m");
1080 return -errno;
1081 }
1082
1083 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
1084
1085 if (cmsg->cmsg_level == SOL_SOCKET &&
1086 cmsg->cmsg_type == SCM_CREDENTIALS &&
1087 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
1088 ucred = (struct ucred*) CMSG_DATA(cmsg);
1089 else if (cmsg->cmsg_level == SOL_SOCKET &&
1090 cmsg->cmsg_type == SCM_SECURITY) {
1091 label = (char*) CMSG_DATA(cmsg);
1092 label_len = cmsg->cmsg_len - CMSG_LEN(0);
1093 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1094 cmsg->cmsg_type == SO_TIMESTAMP &&
1095 cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
1096 tv = (struct timeval*) CMSG_DATA(cmsg);
1097 else if (cmsg->cmsg_level == SOL_SOCKET &&
1098 cmsg->cmsg_type == SCM_RIGHTS) {
1099 fds = (int*) CMSG_DATA(cmsg);
1100 n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
1101 }
1102 }
1103
1104 if (ev->data.fd == s->syslog_fd) {
1105 char *e;
1106
1107 if (n > 0 && n_fds == 0) {
1108 e = memchr(s->buffer, '\n', n);
1109 if (e)
1110 *e = 0;
1111 else
1112 s->buffer[n] = 0;
1113
1114 server_process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
1115 } else if (n_fds > 0)
1116 log_warning("Got file descriptors via syslog socket. Ignoring.");
1117
1118 } else {
1119 if (n > 0 && n_fds == 0)
1120 server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
1121 else if (n == 0 && n_fds == 1)
1122 server_process_native_file(s, fds[0], ucred, tv, label, label_len);
1123 else if (n_fds > 0)
1124 log_warning("Got too many file descriptors via native socket. Ignoring.");
1125 }
1126
1127 close_many(fds, n_fds);
1128 }
1129
1130 return 1;
1131
1132 } else if (ev->data.fd == s->stdout_fd) {
1133
1134 if (ev->events != EPOLLIN) {
1135 log_info("Got invalid event from epoll.");
1136 return -EIO;
1137 }
1138
1139 stdout_stream_new(s);
1140 return 1;
1141
1142 } else {
1143 StdoutStream *stream;
1144
1145 if ((ev->events|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) {
1146 log_info("Got invalid event from epoll.");
1147 return -EIO;
1148 }
1149
1150 /* If it is none of the well-known fds, it must be an
1151 * stdout stream fd. Note that this is a bit ugly here
1152 * (since we rely that none of the well-known fds
1153 * could be interpreted as pointer), but nonetheless
1154 * safe, since the well-known fds would never get an
1155 * fd > 4096, i.e. beyond the first memory page */
1156
1157 stream = ev->data.ptr;
1158
1159 if (stdout_stream_process(stream) <= 0)
1160 stdout_stream_free(stream);
1161
1162 return 1;
1163 }
1164
1165 log_error("Unknown event.");
1166 return 0;
1167 }
1168
1169 static int open_signalfd(Server *s) {
1170 sigset_t mask;
1171 struct epoll_event ev;
1172
1173 assert(s);
1174
1175 assert_se(sigemptyset(&mask) == 0);
1176 sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1);
1177 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
1178
1179 s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
1180 if (s->signal_fd < 0) {
1181 log_error("signalfd(): %m");
1182 return -errno;
1183 }
1184
1185 zero(ev);
1186 ev.events = EPOLLIN;
1187 ev.data.fd = s->signal_fd;
1188
1189 if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->signal_fd, &ev) < 0) {
1190 log_error("epoll_ctl(): %m");
1191 return -errno;
1192 }
1193
1194 return 0;
1195 }
1196
1197 static int server_parse_proc_cmdline(Server *s) {
1198 char *line, *w, *state;
1199 int r;
1200 size_t l;
1201
1202 if (detect_container(NULL) > 0)
1203 return 0;
1204
1205 r = read_one_line_file("/proc/cmdline", &line);
1206 if (r < 0) {
1207 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
1208 return 0;
1209 }
1210
1211 FOREACH_WORD_QUOTED(w, l, line, state) {
1212 char *word;
1213
1214 word = strndup(w, l);
1215 if (!word) {
1216 r = -ENOMEM;
1217 goto finish;
1218 }
1219
1220 if (startswith(word, "systemd.journald.forward_to_syslog=")) {
1221 r = parse_boolean(word + 35);
1222 if (r < 0)
1223 log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
1224 else
1225 s->forward_to_syslog = r;
1226 } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
1227 r = parse_boolean(word + 33);
1228 if (r < 0)
1229 log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
1230 else
1231 s->forward_to_kmsg = r;
1232 } else if (startswith(word, "systemd.journald.forward_to_console=")) {
1233 r = parse_boolean(word + 36);
1234 if (r < 0)
1235 log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
1236 else
1237 s->forward_to_console = r;
1238 } else if (startswith(word, "systemd.journald"))
1239 log_warning("Invalid systemd.journald parameter. Ignoring.");
1240
1241 free(word);
1242 }
1243
1244 r = 0;
1245
1246 finish:
1247 free(line);
1248 return r;
1249 }
1250
1251 static int server_parse_config_file(Server *s) {
1252 FILE *f;
1253 const char *fn;
1254 int r;
1255
1256 assert(s);
1257
1258 fn = "/etc/systemd/journald.conf";
1259 f = fopen(fn, "re");
1260 if (!f) {
1261 if (errno == ENOENT)
1262 return 0;
1263
1264 log_warning("Failed to open configuration file %s: %m", fn);
1265 return -errno;
1266 }
1267
1268 r = config_parse(fn, f, "Journal\0", config_item_perf_lookup, (void*) journald_gperf_lookup, false, s);
1269 if (r < 0)
1270 log_warning("Failed to parse configuration file: %s", strerror(-r));
1271
1272 fclose(f);
1273
1274 return r;
1275 }
1276
1277 static int server_init(Server *s) {
1278 int n, r, fd;
1279
1280 assert(s);
1281
1282 zero(*s);
1283 s->syslog_fd = s->native_fd = s->stdout_fd = s->signal_fd = s->epoll_fd = s->dev_kmsg_fd = -1;
1284 s->compress = true;
1285 s->seal = true;
1286
1287 s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
1288 s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
1289
1290 s->forward_to_syslog = true;
1291
1292 s->max_level_store = LOG_DEBUG;
1293 s->max_level_syslog = LOG_DEBUG;
1294 s->max_level_kmsg = LOG_NOTICE;
1295 s->max_level_console = LOG_INFO;
1296
1297 memset(&s->system_metrics, 0xFF, sizeof(s->system_metrics));
1298 memset(&s->runtime_metrics, 0xFF, sizeof(s->runtime_metrics));
1299
1300 server_parse_config_file(s);
1301 server_parse_proc_cmdline(s);
1302
1303 mkdir_p("/run/systemd/journal", 0755);
1304
1305 s->user_journals = hashmap_new(trivial_hash_func, trivial_compare_func);
1306 if (!s->user_journals)
1307 return log_oom();
1308
1309 s->mmap = mmap_cache_new();
1310 if (!s->mmap)
1311 return log_oom();
1312
1313 s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
1314 if (s->epoll_fd < 0) {
1315 log_error("Failed to create epoll object: %m");
1316 return -errno;
1317 }
1318
1319 n = sd_listen_fds(true);
1320 if (n < 0) {
1321 log_error("Failed to read listening file descriptors from environment: %s", strerror(-n));
1322 return n;
1323 }
1324
1325 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
1326
1327 if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
1328
1329 if (s->native_fd >= 0) {
1330 log_error("Too many native sockets passed.");
1331 return -EINVAL;
1332 }
1333
1334 s->native_fd = fd;
1335
1336 } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
1337
1338 if (s->stdout_fd >= 0) {
1339 log_error("Too many stdout sockets passed.");
1340 return -EINVAL;
1341 }
1342
1343 s->stdout_fd = fd;
1344
1345 } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0) {
1346
1347 if (s->syslog_fd >= 0) {
1348 log_error("Too many /dev/log sockets passed.");
1349 return -EINVAL;
1350 }
1351
1352 s->syslog_fd = fd;
1353
1354 } else {
1355 log_error("Unknown socket passed.");
1356 return -EINVAL;
1357 }
1358 }
1359
1360 r = server_open_syslog_socket(s);
1361 if (r < 0)
1362 return r;
1363
1364 r = server_open_native_socket(s);
1365 if (r < 0)
1366 return r;
1367
1368 r = server_open_stdout_socket(s);
1369 if (r < 0)
1370 return r;
1371
1372 r = server_open_dev_kmsg(s);
1373 if (r < 0)
1374 return r;
1375
1376 r = server_open_kernel_seqnum(s);
1377 if (r < 0)
1378 return r;
1379
1380 r = open_signalfd(s);
1381 if (r < 0)
1382 return r;
1383
1384 s->udev = udev_new();
1385 if (!s->udev)
1386 return -ENOMEM;
1387
1388 s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst);
1389 if (!s->rate_limit)
1390 return -ENOMEM;
1391
1392 r = system_journal_open(s);
1393 if (r < 0)
1394 return r;
1395
1396 return 0;
1397 }
1398
1399 static void server_maybe_append_tags(Server *s) {
1400 #ifdef HAVE_GCRYPT
1401 JournalFile *f;
1402 Iterator i;
1403 usec_t n;
1404
1405 n = now(CLOCK_REALTIME);
1406
1407 if (s->system_journal)
1408 journal_file_maybe_append_tag(s->system_journal, n);
1409
1410 HASHMAP_FOREACH(f, s->user_journals, i)
1411 journal_file_maybe_append_tag(f, n);
1412 #endif
1413 }
1414
1415 static void server_done(Server *s) {
1416 JournalFile *f;
1417 assert(s);
1418
1419 while (s->stdout_streams)
1420 stdout_stream_free(s->stdout_streams);
1421
1422 if (s->system_journal)
1423 journal_file_close(s->system_journal);
1424
1425 if (s->runtime_journal)
1426 journal_file_close(s->runtime_journal);
1427
1428 while ((f = hashmap_steal_first(s->user_journals)))
1429 journal_file_close(f);
1430
1431 hashmap_free(s->user_journals);
1432
1433 if (s->epoll_fd >= 0)
1434 close_nointr_nofail(s->epoll_fd);
1435
1436 if (s->signal_fd >= 0)
1437 close_nointr_nofail(s->signal_fd);
1438
1439 if (s->syslog_fd >= 0)
1440 close_nointr_nofail(s->syslog_fd);
1441
1442 if (s->native_fd >= 0)
1443 close_nointr_nofail(s->native_fd);
1444
1445 if (s->stdout_fd >= 0)
1446 close_nointr_nofail(s->stdout_fd);
1447
1448 if (s->dev_kmsg_fd >= 0)
1449 close_nointr_nofail(s->dev_kmsg_fd);
1450
1451 if (s->rate_limit)
1452 journal_rate_limit_free(s->rate_limit);
1453
1454 if (s->kernel_seqnum)
1455 munmap(s->kernel_seqnum, sizeof(uint64_t));
1456
1457 free(s->buffer);
1458 free(s->tty_path);
1459
1460 if (s->mmap)
1461 mmap_cache_unref(s->mmap);
1462
1463 if (s->udev)
1464 udev_unref(s->udev);
1465 }
1466
1467 int main(int argc, char *argv[]) {
1468 Server server;
1469 int r;
1470
1471 /* if (getppid() != 1) { */
1472 /* log_error("This program should be invoked by init only."); */
1473 /* return EXIT_FAILURE; */
1474 /* } */
1475
1476 if (argc > 1) {
1477 log_error("This program does not take arguments.");
1478 return EXIT_FAILURE;
1479 }
1480
1481 log_set_target(LOG_TARGET_SAFE);
1482 log_set_facility(LOG_SYSLOG);
1483 log_set_max_level(LOG_DEBUG);
1484 log_parse_environment();
1485 log_open();
1486
1487 umask(0022);
1488
1489 r = server_init(&server);
1490 if (r < 0)
1491 goto finish;
1492
1493 server_vacuum(&server);
1494 server_flush_to_var(&server);
1495 server_flush_dev_kmsg(&server);
1496
1497 log_debug("systemd-journald running as pid %lu", (unsigned long) getpid());
1498 server_driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
1499
1500 sd_notify(false,
1501 "READY=1\n"
1502 "STATUS=Processing requests...");
1503
1504 for (;;) {
1505 struct epoll_event event;
1506 int t;
1507
1508 #ifdef HAVE_GCRYPT
1509 usec_t u;
1510
1511 if (server.system_journal &&
1512 journal_file_next_evolve_usec(server.system_journal, &u)) {
1513 usec_t n;
1514
1515 n = now(CLOCK_REALTIME);
1516
1517 if (n >= u)
1518 t = 0;
1519 else
1520 t = (int) ((u - n + USEC_PER_MSEC - 1) / USEC_PER_MSEC);
1521 } else
1522 #endif
1523 t = -1;
1524
1525 r = epoll_wait(server.epoll_fd, &event, 1, t);
1526 if (r < 0) {
1527
1528 if (errno == EINTR)
1529 continue;
1530
1531 log_error("epoll_wait() failed: %m");
1532 r = -errno;
1533 goto finish;
1534 }
1535
1536 if (r > 0) {
1537 r = process_event(&server, &event);
1538 if (r < 0)
1539 goto finish;
1540 else if (r == 0)
1541 break;
1542 }
1543
1544 server_maybe_append_tags(&server);
1545 }
1546
1547 log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
1548 server_driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
1549
1550 finish:
1551 sd_notify(false,
1552 "STATUS=Shutting down...");
1553
1554 server_done(&server);
1555
1556 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
1557 }