diff options
author | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-10-28 13:41:35 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-11-03 19:26:00 +0100 |
commit | acd09007a12e4901aa5d221af18de9c42044d970 (patch) | |
tree | 8c739436d2993c9b67c4847a1e9e1147939c3e44 /syslogd/logfile.c | |
parent | d4ce928fc011700acefefd5472d0a5ef8c72e6c1 (diff) |
Remove usyslogd/klogd and syslog utility program
This is split out to a seperate package.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'syslogd/logfile.c')
-rw-r--r-- | syslogd/logfile.c | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/syslogd/logfile.c b/syslogd/logfile.c deleted file mode 100644 index 62e58f4..0000000 --- a/syslogd/logfile.c +++ /dev/null @@ -1,284 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * Copyright (C) 2018 - David Oberhollenzer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -#include <sys/types.h> -#include <sys/stat.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <fcntl.h> -#include <errno.h> - -#include "syslogd.h" -#include "util.h" - - -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 const enum_map_t facilities[] = { - { "kernel", 0 }, - { "user", 1 }, - { "mail", 2 }, - { "daemon", 3 }, - { "auth", 4 }, - { "syslog", 5 }, - { "lpr", 6 }, - { "news", 7 }, - { "uucp", 8 }, - { "clock", 9 }, - { "authpriv", 10 }, - { "ftp", 11 }, - { "ntp", 12 }, - { "audit", 13 }, - { "alert", 14 }, - { "cron", 15 }, - { "local0", 16 }, - { "local1", 17 }, - { "local2", 18 }, - { "local3", 19 }, - { "local4", 20 }, - { "local5", 21 }, - { "local6", 22 }, - { "local7", 23 }, - { NULL, 0 }, -}; - - -typedef struct logfile_t { - struct logfile_t *next; - size_t size; - int fd; - char filename[]; -} logfile_t; - - -typedef struct { - log_backend_t base; - logfile_t *list; - size_t maxsize; - int flags; -} log_backend_file_t; - - -static int logfile_open(logfile_t *file) -{ - struct stat sb; - - file->fd = open(file->filename, O_WRONLY | O_CREAT, 0640); - if (file->fd < 0) { - perror(file->filename); - return -1; - } - - if (lseek(file->fd, 0, SEEK_END)) - goto fail; - - if (fstat(file->fd, &sb)) - goto fail; - - file->size = sb.st_size; - return 0; -fail: - perror(file->filename); - close(file->fd); - file->fd = -1; - return -1; -} - -static logfile_t *logfile_create(const char *filename) -{ - logfile_t *file = calloc(1, sizeof(*file) + strlen(filename) + 1); - - if (file == NULL) { - perror("calloc"); - return NULL; - } - - strcpy(file->filename, filename); - - if (logfile_open(file)) { - free(file); - return NULL; - } - - return file; -} - -static int logfile_write(logfile_t *file, const syslog_msg_t *msg) -{ - const char *lvl_str, *fac_name; - char timebuf[32]; - struct tm tm; - int ret; - - if (file->fd < 0 && logfile_open(file) != 0) - return -1; - - lvl_str = enum_to_name(levels, msg->level); - if (lvl_str == NULL) - return -1; - - gmtime_r(&msg->timestamp, &tm); - strftime(timebuf, sizeof(timebuf), "%FT%T", &tm); - - if (msg->ident != NULL) { - fac_name = enum_to_name(facilities, msg->facility); - if (fac_name == NULL) - return -1; - - ret = dprintf(file->fd, "[%s][%s][%s][%u] %s\n", timebuf, - fac_name, lvl_str, msg->pid, msg->message); - } else { - ret = dprintf(file->fd, "[%s][%s][%u] %s\n", timebuf, lvl_str, - msg->pid, msg->message); - } - - fsync(file->fd); - - if (ret > 0) - file->size += ret; - return 0; -} - -static int logfile_rotate(logfile_t *f, int flags) -{ - char timebuf[32]; - char *filename; - struct tm tm; - time_t now; - - if (flags & LOG_ROTATE_OVERWRITE) { - strcpy(timebuf, "1"); - } else { - now = time(NULL); - gmtime_r(&now, &tm); - strftime(timebuf, sizeof(timebuf), "%FT%T", &tm); - } - - filename = alloca(strlen(f->filename) + strlen(timebuf) + 2); - sprintf(filename, "%s.%s", f->filename, timebuf); - - if (rename(f->filename, filename)) { - perror(filename); - return -1; - } - - close(f->fd); - logfile_open(f); - return 0; -} - -/*****************************************************************************/ - -static int file_backend_init(log_backend_t *backend, int flags, - size_t sizelimit) -{ - log_backend_file_t *log = (log_backend_file_t *)backend; - - log->flags = flags; - log->maxsize = sizelimit; - return 0; -} - -static void file_backend_cleanup(log_backend_t *backend) -{ - log_backend_file_t *log = (log_backend_file_t *)backend; - logfile_t *f; - - while (log->list != NULL) { - f = log->list; - log->list = f->next; - - close(f->fd); - free(f); - } -} - -static int file_backend_write(log_backend_t *backend, const syslog_msg_t *msg) -{ - log_backend_file_t *log = (log_backend_file_t *)backend; - const char *ident; - char *filename; - logfile_t *f; - size_t len; - - if (msg->ident != NULL) { - ident = msg->ident; - } else { - ident = enum_to_name(facilities, msg->facility); - if (ident == NULL) - return -1; - } - - len = strlen(ident) + strlen(".log") + 1; - filename = alloca(len); - strcpy(filename, ident); - strcat(filename, ".log"); - - for (f = log->list; f != NULL; f = f->next) { - if (strcmp(filename, f->filename) == 0) - break; - } - - if (f == NULL) { - f = logfile_create(filename); - if (f == NULL) - return -1; - f->next = log->list; - log->list = f; - } - - if (logfile_write(f, msg)) - return -1; - - if ((log->flags & LOG_ROTATE_SIZE_LIMIT) && f->size >= log->maxsize) - logfile_rotate(f, log->flags); - - return 0; -} - -static void file_backend_rotate(log_backend_t *backend) -{ - log_backend_file_t *log = (log_backend_file_t *)backend; - logfile_t *f; - - for (f = log->list; f != NULL; f = f->next) - logfile_rotate(f, log->flags); -} - -log_backend_file_t filebackend = { - .base = { - .init = file_backend_init, - .cleanup = file_backend_cleanup, - .write = file_backend_write, - .rotate = file_backend_rotate, - }, - .list = NULL, -}; - -log_backend_t *logmgr = (log_backend_t *)&filebackend; |