journald.c revision d025f1e4dca8fc1436aff76f9e6185fe3e728daa
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt/***
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt This file is part of systemd.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Copyright 2011 Lennart Poettering
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is free software; you can redistribute it and/or modify it
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt under the terms of the GNU Lesser General Public License as published by
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt the Free Software Foundation; either version 2.1 of the License, or
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt (at your option) any later version.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is distributed in the hope that it will be useful, but
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt WITHOUT ANY WARRANTY; without even the implied warranty of
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Lesser General Public License for more details.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt You should have received a copy of the GNU Lesser General Public License
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt along with systemd; If not, see <http://www.gnu.org/licenses/>.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt***/
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include <sys/epoll.h>
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include <sys/socket.h>
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include <errno.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <unistd.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <systemd/sd-journal.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <systemd/sd-messages.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <systemd/sd-daemon.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "journal-authenticate.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "journald-server.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "journald-kmsg.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "journald-syslog.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktint main(int argc, char *argv[]) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt Server server;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt int r;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt /* if (getppid() != 1) { */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt /* log_error("This program should be invoked by init only."); */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt /* return EXIT_FAILURE; */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt /* } */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (argc > 1) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt log_error("This program does not take arguments.");
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt return EXIT_FAILURE;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt }
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt log_set_target(LOG_TARGET_SAFE);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt log_set_facility(LOG_SYSLOG);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt log_parse_environment();
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt log_open();
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt umask(0022);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt r = server_init(&server);
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt if (r < 0)
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt goto finish;
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt server_vacuum(&server);
server_flush_to_var(&server);
server_flush_dev_kmsg(&server);
log_debug("systemd-journald running as pid %lu", (unsigned long) getpid());
server_driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
sd_notify(false,
"READY=1\n"
"STATUS=Processing requests...");
for (;;) {
struct epoll_event event;
int t = -1;
usec_t n;
n = now(CLOCK_REALTIME);
if (server.max_retention_usec > 0 && server.oldest_file_usec > 0) {
/* The retention time is reached, so let's vacuum! */
if (server.oldest_file_usec + server.max_retention_usec < n) {
log_info("Retention time reached.");
server_rotate(&server);
server_vacuum(&server);
continue;
}
/* Calculate when to rotate the next time */
t = (int) ((server.oldest_file_usec + server.max_retention_usec - n + USEC_PER_MSEC - 1) / USEC_PER_MSEC);
log_info("Sleeping for %i ms", t);
}
#ifdef HAVE_GCRYPT
if (server.system_journal) {
usec_t u;
if (journal_file_next_evolve_usec(server.system_journal, &u)) {
if (n >= u)
t = 0;
else
t = MIN(t, (int) ((u - n + USEC_PER_MSEC - 1) / USEC_PER_MSEC));
}
}
#endif
r = epoll_wait(server.epoll_fd, &event, 1, t);
if (r < 0) {
if (errno == EINTR)
continue;
log_error("epoll_wait() failed: %m");
r = -errno;
goto finish;
}
if (r > 0) {
r = process_event(&server, &event);
if (r < 0)
goto finish;
else if (r == 0)
break;
}
server_maybe_append_tags(&server);
server_maybe_warn_forward_syslog_missed(&server);
}
log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
server_driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
finish:
sd_notify(false,
"STATUS=Shutting down...");
server_done(&server);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}