diff options
-rw-r--r-- | Source/charon/logger.c | 141 | ||||
-rw-r--r-- | Source/charon/logger.h | 67 |
2 files changed, 208 insertions, 0 deletions
diff --git a/Source/charon/logger.c b/Source/charon/logger.c new file mode 100644 index 000000000..f199b01d1 --- /dev/null +++ b/Source/charon/logger.c @@ -0,0 +1,141 @@ +/** + * @file logger.c + * + * @brief Logger object, allows fine-controlled logging + * + */ + +/* + * Copyright (C) 2005 Jan Hutter, Martin Willi + * Hochschule fuer Technik Rapperswil + * + * 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 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * 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. + */ + + + +#include "logger.h" +#include "types.h" +#include "allocator.h" + +#include <syslog.h> +#include <stdarg.h> + + + +/** + * @brief The logger object + */ +typedef struct private_logger_s private_logger_t; +struct private_logger_s { + /** + * Public data + */ + logger_t public; + /** + * fd to log, NULL for syslog + */ + FILE *target; + /** + * detail-level of logger + */ + logger_level_t level; + /** + * name of logger + */ + char *name; +}; + + + +static status_t logg(private_logger_t *this, logger_level_t loglevel, char *format, ...) +{ + if ((this->level & loglevel) == loglevel) + { + va_list args; + va_start(args, format); + + if (this->target) + { + fprintf(this->target, format, args); + fprintf(this->target, "\n"); + } + else + { + syslog(LOG_INFO, format, args); + } + va_end(args); + } + + + return SUCCESS; +} + +static status_t enable_level(private_logger_t *this, logger_level_t log_level) +{ + this->level |= log_level; + return SUCCESS; +} + +static status_t disable_level(private_logger_t *this, logger_level_t log_level) +{ + this->level &= (~log_level); + return SUCCESS; +} + +static status_t destroy(private_logger_t *this) +{ + if (this->target) + { + fclose(this->target); + } + allocator_free(this); + return SUCCESS; +} + + +logger_t *logger_create(char *logger_name, char *file, logger_level_t log_level) +{ + private_logger_t *this = allocator_alloc_thing(private_logger_t); + + if (this == NULL) + { + return NULL; + } + + this->public.log = (status_t(*)(logger_t*,logger_level_t,char*,...))logg; + this->public.enable_level = (status_t(*)(logger_t*,logger_level_t))enable_level; + this->public.disable_level = (status_t(*)(logger_t*,logger_level_t))disable_level; + this->public.destroy = (status_t(*)(logger_t*))destroy; + + this->level = log_level; + this->name = logger_name; + + /* use system logger ? */ + if (file) + { + this->target = fopen(file, "a"); + if (this->target == NULL) + { + allocator_free(this); + return NULL; + } + } + else + { + this->target = NULL; + openlog("charon", 0, LOG_DAEMON); + } + + return (logger_t*)this; +} + + diff --git a/Source/charon/logger.h b/Source/charon/logger.h new file mode 100644 index 000000000..5ab0990d2 --- /dev/null +++ b/Source/charon/logger.h @@ -0,0 +1,67 @@ +/** + * @file logger.h + * + * @brief Logger object, allows fine-controlled logging + * + */ + +/* + * Copyright (C) 2005 Jan Hutter, Martin Willi + * Hochschule fuer Technik Rapperswil + * + * 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 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * 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. + */ + +#ifndef LOGGER_H_ +#define LOGGER_H_ + +#include "types.h" + + +typedef enum logger_level_e logger_level_t; +enum logger_level_e { + CONTROL = 1, + CONTROL_MORE = 2, + RAW = 4, + PRIVATE = 8 +}; + + + + +/** + * @brief The logger object + */ +typedef struct logger_s logger_t; +struct logger_s { + status_t (*log) (logger_t *this, logger_level_t loglevel, char *format, ...); + + status_t (*enable_level) (logger_t *this, logger_level_t log_level); + + status_t (*disable_level) (logger_t *this, logger_level_t log_level); + + /** + * @brief Destroys a generator object + * + * @param generator generator object + * @return SUCCESSFUL if succeeded, FAILED otherwise + */ + status_t (*destroy) (logger_t *this); +}; + +/** + * Constructor to create a logger + * + */ +logger_t *logger_create(char *logger_name, char *file, logger_level_t log_level); + +#endif /*LOGGER_H_*/ + |