]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald.c
tree-wide: drop license boilerplate
[thirdparty/systemd.git] / src / journal / journald.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
87d2c1ff
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2011 Lennart Poettering
87d2c1ff
LP
6***/
7
87d2c1ff 8#include <unistd.h>
87d2c1ff 9
8580d1f7 10#include "sd-daemon.h"
cf0fbc49 11#include "sd-messages.h"
81527be1 12
f97b34a6 13#include "format-util.h"
89fef990 14#include "journal-authenticate.h"
ef63833d 15#include "journald-kmsg.h"
cf0fbc49 16#include "journald-server.h"
35e2e347 17#include "journald-syslog.h"
dccca82b 18#include "process-util.h"
fa6ac760
LP
19#include "sigbus.h"
20
87d2c1ff
LP
21int main(int argc, char *argv[]) {
22 Server server;
23 int r;
24
87d2c1ff
LP
25 if (argc > 1) {
26 log_error("This program does not take arguments.");
27 return EXIT_FAILURE;
28 }
29
6c347d50
LP
30 log_set_prohibit_ipc(true);
31 log_set_target(LOG_TARGET_AUTO);
3eff4208 32 log_set_facility(LOG_SYSLOG);
87d2c1ff
LP
33 log_parse_environment();
34 log_open();
35
36 umask(0022);
37
fa6ac760
LP
38 sigbus_install();
39
87d2c1ff
LP
40 r = server_init(&server);
41 if (r < 0)
42 goto finish;
43
3a19f215 44 server_vacuum(&server, false);
f78273c8 45 server_flush_to_var(&server, true);
51abe64c 46 server_flush_dev_kmsg(&server);
e6960940 47
df0ff127 48 log_debug("systemd-journald running as pid "PID_FMT, getpid_cached());
13181942 49 server_driver_message(&server, 0,
2b044526 50 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR,
8a03c9ef
ZJS
51 LOG_MESSAGE("Journal started"),
52 NULL);
87d2c1ff 53
18e758bf
FB
54 /* Make sure to send the usage message *after* flushing the
55 * journal so entries from the runtime journals are ordered
56 * before this message. See #4190 for some details. */
57 server_space_usage_message(&server, NULL);
58
87d2c1ff 59 for (;;) {
3a43da28 60 usec_t t = USEC_INFINITY, n;
87d2c1ff 61
565a9388
LP
62 r = sd_event_get_state(server.event);
63 if (r < 0)
64 goto finish;
65 if (r == SD_EVENT_FINISHED)
66 break;
67
fb0951b0 68 n = now(CLOCK_REALTIME);
89fef990 69
fb0951b0 70 if (server.max_retention_usec > 0 && server.oldest_file_usec > 0) {
89fef990 71
fb0951b0
LP
72 /* The retention time is reached, so let's vacuum! */
73 if (server.oldest_file_usec + server.max_retention_usec < n) {
74 log_info("Retention time reached.");
75 server_rotate(&server);
3a19f215 76 server_vacuum(&server, false);
fb0951b0
LP
77 continue;
78 }
89fef990 79
fb0951b0 80 /* Calculate when to rotate the next time */
f9a810be 81 t = server.oldest_file_usec + server.max_retention_usec - n;
fb0951b0
LP
82 }
83
349cc4a5 84#if HAVE_GCRYPT
fb0951b0
LP
85 if (server.system_journal) {
86 usec_t u;
87
88 if (journal_file_next_evolve_usec(server.system_journal, &u)) {
89 if (n >= u)
90 t = 0;
91 else
f9a810be 92 t = MIN(t, u - n);
fb0951b0
LP
93 }
94 }
89fef990 95#endif
89fef990 96
f9a810be 97 r = sd_event_run(server.event, t);
87d2c1ff 98 if (r < 0) {
da927ba9 99 log_error_errno(r, "Failed to run event loop: %m");
87d2c1ff 100 goto finish;
89fef990 101 }
87d2c1ff 102
99add6fd 103 server_maybe_append_tags(&server);
178cc770 104 server_maybe_warn_forward_syslog_missed(&server);
87d2c1ff
LP
105 }
106
df0ff127 107 log_debug("systemd-journald stopped as pid "PID_FMT, getpid_cached());
13181942 108 server_driver_message(&server, 0,
2b044526 109 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR,
8a03c9ef
ZJS
110 LOG_MESSAGE("Journal stopped"),
111 NULL);
fe652127 112
87d2c1ff 113finish:
87d2c1ff
LP
114 server_done(&server);
115
116 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
117}