aboutsummaryrefslogtreecommitdiff
path: root/syslogd/main.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-08-15 23:50:41 +0200
committerDavid Oberhollenzer <david.oberhollenzer@tele2.at>2018-08-16 13:31:13 +0200
commit4311b9a2f14ee411ec3dc8b050f8efa25afa0bc5 (patch)
tree793c473392fc7cfd7915e6fc8a5aee5a121d5926 /syslogd/main.c
parent0624f95de639a41e8a47c264cdb7387a386a4dcd (diff)
usyslogd: create abstraction for log stream management
This commit seperates the formating and printing of log messages to files more cleanly from the message pump that retrieves the log messages. At a later point, other backends could be added more easiyl (e.g. forward the log message to some server). Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'syslogd/main.c')
-rw-r--r--syslogd/main.c126
1 files changed, 4 insertions, 122 deletions
diff --git a/syslogd/main.c b/syslogd/main.c
index b98c414..8f11906 100644
--- a/syslogd/main.c
+++ b/syslogd/main.c
@@ -25,75 +25,16 @@
#include <errno.h>
#include <stdio.h>
-#include "logfile.h"
+#include "backend.h"
#include "proto.h"
#include "util.h"
#define SYSLOG_SOCKET "/dev/log"
-#define SYSLOG_PATH "/var/log"
static volatile sig_atomic_t syslog_run = 1;
-static logfile_t *logfiles = NULL;
-
-static const enum_map_t facilities[] = {
- { "kernel.log", 0 },
- { "user.log", 1 },
- { "mail.log", 2 },
- { "daemon.log", 3 },
- { "auth.log", 4 },
- { "syslog.log", 5 },
- { "lpr.log", 6 },
- { "news.log", 7 },
- { "uucp.log", 8 },
- { "clock.log", 9 },
- { "authpriv.log", 10 },
- { "ftp.log", 11 },
- { "ntp.log", 12 },
- { "audit.log", 13 },
- { "alert.log", 14 },
- { "cron.log", 15 },
- { "local0.log", 16 },
- { "local1.log", 17 },
- { "local2.log", 18 },
- { "local3.log", 19 },
- { "local4.log", 20 },
- { "local5.log", 21 },
- { "local6.log", 22 },
- { "local7.log", 23 },
- { NULL, 0 },
-};
-
-static const enum_map_t levels[] = {
- { "emergency", 0 },
- { "alert", 1 },
- { "critical", 2 },
- { "error", 3 },
- { "warning", 4 },
- { "notice", 5 },
- { "info", 6 },
- { "debug", 7 },
- { NULL, 0 },
-};
-
-
-static int directory_setup(void)
-{
- if (mkdir(SYSLOG_PATH, 0755)) {
- if (errno != EEXIST) {
- perror("mkdir " SYSLOG_PATH);
- return -1;
- }
- }
-
- if (chdir(SYSLOG_PATH)) {
- perror("cd " SYSLOG_PATH);
- return -1;
- }
- return 0;
-}
static void sighandler(int signo)
{
@@ -118,59 +59,6 @@ static void signal_setup(void)
sigaction(SIGTERM, &act, NULL);
}
-static int print_to_log(const syslog_msg_t *msg)
-{
- const char *fac_name, *lvl_str;
- char timebuf[32], *filename;
- logfile_t *log;
- struct tm tm;
- size_t len;
-
- fac_name = enum_to_name(facilities, msg->facility);
- if (fac_name == NULL)
- return -1;
-
- lvl_str = enum_to_name(levels, msg->level);
- if (lvl_str == NULL)
- return -1;
-
- if (msg->ident) {
- len = strlen(msg->ident) + 1 + strlen(fac_name) + 1;
- filename = alloca(len);
- sprintf(filename, "%s/%s", msg->ident, fac_name);
- } else {
- filename = (char *)fac_name;
- }
-
- for (log = logfiles; log != NULL; log = log->next) {
- if (log->facility != msg->facility)
- continue;
- if (strcmp(filename, log->filename) == 0)
- break;
- }
-
- if (log == NULL) {
- if (msg->ident != NULL && mkdir(msg->ident, 0750) != 0 &&
- errno != EEXIST) {
- perror(msg->ident);
- return -1;
- }
-
- log = logfile_create(filename, msg->facility);
- if (log == NULL)
- return -1;
- log->next = logfiles;
- logfiles = log;
- }
-
- gmtime_r(&msg->timestamp, &tm);
- strftime(timebuf, sizeof(timebuf), "%FT%T", &tm);
-
- logfile_write(log, "[%s][%s][%u] %s", timebuf, lvl_str, msg->pid,
- msg->message);
- return 0;
-}
-
static int handle_data(int fd)
{
char buffer[2048];
@@ -186,13 +74,12 @@ static int handle_data(int fd)
if (syslog_msg_parse(&msg, buffer))
return -1;
- return print_to_log(&msg);
+ return logmgr->write(logmgr, &msg);
}
int main(void)
{
int sfd, status = EXIT_FAILURE;
- logfile_t *log;
signal_setup();
@@ -200,7 +87,7 @@ int main(void)
if (sfd < 0)
return EXIT_FAILURE;
- if (directory_setup())
+ if (logmgr->init(logmgr))
goto out;
while (syslog_run) {
@@ -209,12 +96,7 @@ int main(void)
status = EXIT_SUCCESS;
out:
- while (logfiles != NULL) {
- log = logfiles;
- logfiles = logfiles->next;
-
- logfile_destroy(log);
- }
+ logmgr->cleanup(logmgr);
if (sfd > 0)
close(sfd);
unlink(SYSLOG_SOCKET);