]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald.c
nspawn: make rootfs relative to oci bundle path
[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"
dccca82b 13#include "process-util.h"
fa6ac760
LP
14#include "sigbus.h"
15
87d2c1ff 16int main(int argc, char *argv[]) {
b1852c48 17 const char *namespace;
87d2c1ff
LP
18 Server server;
19 int r;
20
b1852c48
LP
21 if (argc > 2) {
22 log_error("This program takes one or no arguments.");
87d2c1ff
LP
23 return EXIT_FAILURE;
24 }
25
b1852c48
LP
26 namespace = argc > 1 ? empty_to_null(argv[1]) : NULL;
27
6c347d50
LP
28 log_set_prohibit_ipc(true);
29 log_set_target(LOG_TARGET_AUTO);
3eff4208 30 log_set_facility(LOG_SYSLOG);
87d2c1ff
LP
31 log_parse_environment();
32 log_open();
33
34 umask(0022);
35
fa6ac760
LP
36 sigbus_install();
37
b1852c48 38 r = server_init(&server, namespace);
87d2c1ff
LP
39 if (r < 0)
40 goto finish;
41
3a19f215 42 server_vacuum(&server, false);
f78273c8 43 server_flush_to_var(&server, true);
51abe64c 44 server_flush_dev_kmsg(&server);
e6960940 45
b1852c48 46 if (server.namespace)
4c1dea42 47 log_debug("systemd-journald running as PID "PID_FMT" for namespace '%s'.", getpid_cached(), server.namespace);
b1852c48
LP
48 else
49 log_debug("systemd-journald running as PID "PID_FMT" for the system.", getpid_cached());
50
13181942 51 server_driver_message(&server, 0,
2b044526 52 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR,
8a03c9ef
ZJS
53 LOG_MESSAGE("Journal started"),
54 NULL);
87d2c1ff 55
18e758bf
FB
56 /* Make sure to send the usage message *after* flushing the
57 * journal so entries from the runtime journals are ordered
58 * before this message. See #4190 for some details. */
59 server_space_usage_message(&server, NULL);
60
87d2c1ff 61 for (;;) {
3a43da28 62 usec_t t = USEC_INFINITY, n;
87d2c1ff 63
565a9388 64 r = sd_event_get_state(server.event);
24352691
LP
65 if (r < 0) {
66 log_error_errno(r, "Failed to get event loop state: %m");
565a9388 67 goto finish;
24352691 68 }
565a9388
LP
69 if (r == SD_EVENT_FINISHED)
70 break;
71
fb0951b0 72 n = now(CLOCK_REALTIME);
89fef990 73
fb0951b0 74 if (server.max_retention_usec > 0 && server.oldest_file_usec > 0) {
89fef990 75
fb0951b0
LP
76 /* The retention time is reached, so let's vacuum! */
77 if (server.oldest_file_usec + server.max_retention_usec < n) {
78 log_info("Retention time reached.");
79 server_rotate(&server);
3a19f215 80 server_vacuum(&server, false);
fb0951b0
LP
81 continue;
82 }
89fef990 83
fb0951b0 84 /* Calculate when to rotate the next time */
f9a810be 85 t = server.oldest_file_usec + server.max_retention_usec - n;
fb0951b0
LP
86 }
87
349cc4a5 88#if HAVE_GCRYPT
fb0951b0
LP
89 if (server.system_journal) {
90 usec_t u;
91
92 if (journal_file_next_evolve_usec(server.system_journal, &u)) {
93 if (n >= u)
94 t = 0;
95 else
f9a810be 96 t = MIN(t, u - n);
fb0951b0
LP
97 }
98 }
89fef990 99#endif
89fef990 100
f9a810be 101 r = sd_event_run(server.event, t);
87d2c1ff 102 if (r < 0) {
da927ba9 103 log_error_errno(r, "Failed to run event loop: %m");
87d2c1ff 104 goto finish;
89fef990 105 }
87d2c1ff 106
99add6fd 107 server_maybe_append_tags(&server);
178cc770 108 server_maybe_warn_forward_syslog_missed(&server);
87d2c1ff
LP
109 }
110
b1852c48 111 if (server.namespace)
4c1dea42 112 log_debug("systemd-journald stopped as PID "PID_FMT" for namespace '%s'.", getpid_cached(), server.namespace);
b1852c48
LP
113 else
114 log_debug("systemd-journald stopped as PID "PID_FMT" for the system.", getpid_cached());
115
13181942 116 server_driver_message(&server, 0,
2b044526 117 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR,
8a03c9ef
ZJS
118 LOG_MESSAGE("Journal stopped"),
119 NULL);
fe652127 120
87d2c1ff 121finish:
87d2c1ff
LP
122 server_done(&server);
123
124 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
125}