]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald.c
TODO: remove syslog broadcasting
[thirdparty/systemd.git] / src / journal / journald.c
CommitLineData
87d2c1ff
LP
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
5430f7f2
LP
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
87d2c1ff
LP
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
5430f7f2 16 Lesser General Public License for more details.
87d2c1ff 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
87d2c1ff
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
87d2c1ff 22#include <unistd.h>
87d2c1ff 23
8580d1f7 24#include "sd-daemon.h"
cf0fbc49 25#include "sd-messages.h"
81527be1 26
cf0fbc49 27#include "formats-util.h"
89fef990 28#include "journal-authenticate.h"
ef63833d 29#include "journald-kmsg.h"
cf0fbc49 30#include "journald-server.h"
35e2e347 31#include "journald-syslog.h"
fa6ac760
LP
32#include "sigbus.h"
33
87d2c1ff
LP
34int main(int argc, char *argv[]) {
35 Server server;
36 int r;
37
87d2c1ff
LP
38 if (argc > 1) {
39 log_error("This program does not take arguments.");
40 return EXIT_FAILURE;
41 }
42
a6903061 43 log_set_target(LOG_TARGET_SAFE);
3eff4208 44 log_set_facility(LOG_SYSLOG);
87d2c1ff
LP
45 log_parse_environment();
46 log_open();
47
48 umask(0022);
49
fa6ac760
LP
50 sigbus_install();
51
87d2c1ff
LP
52 r = server_init(&server);
53 if (r < 0)
54 goto finish;
55
8580d1f7 56 server_vacuum(&server, false, false);
e6960940 57 server_flush_to_var(&server);
51abe64c 58 server_flush_dev_kmsg(&server);
e6960940 59
de0671ee 60 log_debug("systemd-journald running as pid "PID_FMT, getpid());
ef63833d 61 server_driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
87d2c1ff 62
87d2c1ff 63 for (;;) {
3a43da28 64 usec_t t = USEC_INFINITY, n;
87d2c1ff 65
565a9388
LP
66 r = sd_event_get_state(server.event);
67 if (r < 0)
68 goto finish;
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);
8580d1f7 80 server_vacuum(&server, false, 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
88#ifdef HAVE_GCRYPT
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
de0671ee 111 log_debug("systemd-journald stopped as pid "PID_FMT, getpid());
ef63833d 112 server_driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
fe652127 113
87d2c1ff 114finish:
87d2c1ff
LP
115 server_done(&server);
116
117 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
118}