]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald.c
mkosi: do a sparse checkout of debian/ubuntu packaging repo
[thirdparty/systemd.git] / src / journal / journald.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
87d2c1ff 2
87d2c1ff 3#include <unistd.h>
87d2c1ff 4
8580d1f7 5#include "sd-daemon.h"
cf0fbc49 6#include "sd-messages.h"
81527be1 7
f97b34a6 8#include "format-util.h"
89fef990 9#include "journal-authenticate.h"
ef63833d 10#include "journald-kmsg.h"
cf0fbc49 11#include "journald-server.h"
35e2e347 12#include "journald-syslog.h"
80b1156b 13#include "main-func.h"
dccca82b 14#include "process-util.h"
fa6ac760 15#include "sigbus.h"
dd9c8da8 16#include "terminal-util.h"
fa6ac760 17
80b1156b
YW
18static int run(int argc, char *argv[]) {
19 _cleanup_(server_freep) Server *s = NULL;
b1852c48 20 const char *namespace;
b3d6eb01 21 LogTarget log_target;
87d2c1ff
LP
22 int r;
23
80b1156b
YW
24 if (argc > 2)
25 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes one or no arguments.");
87d2c1ff 26
b1852c48
LP
27 namespace = argc > 1 ? empty_to_null(argv[1]) : NULL;
28
3eff4208 29 log_set_facility(LOG_SYSLOG);
e68778a3
LP
30
31 if (namespace)
32 /* If we run for a log namespace, then we ourselves can log to the main journald. */
33 log_setup();
34 else {
35 /* So here's the deal if we run as the main journald: we can't be considered as regular
36 * daemon when it comes to logging hence LOG_TARGET_AUTO won't do the right thing for
37 * us. Hence explicitly log to the console if we're started from a console or to kmsg
38 * otherwise. */
dd9c8da8 39 log_target = isatty(STDERR_FILENO) ? LOG_TARGET_CONSOLE : LOG_TARGET_KMSG;
e68778a3
LP
40
41 log_set_prohibit_ipc(true); /* better safe than sorry */
42 log_set_target(log_target);
43 log_parse_environment();
44 log_open();
45 }
87d2c1ff
LP
46
47 umask(0022);
48
fa6ac760
LP
49 sigbus_install();
50
80b1156b
YW
51 r = server_new(&s);
52 if (r < 0)
53 return log_oom();
54
55 r = server_init(s, namespace);
87d2c1ff 56 if (r < 0)
80b1156b 57 return r;
87d2c1ff 58
6336c635
YW
59 server_vacuum(s, /* verbose = */ false);
60 server_flush_to_var(s, /* require_flag_file = */ true);
80b1156b 61 server_flush_dev_kmsg(s);
e6960940 62
80b1156b
YW
63 if (s->namespace)
64 log_debug("systemd-journald running as PID "PID_FMT" for namespace '%s'.", getpid_cached(), s->namespace);
b1852c48
LP
65 else
66 log_debug("systemd-journald running as PID "PID_FMT" for the system.", getpid_cached());
67
80b1156b 68 server_driver_message(s, 0,
2b044526 69 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR,
8a03c9ef
ZJS
70 LOG_MESSAGE("Journal started"),
71 NULL);
87d2c1ff 72
18e758bf
FB
73 /* Make sure to send the usage message *after* flushing the
74 * journal so entries from the runtime journals are ordered
75 * before this message. See #4190 for some details. */
80b1156b 76 server_space_usage_message(s, NULL);
18e758bf 77
87d2c1ff 78 for (;;) {
90c27eb4 79 usec_t t, n;
87d2c1ff 80
80b1156b
YW
81 r = sd_event_get_state(s->event);
82 if (r < 0)
83 return log_error_errno(r, "Failed to get event loop state: %m");
565a9388
LP
84 if (r == SD_EVENT_FINISHED)
85 break;
86
2ae16d36
YW
87 r = sd_event_now(s->event, CLOCK_REALTIME, &n);
88 if (r < 0)
89 return log_error_errno(r, "Failed to get the current time: %m");
89fef990 90
80b1156b 91 if (s->max_retention_usec > 0 && s->oldest_file_usec > 0) {
90c27eb4
YW
92 /* Calculate when to rotate the next time */
93 t = usec_sub_unsigned(usec_add(s->oldest_file_usec, s->max_retention_usec), n);
89fef990 94
fb0951b0 95 /* The retention time is reached, so let's vacuum! */
90c27eb4 96 if (t <= 0) {
b2b7cf1d 97 log_info("Retention time reached, rotating.");
80b1156b 98 server_rotate(s);
6336c635 99 server_vacuum(s, /* verbose = */ false);
fb0951b0
LP
100 continue;
101 }
90c27eb4
YW
102 } else
103 t = USEC_INFINITY;
fb0951b0 104
349cc4a5 105#if HAVE_GCRYPT
80b1156b 106 if (s->system_journal) {
fb0951b0
LP
107 usec_t u;
108
90c27eb4
YW
109 if (journal_file_next_evolve_usec(s->system_journal, &u))
110 t = MIN(t, usec_sub_unsigned(u, n));
fb0951b0 111 }
89fef990 112#endif
89fef990 113
80b1156b
YW
114 r = sd_event_run(s->event, t);
115 if (r < 0)
116 return log_error_errno(r, "Failed to run event loop: %m");
87d2c1ff 117
80b1156b
YW
118 server_maybe_append_tags(s);
119 server_maybe_warn_forward_syslog_missed(s);
87d2c1ff
LP
120 }
121
80b1156b
YW
122 if (s->namespace)
123 log_debug("systemd-journald stopped as PID "PID_FMT" for namespace '%s'.", getpid_cached(), s->namespace);
b1852c48
LP
124 else
125 log_debug("systemd-journald stopped as PID "PID_FMT" for the system.", getpid_cached());
126
80b1156b 127 server_driver_message(s, 0,
2b044526 128 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR,
8a03c9ef
ZJS
129 LOG_MESSAGE("Journal stopped"),
130 NULL);
fe652127 131
80b1156b 132 return 0;
87d2c1ff 133}
80b1156b
YW
134
135DEFINE_MAIN_FUNCTION(run);