diff options
author | Martin Willi <martin@strongswan.org> | 2005-11-10 08:48:10 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2005-11-10 08:48:10 +0000 |
commit | 69dd95811f261a7d636f6d1f9b52081c94a2872f (patch) | |
tree | e32ea998bea5d90ba0122c4f71f4d1b85a155473 /Source/charon/logger.c | |
parent | 1061c878a9e342424e8204aba71eb3b532850fd7 (diff) | |
download | strongswan-69dd95811f261a7d636f6d1f9b52081c94a2872f.tar.bz2 strongswan-69dd95811f261a7d636f6d1f9b52081c94a2872f.tar.xz |
- added log_bytes and log_chunk
- fixed logger
- uses now syslog only
- comments
Diffstat (limited to 'Source/charon/logger.c')
-rw-r--r-- | Source/charon/logger.c | 131 |
1 files changed, 88 insertions, 43 deletions
diff --git a/Source/charon/logger.c b/Source/charon/logger.c index f1943bb46..e83917288 100644 --- a/Source/charon/logger.c +++ b/Source/charon/logger.c @@ -28,8 +28,12 @@ #include <syslog.h> #include <stdarg.h> +#include <string.h> - +/** + * Maximum length of al log entry (only used for logger_s.log) + */ +#define MAX_LOG 8192 /** * @brief The logger object @@ -41,10 +45,6 @@ struct private_logger_s { */ logger_t public; /** - * fd to log, NULL for syslog - */ - FILE *target; - /** * detail-level of logger */ logger_level_t level; @@ -57,34 +57,96 @@ struct private_logger_s { /** * implements logger_t-function log - * + * @see logger_s.log */ static status_t logg(private_logger_t *this, logger_level_t loglevel, char *format, ...) { if ((this->level & loglevel) == loglevel) { + char buffer[MAX_LOG]; + snprintf(buffer, MAX_LOG, "%s: %s", this->name, format); 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); - } + vsyslog(LOG_INFO, buffer, args); va_end(args); } + + return SUCCESS; +} + + +/** + * implements logger_t-function destroy + * @see logger_s.log_bytes + */ +static status_t log_bytes(private_logger_t *this, logger_level_t loglevel, char *label, char *bytes, size_t len) +{ + if ((this->level & loglevel) == loglevel) + { + char buffer[64]; + char *buffer_pos; + char *bytes_pos, *bytes_roof; + int i; + + syslog(LOG_INFO, "%s: %s (%d bytes)", this->name, label, len); - + bytes_pos = bytes; + bytes_roof = bytes + len; + buffer_pos = buffer; + + for (i = 1; bytes_pos < bytes_roof; i++) + { + static const char hexdig[] = "0123456789ABCDEF"; + *buffer_pos++ = hexdig[(*bytes_pos >> 4) & 0xF]; + *buffer_pos++ = hexdig[ *bytes_pos & 0xF]; + if ((i % 16) == 0) + { + *buffer_pos++ = '\0'; + buffer_pos = buffer; + syslog(LOG_INFO, "| %s", buffer); + } + else if ((i % 8) == 0) + { + *buffer_pos++ = ' '; + *buffer_pos++ = ' '; + *buffer_pos++ = ' '; + } + else if ((i % 4) == 0) + { + *buffer_pos++ = ' '; + *buffer_pos++ = ' '; + } + else + { + *buffer_pos++ = ' '; + } + + bytes_pos++; + } + + *buffer_pos++ = '\0'; + buffer_pos = buffer; + syslog(LOG_INFO, "| %s", buffer); + } + return SUCCESS; } + +/** + * implements logger_t-function log_chunk + * @see logger_s.log_chunk + */ +static status_t log_chunk(logger_t *this, logger_level_t loglevel, char *label, chunk_t *chunk) +{ + this->log_bytes(this, loglevel, label, chunk->ptr, chunk->len); + return SUCCESS; +} + + /** * implements logger_t-function enable_level - * + * @see logger_s.enable_level */ static status_t enable_level(private_logger_t *this, logger_level_t log_level) { @@ -94,33 +156,28 @@ static status_t enable_level(private_logger_t *this, logger_level_t log_level) /** * implements logger_t-function disable_level - * + * @see logger_s.disable_level */ static status_t disable_level(private_logger_t *this, logger_level_t log_level) { - this->level &= (~log_level); + this->level &= ~log_level; return SUCCESS; } /** * implements logger_t-function destroy - * - */ + * @see logger_s.destroy + */ static status_t destroy(private_logger_t *this) { - if (this->target) - { - fclose(this->target); - } allocator_free(this); return SUCCESS; } /* * Described in Header - * */ -logger_t *logger_create(char *logger_name, char *file, logger_level_t log_level) +logger_t *logger_create(char *logger_name, logger_level_t log_level) { private_logger_t *this = allocator_alloc_thing(private_logger_t); @@ -130,6 +187,8 @@ logger_t *logger_create(char *logger_name, char *file, logger_level_t log_level) } this->public.log = (status_t(*)(logger_t*,logger_level_t,char*,...))logg; + this->public.log_bytes = (status_t(*)(logger_t*, logger_level_t, char*,char*,size_t))log_bytes; + this->public.log_chunk = log_chunk; 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; @@ -137,21 +196,7 @@ logger_t *logger_create(char *logger_name, char *file, logger_level_t log_level) 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); - } + openlog("charon", 0, LOG_DAEMON); return (logger_t*)this; } |