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