diff options
Diffstat (limited to 'src/libstrongswan/utils')
-rw-r--r-- | src/libstrongswan/utils/identification.c | 14 | ||||
-rw-r--r-- | src/libstrongswan/utils/identification.h | 4 | ||||
-rw-r--r-- | src/libstrongswan/utils/leak_detective.c | 60 | ||||
-rw-r--r-- | src/libstrongswan/utils/leak_detective.h | 24 | ||||
-rw-r--r-- | src/libstrongswan/utils/linked_list.c | 48 | ||||
-rw-r--r-- | src/libstrongswan/utils/linked_list.h | 36 | ||||
-rw-r--r-- | src/libstrongswan/utils/logger.c | 384 | ||||
-rw-r--r-- | src/libstrongswan/utils/logger.h | 213 | ||||
-rw-r--r-- | src/libstrongswan/utils/logger_manager.c | 220 | ||||
-rw-r--r-- | src/libstrongswan/utils/logger_manager.h | 161 | ||||
-rw-r--r-- | src/libstrongswan/utils/tester.c | 255 | ||||
-rw-r--r-- | src/libstrongswan/utils/tester.h | 149 |
12 files changed, 78 insertions, 1490 deletions
diff --git a/src/libstrongswan/utils/identification.c b/src/libstrongswan/utils/identification.c index 4932a1e94..6dbd376a3 100644 --- a/src/libstrongswan/utils/identification.c +++ b/src/libstrongswan/utils/identification.c @@ -35,11 +35,7 @@ #include <asn1/asn1.h> -/** - * String mappings for id_type_t. - */ - -static const char *const id_type_name[] = { +ENUM_BEGIN(id_type_names, ID_ANY, ID_KEY_ID, "ID_ANY", "ID_IPV4_ADDR", "ID_FQDN", @@ -51,11 +47,11 @@ static const char *const id_type_name[] = { "ID_IPV6_ADDR_RANGE", "ID_DER_ASN1_DN", "ID_DER_ASN1_GN", - "ID_KEY_ID", -}; + "ID_KEY_ID"); +ENUM_NEXT(id_type_names, ID_DER_ASN1_GN_URI, ID_DER_ASN1_GN_URI, ID_KEY_ID, + "ID_DER_ASN1_GN_URI"); +ENUM_END(id_type_names, ID_DER_ASN1_GN_URI); -enum_names id_type_names = - { ID_ANY, ID_KEY_ID, id_type_name, NULL }; /** * X.501 acronyms for well known object identifiers (OIDs) diff --git a/src/libstrongswan/utils/identification.h b/src/libstrongswan/utils/identification.h index 3df710c7c..0d2bc794e 100644 --- a/src/libstrongswan/utils/identification.h +++ b/src/libstrongswan/utils/identification.h @@ -116,9 +116,9 @@ enum id_type_t { }; /** - * String mappings for id_type_t. + * enum names for id_type_t. */ -extern enum_names id_type_names; +extern enum_name_t *id_type_names; typedef struct identification_t identification_t; diff --git a/src/libstrongswan/utils/leak_detective.c b/src/libstrongswan/utils/leak_detective.c index 9b4219e18..7cf036eea 100644 --- a/src/libstrongswan/utils/leak_detective.c +++ b/src/libstrongswan/utils/leak_detective.c @@ -38,6 +38,7 @@ #include "leak_detective.h" #include <types.h> +#include <library.h> #ifdef LEAK_DETECTIVE @@ -117,11 +118,6 @@ static memory_header_t first_header = { }; /** - * logger for the leak detective - */ -static logger_t *logger; - -/** * standard hooks, used to temparily remove hooking */ static void *old_malloc_hook, *old_realloc_hook, *old_free_hook; @@ -149,11 +145,11 @@ static void log_stack_frames(void **stack_frames, int stack_frame_count) strings = backtrace_symbols (stack_frames, stack_frame_count); - logger->log(logger, ERROR, " dumping %d stack frame addresses", stack_frame_count); + DBG1(" dumping %d stack frame addresses", stack_frame_count); for (i = 0; i < stack_frame_count; i++) { - logger->log(logger, ERROR, " %s", strings[i]); + DBG1(" %s", strings[i]); } free (strings); } @@ -166,7 +162,7 @@ static void log_stack_frames(void **stack_frames, int stack_frame_count) * * The range_size is calculated using the readelf utility, e.g.: * readelf -s /lib/glibc.so.6 - * These values may or may not be acceptable for another system. + * The values are for glibc-2.4 and may or may not be correct on other systems. */ typedef struct whitelist_t whitelist_t; @@ -176,15 +172,16 @@ struct whitelist_t { }; whitelist_t whitelist[] = { - {pthread_create, 381}, - {pthread_setspecific, 256}, - {mktime, 60}, - {tzset, 126}, - {inet_ntoa, 256}, - {strerror, 173}, - {getprotobynumber, 294}, - {getservbyport, 309}, - {register_printf_function, 150}, + {pthread_create, 2542}, + {pthread_setspecific, 217}, + {mktime, 60}, + {tzset, 123}, + {inet_ntoa, 249}, + {strerror, 180}, + {getprotobynumber, 291}, + {getservbyport, 311}, + {register_printf_function, 159}, + {syslog, 45}, }; /** @@ -220,7 +217,7 @@ void report_leaks() { if (!is_whitelisted(hdr->stack_frames, hdr->stack_frame_count)) { - logger->log(logger, ERROR, "Leak (%d bytes at %p):", hdr->bytes, hdr + 1); + DBG1("Leak (%d bytes at %p):", hdr->bytes, hdr + 1); log_stack_frames(hdr->stack_frames, hdr->stack_frame_count); leaks++; } @@ -229,13 +226,13 @@ void report_leaks() switch (leaks) { case 0: - logger->log(logger, CONTROL, "No leaks detected"); + DBG1("No leaks detected"); break; case 1: - logger->log(logger, ERROR, "One leak detected"); + DBG1("One leak detected"); break; default: - logger->log(logger, ERROR, "%d leaks detected", leaks); + DBG1("%d leaks detected", leaks); break; } } @@ -322,8 +319,8 @@ void free_hook(void *ptr, const void *caller) uninstall_hooks(); if (hdr->magic != MEMORY_HEADER_MAGIC) { - logger->log(logger, ERROR, "freeing of invalid memory (%p, MAGIC 0x%x != 0x%x):", - ptr, hdr->magic, MEMORY_HEADER_MAGIC); + DBG1("freeing of invalid memory (%p, MAGIC 0x%x != 0x%x):", + ptr, hdr->magic, MEMORY_HEADER_MAGIC); stack_frame_count = backtrace(stack_frames, STACK_FRAMES_COUNT); log_stack_frames(stack_frames, stack_frame_count); install_hooks(); @@ -368,7 +365,7 @@ void *realloc_hook(void *old, size_t bytes, const void *caller) uninstall_hooks(); if (hdr->magic != MEMORY_HEADER_MAGIC) { - logger->log(logger, ERROR, "reallocation of invalid memory (%p):", old); + DBG1("reallocation of invalid memory (%p):", old); stack_frame_count = backtrace(stack_frames, STACK_FRAMES_COUNT); log_stack_frames(stack_frames, stack_frame_count); install_hooks(); @@ -397,16 +394,15 @@ void *realloc_hook(void *old, size_t bytes, const void *caller) /** * Setup leak detective */ -void leak_detective_init() +void __attribute__ ((constructor)) leak_detective_init() { - logger = logger_manager->get_logger(logger_manager, LEAK_DETECT); install_hooks(); } /** * Clean up leak detective */ -void leak_detective_cleanup() +void __attribute__ ((destructor)) leak_detective_cleanup() { uninstall_hooks(); report_leaks(); @@ -415,7 +411,7 @@ void leak_detective_cleanup() /** * Log memory allocation statistics */ -void leak_detective_status(logger_t *logger) +void leak_detective_status(FILE *stream) { u_int blocks = 0; size_t bytes = 0; @@ -429,10 +425,10 @@ void leak_detective_status(logger_t *logger) } pthread_mutex_unlock(&mutex); - logger->log(logger, CONTROL|LEVEL1, "allocation statistics:"); - logger->log(logger, CONTROL|LEVEL1, " call stats: malloc: %d, free: %d, realloc: %d", + fprintf(stream, "allocation statistics:\n"); + fprintf(stream, " call stats: malloc: %d, free: %d, realloc: %d\n", count_malloc, count_free, count_realloc); - logger->log(logger, CONTROL|LEVEL1, " allocated %d blocks, total size %d bytes (avg. %d bytes)", + fprintf(stream, " allocated %d blocks, total size %d bytes (avg. %d bytes)\n", blocks, bytes, bytes/blocks); } @@ -441,7 +437,7 @@ void leak_detective_status(logger_t *logger) /** * Dummy when !using LEAK_DETECTIVE */ -void leak_detective_status(logger_t *logger) +void leak_detective_status(FILE *stream) { } diff --git a/src/libstrongswan/utils/leak_detective.h b/src/libstrongswan/utils/leak_detective.h index 07b2f6543..d4016b06e 100644 --- a/src/libstrongswan/utils/leak_detective.h +++ b/src/libstrongswan/utils/leak_detective.h @@ -22,36 +22,14 @@ #ifndef LEAK_DETECTIVE_H_ #define LEAK_DETECTIVE_H_ - -#include <utils/logger_manager.h> - /** * Log status information about allocation */ -void leak_detective_status(logger_t *logger); - -#ifdef LEAK_DETECTIVE +void leak_detective_status(FILE *stream); /** * Max number of stack frames to include in a backtrace. */ #define STACK_FRAMES_COUNT 30 -/** - * Initialize leak detective, activates it - */ -void leak_detective_init(); - -/** - * Cleanup leak detective, deactivates it - */ -void leak_detective_cleanup(); - -#else /* !LEAK_DETECTIVE */ - -#define leak_detective_init() {} -#define leak_detective_cleanup() {} - -#endif /* LEAK_DETECTIVE */ - #endif /* LEAK_DETECTIVE_H_ */ diff --git a/src/libstrongswan/utils/linked_list.c b/src/libstrongswan/utils/linked_list.c index 0149afd69..83371018f 100644 --- a/src/libstrongswan/utils/linked_list.c +++ b/src/libstrongswan/utils/linked_list.c @@ -127,6 +127,11 @@ struct private_iterator_t { * Direction of iterator. */ bool forward; + + /** + * Mutex to use to synchronize access + */ + pthread_mutex_t *mutex; }; /** @@ -361,6 +366,10 @@ static void insert_after(private_iterator_t * iterator, void *item) */ static void iterator_destroy(private_iterator_t *this) { + if (this->mutex) + { + pthread_mutex_unlock(this->mutex); + } free(this); } @@ -373,24 +382,6 @@ static int get_count(private_linked_list_t *this) } /** - * Implementation of linked_list_t.call_on_items. - */ -static void call_on_items(private_linked_list_t *this, void(*func)(void*)) -{ - iterator_t *iterator; - void *item; - - iterator = this->public.create_iterator(&this->public,TRUE); - - while (iterator->has_next(iterator)) - { - iterator->current(iterator, &item); - (*func)(item); - } - iterator->destroy(iterator); -} - -/** * Implementation of linked_list_t.insert_first. */ static void insert_first(private_linked_list_t *this, void *item) @@ -629,7 +620,7 @@ static status_t get_last(private_linked_list_t *this, void **item) static iterator_t *create_iterator (private_linked_list_t *linked_list, bool forward) { private_iterator_t *this = malloc_thing(private_iterator_t); - + this->public.get_count = (bool (*) (iterator_t *this)) get_list_count; this->public.iterate = (bool (*) (iterator_t *this, void **value)) iterate; this->public.has_next = (bool (*) (iterator_t *this)) iterator_has_next; @@ -640,11 +631,26 @@ static iterator_t *create_iterator (private_linked_list_t *linked_list, bool for this->public.remove = (status_t (*) (iterator_t *this)) remove; this->public.reset = (void (*) (iterator_t *this)) iterator_reset; this->public.destroy = (void (*) (iterator_t *this)) iterator_destroy; - + this->forward = forward; this->current = NULL; this->list = linked_list; + this->mutex = NULL; + + return &this->public; +} +/** + * Implementation of linked_list_t.create_iterator_locked. + */ +static iterator_t *create_iterator_locked(private_linked_list_t *linked_list, + pthread_mutex_t *mutex) +{ + private_iterator_t *this = (private_iterator_t*)create_iterator(linked_list, TRUE); + this->mutex = mutex; + + pthread_mutex_lock(mutex); + return &this->public; } @@ -672,7 +678,7 @@ linked_list_t *linked_list_create() this->public.get_count = (int (*) (linked_list_t *)) get_count; this->public.create_iterator = (iterator_t * (*) (linked_list_t *,bool))create_iterator; - this->public.call_on_items = (void (*) (linked_list_t *, void(*func)(void*)))call_on_items; + this->public.create_iterator_locked = (iterator_t * (*) (linked_list_t *,pthread_mutex_t*))create_iterator_locked; this->public.get_first = (status_t (*) (linked_list_t *, void **item))get_first; this->public.get_last = (status_t (*) (linked_list_t *, void **item))get_last; this->public.insert_first = (void (*) (linked_list_t *, void *item))insert_first; diff --git a/src/libstrongswan/utils/linked_list.h b/src/libstrongswan/utils/linked_list.h index b5f982f20..9c824177e 100644 --- a/src/libstrongswan/utils/linked_list.h +++ b/src/libstrongswan/utils/linked_list.h @@ -24,6 +24,8 @@ #ifndef LINKED_LIST_H_ #define LINKED_LIST_H_ +#include <pthread.h> + #include <types.h> #include <utils/iterator.h> @@ -31,18 +33,13 @@ typedef struct linked_list_t linked_list_t; /** - * @brief Class implementing a double linked list (named only as linked list). + * @brief Class implementing a double linked list. * - * @warning Access to an object of this type is not thread-save. + * General purpose linked list. This list is not synchronized. * * @b Costructors: * - linked_list_create() - * - * @see - * - job_queue_t - * - event_queue_t - * - send_queue_t - * + * * @ingroup utils */ struct linked_list_t { @@ -64,27 +61,24 @@ struct linked_list_t { * @param forward iterator direction (TRUE: front to end) * @return new iterator_t object */ - iterator_t * (*create_iterator) (linked_list_t *linked_list, bool forward); + iterator_t *(*create_iterator) (linked_list_t *linked_list, bool forward); /** - * @brief Call a function with list element as argument. - * - * This method accepts a function, which will be called for - * each list element once. The function must accept the list - * element as the first argument. Handy for destruction of - * list elements. - * - * @todo Additional vararg which are passed to the - * function would be nice... + * @brief Creates a iterator, locking a mutex. + * + * The supplied mutex is acquired immediately, and released + * when the iterator gets destroyed. * * @param linked_list calling object - * @param func function to call + * @param mutex mutex to use for exclusive access + * @return new iterator_t object */ - void (*call_on_items) (linked_list_t *linked_list, void(*func)(void*)); + iterator_t *(*create_iterator_locked) (linked_list_t *linked_list, + pthread_mutex_t *mutex); /** * @brief Inserts a new item at the beginning of the list. - * + * * @param linked_list calling object * @param[in] item item value to insert in list */ diff --git a/src/libstrongswan/utils/logger.c b/src/libstrongswan/utils/logger.c deleted file mode 100644 index 26f42535e..000000000 --- a/src/libstrongswan/utils/logger.c +++ /dev/null @@ -1,384 +0,0 @@ -/** - * @file logger.c - * - * @brief Implementation of logger_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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 <syslog.h> -#include <string.h> -#include <stdio.h> -#include <time.h> -#include <pthread.h> - -#include "logger.h" - -/** - * Maximum length of a log entry (only used for logger_s.log). - */ -#define MAX_LOG 8192 - -/** - * Maximum number of logged bytes per line - */ -#define MAX_BYTES 16 - -typedef struct private_logger_t private_logger_t; - -/** - * @brief Private data of a logger_t object. - */ -struct private_logger_t { - /** - * Public data. - */ - logger_t public; - /** - * Detail-level of logger. - */ - log_level_t level; - /** - * Name of logger. - */ - char *name; - /** - * File to write log output to. - * NULL for syslog. - */ - FILE *output; - - /** - * Should a thread_id be included in the log? - */ - bool log_thread_id; -}; - -/** - * thread local storage for get_thread_number - */ -static pthread_key_t thread_ids; -static void make_key(void) -{ - pthread_key_create(&thread_ids, NULL); -} - -/** - * Get a unique thread number for a calling thread. Since - * pthread_self returns large and ugly numbers, use this function - * for logging; these numbers are incremental starting at 1 - */ -static int get_thread_number(void) -{ - static int current_num = 0; - static pthread_once_t key_once = PTHREAD_ONCE_INIT; - int stored_num; - - pthread_once(&key_once, make_key); - stored_num = (int)pthread_getspecific(thread_ids); - if (stored_num == 0) - { - pthread_setspecific(thread_ids, (void*)++current_num); - return current_num; - } - else - { - return stored_num; - } -} - -/** - * prepend the logging prefix to string and store it in buffer - */ -static void prepend_prefix(private_logger_t *this, log_level_t loglevel, const char *string, char *buffer) -{ - char thread_id[3] = ""; - char log_type, log_details; - char *separator = (strlen(this->name) == 0)? "" : ":"; - - if (loglevel & CONTROL) - { - log_type = 'C'; - } - else if (loglevel & ERROR) - { - log_type = 'E'; - } - else if (loglevel & RAW) - { - log_type = 'R'; - } - else if (loglevel & PRIVATE) - { - log_type = 'P'; - } - else if (loglevel & AUDIT) - { - log_type = 'A'; - } - else - { - log_type = '-'; - } - - if (loglevel & (LEVEL3 - LEVEL2)) - { - log_details = '3'; - } - else if (loglevel & (LEVEL2 - LEVEL1)) - { - log_details = '2'; - } - else if (loglevel & LEVEL1) - { - log_details = '1'; - } - else - { - log_details = '0'; - } - - if (this->log_thread_id) - { - snprintf(thread_id, sizeof(thread_id), "%02d", get_thread_number()); - } - snprintf(buffer, MAX_LOG, "%s[%c%c%s%s] %s", - thread_id, log_type, log_details, separator, this->name, string); -} - -/** - * Convert a charon-loglevel to a syslog priority - */ -static int get_priority(log_level_t loglevel) -{ - if (loglevel & ERROR) - { - return LOG_AUTHPRIV|LOG_ERR; - } - if (loglevel & AUDIT) - { - return LOG_AUTHPRIV|LOG_INFO; - } - return LOG_AUTHPRIV|LOG_DEBUG; -} - -/** - * Implementation of logger_t.logv. - */ -static void logv(private_logger_t *this, log_level_t loglevel, const char *format, va_list args) -{ - if ((this->level & loglevel) == loglevel) - { - char buffer[MAX_LOG]; - - if (this->output == NULL) - { - /* syslog */ - prepend_prefix(this, loglevel, format, buffer); - vsyslog(get_priority(loglevel), buffer, args); - } - else - { - /* File output */ - prepend_prefix(this, loglevel, format, buffer); - vfprintf(this->output, buffer, args); - fprintf(this->output, "\n"); - } - } -} - -/** - * Implementation of logger_t.log. - */ -static void logg(private_logger_t *this, log_level_t loglevel, const char *format, ...) -{ - va_list args; - - va_start(args, format); - logv(this, loglevel, format, args); - va_end(args); -} - -/** - * Implementation of logger_t.log_bytes. - */ -static void log_bytes(private_logger_t *this, log_level_t loglevel, const char *label, const char *bytes, size_t len) -{ - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - - if ((this->level & loglevel) == loglevel) - { - char thread_id[3] = ""; - char buffer[MAX_LOG]; - char ascii_buffer[MAX_BYTES+1]; - - char *buffer_pos = buffer; - const char format[] = "%s %d bytes @ %p"; - const char *bytes_pos = bytes; - const char *bytes_roof = bytes + len; - - int line_start = 0; - int i = 0; - - /* since me can't do multi-line output to syslog, - * we must do multiple syslogs. To avoid - * problems in output order, lock this by a mutex. - */ - pthread_mutex_lock(&mutex); - - prepend_prefix(this, loglevel, format, buffer); - - if (this->log_thread_id) - { - snprintf(thread_id, sizeof(thread_id), "%02d", get_thread_number()); - } - - if (this->output == NULL) - { - syslog(get_priority(loglevel), buffer, label, len, bytes); - } - else - { - fprintf(this->output, buffer, label, len, bytes); - fprintf(this->output, "\n"); - } - - while (bytes_pos < bytes_roof) - { - static char hexdig[] = "0123456789ABCDEF"; - - *buffer_pos++ = hexdig[(*bytes_pos >> 4) & 0xF]; - *buffer_pos++ = hexdig[ *bytes_pos & 0xF]; - - ascii_buffer[i++] = (*bytes_pos > 31 && *bytes_pos < 127) - ? *bytes_pos : '.'; - - if (++bytes_pos == bytes_roof || i == MAX_BYTES) - { - int padding = 3 * (MAX_BYTES - i); - - while (padding--) - { - *buffer_pos++ = ' '; - } - *buffer_pos++ = '\0'; - ascii_buffer[i] = '\0'; - - if (this->output == NULL) - { - syslog(get_priority(loglevel), "%s[ :%5d] %s %s", thread_id, line_start, buffer, ascii_buffer); - } - else - { - fprintf(this->output, "%s[ :%5d] %s %s\n", thread_id, line_start, buffer, ascii_buffer); - } - buffer_pos = buffer; - line_start += MAX_BYTES; - i = 0; - } - else - { - *buffer_pos++ = ' '; - } - } - pthread_mutex_unlock(&mutex); - } -} - -/** - * Implementation of logger_t.log_chunk. - */ -static void log_chunk(logger_t *this, log_level_t loglevel, const char *label, chunk_t chunk) -{ - this->log_bytes(this, loglevel, label, chunk.ptr, chunk.len); -} - -/** - * Implementation of logger_t.enable_level. - */ -static void enable_level(private_logger_t *this, log_level_t log_level) -{ - this->level |= log_level; -} - -/** - * Implementation of logger_t.disable_level. - */ -static void disable_level(private_logger_t *this, log_level_t log_level) -{ - this->level &= ~log_level; -} - -/** - * Implementation of logger_t.set_output. - */ -static void set_output(private_logger_t *this, FILE * output) -{ - this->output = output; -} - -/** - * Implementation of logger_t.get_level. - */ -static log_level_t get_level(private_logger_t *this) -{ - return this->level; -} - -/** - * Implementation of logger_t.destroy. - */ -static void destroy(private_logger_t *this) -{ - free(this->name); - free(this); -} - -/* - * Described in header. - */ -logger_t *logger_create(char *logger_name, log_level_t log_level, bool log_thread_id, FILE * output) -{ - private_logger_t *this = malloc_thing(private_logger_t); - - /* public functions */ - this->public.log = (void(*)(logger_t*,log_level_t,const char*,...))logg; - this->public.logv = (void(*)(logger_t*,log_level_t,const char*,va_list))logv; - this->public.log_bytes = (void(*)(logger_t*, log_level_t, const char*, const char*,size_t))log_bytes; - this->public.log_chunk = log_chunk; - this->public.enable_level = (void(*)(logger_t*,log_level_t))enable_level; - this->public.disable_level = (void(*)(logger_t*,log_level_t))disable_level; - this->public.get_level = (log_level_t(*)(logger_t*))get_level; - this->public.set_output = (void(*)(logger_t*,FILE*))set_output; - this->public.destroy = (void(*)(logger_t*))destroy; - - if (logger_name == NULL) - { - logger_name = ""; - } - - /* private variables */ - this->level = log_level; - this->log_thread_id = log_thread_id; - this->name = malloc(strlen(logger_name) + 1); - - strcpy(this->name,logger_name); - this->output = output; - - return (logger_t*)this; -} diff --git a/src/libstrongswan/utils/logger.h b/src/libstrongswan/utils/logger.h deleted file mode 100644 index b24940d70..000000000 --- a/src/libstrongswan/utils/logger.h +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @file logger.h - * - * @brief Interface of logger_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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 <stdio.h> -#include <stdarg.h> - -#include <types.h> - -typedef enum log_level_t log_level_t; - -/** - * @brief Log Levels supported by the logger object. - * - * Logleves are devided in two different kinds: - * - levels to specify the type of the log - * - levels to specify the detail-level of the log - * - * Use combinations of these to build detailed loglevels, such - * as CONTROL|LEVEL2 fore a detailed cotrol level, or - * use RAW to see all raw data dumps (except private). - * - * @ingroup utils - */ -enum log_level_t { - /** - * Control flow. - */ - CONTROL = 1, - /** - * Error reporting. - */ - ERROR = 2, - /** - * Logs important for the sysadmin. - */ - AUDIT = 4, - /** - * Raw data dumps. - */ - RAW = 8, - /** - * Private data dumps. - */ - PRIVATE = 16, - - /** - * Log most important output, can be omitted. - */ - LEVEL0 = 0, - /** - * Log more detailed output. - */ - LEVEL1 = 32, - /** - * Log even more detailed output. - */ - LEVEL2 = LEVEL1 + 64, - /** - * Use maximum detailed output. - */ - LEVEL3 = LEVEL2 + 128, - - /** - * Summary for all types with all detail-levels. - */ - FULL = LEVEL3 + CONTROL + ERROR + RAW + PRIVATE + AUDIT -}; - -typedef struct logger_t logger_t; - -/** - * @brief Class to simplify logging. - * - * @b Constructors: - * - logger_create() - * - * @ingroup utils - */ -struct logger_t { - - /** - * @brief Log an entry, using printf()-like params. - * - * All specified loglevels must be activated that - * the log is done. - * - * @param this logger_t object - * @param loglevel or'ed set of log_level_t's - * @param format printf like format string - * @param ... printf like parameters - */ - void (*log) (logger_t *this, log_level_t log_level, const char *format, ...); - - /** - * @brief Log an entry, using vprintf() style va_list parameters. - * - * All specified loglevels must be activated that - * the log is done. - * - * @param this logger_t object - * @param loglevel or'ed set of log_level_t's - * @param format printf like format string - * @param args va_list argument list - */ - void (*logv) (logger_t *this, log_level_t log_level, const char *format, va_list args); - - /** - * @brief Log some bytes, useful for debugging. - * - * All specified loglevels must be activated that - * the log is done. - * - * @param this logger_t object - * @param loglevel or'ed set of log_level_t's - * @param label a labeling name, logged with the bytes - * @param bytes pointer to the bytes to dump - * @param len number of bytes to dump - */ - void (*log_bytes) (logger_t *this, log_level_t loglevel, const char *label, const char *bytes, size_t len); - - /** - * @brief Log a chunk, useful for debugging. - * - * All specified loglevels must be activated that - * the log is done. - * - * @param this logger_t object - * @param loglevel or'ed set of log_level_t's - * @param label a labeling name, logged with the bytes - * @param chunk chunk to log - */ - void (*log_chunk) (logger_t *this, log_level_t loglevel, const char *label, chunk_t chunk); - - /** - * @brief Enables a loglevel for the current logger_t object. - * - * @param this logger_t object - * @param log_level loglevel to enable - */ - void (*enable_level) (logger_t *this, log_level_t log_level); - - /** - * @brief Disables a loglevel for the current logger_t object. - * - * @param this logger_t object - * @param log_level loglevel to enable - */ - void (*disable_level) (logger_t *this, log_level_t log_level); - - /** - * @brief Set the output of the logger. - * - * Use NULL for syslog. - * - * @param this logger_t object - * @param output file, where log output should be written - */ - void (*set_output) (logger_t *this, FILE *output); - - /** - * @brief Get the currently used loglevel. - * - * @param this logger_t object - * @return currently used loglevel - */ - log_level_t (*get_level) (logger_t *this); - - /** - * @brief Destroys a logger_t object. - * - * @param this logger_t object - */ - void (*destroy) (logger_t *this); -}; - -/** - * @brief Constructor to create a logger_t object. - * - * @param logger_name name for the logger_t object - * @param log_level or'ed set of log_levels to assign to the new logger_t object - * @param log_thread_id TRUE if thread id should also be logged - * @param output FILE * if log has to go on a file output, NULL for syslog - * @return logger_t object - * - * @ingroup utils - */ -logger_t *logger_create(char *logger_name, log_level_t log_level, bool log_thread_id, FILE * output); - - -#endif /*LOGGER_H_*/ diff --git a/src/libstrongswan/utils/logger_manager.c b/src/libstrongswan/utils/logger_manager.c deleted file mode 100644 index ff79c62b9..000000000 --- a/src/libstrongswan/utils/logger_manager.c +++ /dev/null @@ -1,220 +0,0 @@ -/** - * @file logger_manager.c - * - * @brief Implementation of logger_manager_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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_manager.h" - -#include <definitions.h> -#include <utils/linked_list.h> - -/** - * String mappings for logger_context_t - */ -mapping_t logger_context_t_mappings[] = { - {PARSER, "PARSER"}, - {GENERATOR, "GENERATOR"}, - {IKE_SA, "IKE_SA"}, - {IKE_SA_MANAGER, "IKE_SA_MANAGER"}, - {CHILD_SA, "CHILD_SA"}, - {MESSAGE, "MESSAGE"}, - {THREAD_POOL, "THREAD_POOL"}, - {WORKER, "WORKER"}, - {SCHEDULER, "SCHEDULER"}, - {SENDER, "SENDER"}, - {RECEIVER, "RECEIVER"}, - {SOCKET, "SOCKET"}, - {TESTER, "TESTER"}, - {DAEMON, "DAEMON"}, - {CONFIG, "CONFIG"}, - {ENCRYPTION_PAYLOAD, "ENCRYPTION_PAYLOAD"}, - {PAYLOAD, "PAYLOAD"}, - {DER_DECODER, "DER_DECODER"}, - {DER_ENCODER, "DER_ENCODER"}, - {ASN1, "ASN1"}, - {XFRM, "XFRM"}, - {LEAK_DETECT, "LEAK_DETECT"}, - {MAPPING_END, NULL}, -}; - -struct { - char *name; - log_level_t level; - bool log_thread_ids; -} logger_defaults[] = { - { "PARSR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* PARSER */ - { "GNRAT", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* GENERATOR */ - { "IKESA", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* IKE_SA */ - { "SAMGR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* IKE_SA_MANAGER */ - { "CHDSA", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* CHILD_SA */ - { "MESSG", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* MESSAGE */ - { "TPOOL", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* THREAD_POOL */ - { "WORKR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* WORKER */ - { "SCHED", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* SCHEDULER */ - { "SENDR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* SENDER */ - { "RECVR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* RECEIVER */ - { "SOCKT", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* SOCKET */ - { "TESTR", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* TESTER */ - { "DAEMN", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* DAEMON */ - { "CONFG", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* CONFIG */ - { "ENCPL", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* ENCRYPTION_PAYLOAD */ - { "PAYLD", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* PAYLOAD */ - { "DERDC", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* DER_DECODER */ - { "DEREC", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* DER_ENCODER */ - { "ASN_1", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* ASN1 */ - { "XFRM ", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* XFRM */ - { "LEAKD", ERROR|CONTROL|AUDIT|LEVEL0, TRUE }, /* LEAK_DETECT */ -}; - - -typedef struct private_logger_manager_t private_logger_manager_t; - -/** - * Private data of logger_manager_t object. - */ -struct private_logger_manager_t { - /** - * Public data. - */ - logger_manager_t public; - - /** - * Array of loggers, one for each context - */ - logger_t *loggers[LOGGER_CONTEXT_ROOF]; -}; - -/** - * The one and only instance of the logger manager - */ -static private_logger_manager_t private_logger_manager; - -/** - * Exported pointer for the logger manager - */ -logger_manager_t *logger_manager = (logger_manager_t *)&private_logger_manager; - -/** - * Implementation of logger_manager_t.get_logger. - */ -static logger_t *get_logger(private_logger_manager_t *this, logger_context_t context) -{ - return this->loggers[context]; -} - -/** - * Implementation of logger_manager_t.get_log_level. - */ -static log_level_t get_log_level (private_logger_manager_t *this, logger_context_t context) -{ - return this->loggers[context]->get_level(this->loggers[context]); -} - -/** - * Implementation of private_logger_manager_t.enable_log_level. - */ -static void enable_log_level(private_logger_manager_t *this, logger_context_t context, log_level_t level) -{ - if (context == ALL_LOGGERS) - { - for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) - { - this->loggers[context]->enable_level(this->loggers[context], level); - } - } - else - { - this->loggers[context]->enable_level(this->loggers[context], level); - } -} - -/** - * Implementation of private_logger_manager_t.disable_log_level. - */ -static void disable_log_level(private_logger_manager_t *this, logger_context_t context, log_level_t level) -{ - if (context == ALL_LOGGERS) - { - for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) - { - this->loggers[context]->disable_level(this->loggers[context], level); - } - } - else - { - this->loggers[context]->disable_level(this->loggers[context], level); - } -} - -/** - * Implementation of private_logger_manager_t.set_output. - */ -static void set_output(private_logger_manager_t *this, logger_context_t context, FILE *output) -{ - if (context == ALL_LOGGERS) - { - for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) - { - this->loggers[context]->set_output(this->loggers[context], output); - } - } - else - { - this->loggers[context]->set_output(this->loggers[context], output); - } -} - - -/** - * Creates the instance of the logger manager at library startup - */ -void logger_manager_init() -{ - int i; - - logger_manager->get_logger = (logger_t *(*)(logger_manager_t*,logger_context_t context))get_logger; - logger_manager->get_log_level = (log_level_t (*)(logger_manager_t *, logger_context_t)) get_log_level; - logger_manager->enable_log_level = (void (*)(logger_manager_t *, logger_context_t, log_level_t)) enable_log_level; - logger_manager->disable_log_level = (void (*)(logger_manager_t *, logger_context_t, log_level_t)) disable_log_level; - logger_manager->set_output = (void (*)(logger_manager_t *, logger_context_t, FILE*)) set_output; - - for (i = 0; i < LOGGER_CONTEXT_ROOF; i++) - { - private_logger_manager.loggers[i] = logger_create(logger_defaults[i].name, - logger_defaults[i].level, - logger_defaults[i].log_thread_ids, - INITIAL_LOG_OUTPUT); - } - -} - -/** - * Destroy the logger manager at library exit - */ -void logger_manager_cleanup() -{ - int i; - for (i = 0; i < LOGGER_CONTEXT_ROOF; i++) - { - private_logger_manager.loggers[i]->destroy(private_logger_manager.loggers[i]); - } -} diff --git a/src/libstrongswan/utils/logger_manager.h b/src/libstrongswan/utils/logger_manager.h deleted file mode 100644 index fa11cbd97..000000000 --- a/src/libstrongswan/utils/logger_manager.h +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @file logger_manager.h - * - * @brief Interface of logger_manager_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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_MANAGER_H_ -#define LOGGER_MANAGER_H_ - -#include <pthread.h> - -#include <utils/logger.h> - -#define INITIAL_LOG_OUTPUT stdout - -typedef enum logger_context_t logger_context_t; - -/** - * @brief Context of a specific logger. - * - * @ingroup utils - */ -enum logger_context_t { - ALL_LOGGERS = -1, - PARSER = 0, - GENERATOR, - IKE_SA, - IKE_SA_MANAGER, - CHILD_SA, - MESSAGE, - THREAD_POOL, - WORKER, - SCHEDULER, - SENDER, - RECEIVER, - SOCKET, - TESTER, - DAEMON, - CONFIG, - ENCRYPTION_PAYLOAD, - PAYLOAD, - DER_DECODER, - DER_ENCODER, - ASN1, - XFRM, - LEAK_DETECT, - LOGGER_CONTEXT_ROOF, -}; - - -typedef struct logger_manager_t logger_manager_t; - -/** - * @brief Class to manage logger_t objects. - * - * The logger manager manages all logger_t object in a list and - * allows their manipulation. Via a logger_context_t, the loglevel - * of a specific logging type can be adjusted at runtime. - * This class differs from others, as it has no constructor or destroy - * function. The one and only instance "logger_manager" is created at - * library start and destroyed at exit. - * - * @b Constructors: - * - none, logger_manager is the single instance - * use logger_manager_init/logger_manager_cleanup - * - * @see logger_t - * - * @ingroup utils - */ -struct logger_manager_t { - - /** - * @brief Gets a logger_t object for a specific logger context. - * - * @param this logger_manager_t object - * @param context logger_context to use the logger for - * @param name name for the new logger. Context name is already included - * and has not to be specified (so NULL is allowed) - * @return logger_t object - */ - logger_t *(*get_logger) (logger_manager_t *this, logger_context_t context); - - /** - * @brief Returns the set log_level of a specific context. - * - * @param this calling object - * @param context context to check level - * @return log_level for the given logger_context - */ - log_level_t (*get_log_level) (logger_manager_t *this, logger_context_t context); - - /** - * @brief Enables a logger level of a specific context. - * - * Use context ALL_LOGGERS to manipulate all loggers. - * - * @param this calling object - * @param context context to set level - * @param log_level logger level to eanble - */ - void (*enable_log_level) (logger_manager_t *this, logger_context_t context,log_level_t log_level); - - /** - * @brief Disables a logger level of a specific context. - * - * Use context ALL_LOGGERS to manipulate all loggers. - * - * @param this calling object - * @param context context to set level - * @param log_level logger level to disable - */ - void (*disable_log_level) (logger_manager_t *this, logger_context_t context,log_level_t log_level); - - /** - * @brief Sets the output of a logger. - * - * Use context ALL_LOGGERS to redirect all loggers. - * - * @param this calling object - * @param context context to set output - * @param log_level logger level to disable - */ - void (*set_output) (logger_manager_t *this, logger_context_t context, FILE *output); -}; - -/** - * The single and global instance of the logger_manager - */ -extern logger_manager_t *logger_manager; - -/** - * Initialize the logger manager with all its logger. - * Has to be called before logger_manager is accessed. - */ -void logger_manager_init(void); - -/** - * Free any resources hold by the logger manager. Do - * not access logger_manager after this call. - */ -void logger_manager_cleanup(void); - -#endif /*LOGGER_MANAGER_H_*/ diff --git a/src/libstrongswan/utils/tester.c b/src/libstrongswan/utils/tester.c deleted file mode 100644 index fcc6b4c4c..000000000 --- a/src/libstrongswan/utils/tester.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - * @file tester.c - * - * @brief Implementation of tester_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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 <stdlib.h> -#include <string.h> -#include <pthread.h> -#include <sys/time.h> - -#include "tester.h" - - - -typedef struct private_tester_t private_tester_t; - -/** - * @brief Private Data of tester_t class. - * - */ -struct private_tester_t { - - /** - * Protected interface of tester_t. - */ - protected_tester_t protected; - - /** - * Runs a specific test. - * - * @param tester associated tester object - * @param test_function test function to perform - * @param test_name name for the given test - */ - void (*run_test) (private_tester_t *tester, void (*test_function) (protected_tester_t * tester), char * test_name); - - /** - * Returns the difference of to timeval structs in microseconds. - * - * @warning this function is also defined in the event queue - * in later improvements, this function can be added to a general - * class type! - * - * @param end_time end time - * @param start_time start time - * - * @TODO make object function or move to utils! - * - * @return difference in microseconds - */ - long (*time_difference) (private_tester_t *tester,struct timeval *end_time, struct timeval *start_time); - - /** - * Output is written into this file. - */ - FILE* output; - - /** - * Number of already performed tests. - */ - int tests_count; - - /** - * Number of failed tests. - */ - int failed_tests_count; - - /** - * Number of failed asserts in current test. - */ - int failed_asserts_count; - - /** - * TRUE if also succeeded asserts should be written to output. - */ - bool display_succeeded_asserts; - - /** - * Mutex to make this class thread-save. - */ - pthread_mutex_t mutex; -}; - -/** - * Implementation of tester_t.perform_tests. - */ -static void perform_tests(private_tester_t *this,test_t **tests) -{ - int current_test = 0; - fprintf(this->output,"\nStart testing...\n\n"); - fprintf(this->output,"_____________________________________________________________________\n"); - fprintf(this->output,"Testname | running time\n"); - fprintf(this->output,"_______________________________________________________|_____________\n"); - - while (tests[current_test] != NULL) - { - this->run_test(this,tests[current_test]->test_function,tests[current_test]->test_name); - current_test++; - } - fprintf(this->output,"=====================================================================\n"); - fprintf(this->output,"End testing. %d of %d tests succeeded\n",this->tests_count - this->failed_tests_count,this->tests_count); - fprintf(this->output,"=====================================================================\n"); -} - -/** - * Implementation of tester_t.perform_test. - */ -static void perform_test(private_tester_t *this, test_t *test) -{ - test_t *tests[] = {test, NULL}; - return (perform_tests(this,tests)); -} - -/** - * Returns the difference of to timeval structs in microseconds. - * - * @warning this function is also defined in the event queue - * in later improvements, this function can be added to a general - * class type! - * - * @param end_time end time - * @param start_time start time - * - * @TODO make object function or move to utils! - * - * @return difference in microseconds - */ -static long time_difference(private_tester_t *this,struct timeval *end_time, struct timeval *start_time) -{ - long seconds, microseconds; - - seconds = (end_time->tv_sec - start_time->tv_sec); - microseconds = (end_time->tv_usec - start_time->tv_usec); - return ((seconds * 1000000) + microseconds); -} - - -/** - * Implementation of private_tester_t.run_test. - */ -static void run_test(private_tester_t *this, void (*test_function) (protected_tester_t * tester), char * test_name) -{ - struct timeval start_time, end_time; - long timediff; - this->tests_count++; - this->failed_asserts_count = 0; - fprintf(this->output,"%-55s\n", test_name); - gettimeofday(&start_time,NULL); - test_function(&(this->protected)); - gettimeofday(&end_time,NULL); - timediff = this->time_difference(this,&end_time, &start_time); - - if (this->failed_asserts_count > 0) - { - fprintf(this->output," => Test failed: %-37s|%10ld us\n",test_name,timediff); - }else - { - fprintf(this->output,"\033[1A\033[55C|%10ld us\033[1B\033[80D",timediff); - } - if (this->failed_asserts_count > 0) - { - this->failed_tests_count++; - } -} - - -/** - * Implementation of tester_t.assert_true. - */ -static void assert_true(private_tester_t *this, bool to_be_true,char * assert_name) -{ - if (assert_name == NULL) - { - assert_name = "unknown"; - } - - pthread_mutex_lock(&(this->mutex)); - if (!to_be_true) - { - this->failed_asserts_count++; - fprintf(this->output," check '%s' failed!\n", assert_name); - }else - { - if (this->display_succeeded_asserts) - { - fprintf(this->output," check '%s' succeeded\n", assert_name); - } - } - pthread_mutex_unlock(&(this->mutex)); -} - -/** - * Implementation of tester_t.assert_false. - */ -static void assert_false(private_tester_t *this, bool to_be_false,char * assert_name) -{ - this->protected.assert_true(&(this->protected),(!to_be_false),assert_name); -} - -/** - * Implementation of tester_t.destroy. - */ -static void destroy(private_tester_t *tester) -{ - private_tester_t *this = (private_tester_t*) tester; - pthread_mutex_destroy(&(this->mutex)); - free(this); -} - -/* - * Described in header. - */ -tester_t *tester_create(FILE *output, bool display_succeeded_asserts) -{ - private_tester_t *this = malloc_thing(private_tester_t); - - /* public functions */ - this->protected.public.destroy = (void (*) (tester_t *))destroy; - this->protected.public.perform_tests = (void (*) (tester_t *, test_t**)) perform_tests; - this->protected.public.perform_test = (void (*) (tester_t *, test_t*))perform_test; - this->protected.assert_true = (void (*) (protected_tester_t *, bool, char*)) assert_true; - this->protected.assert_false = (void (*) (protected_tester_t *, bool, char*)) assert_false; - - /* private functions */ - this->run_test = run_test; - this->time_difference = time_difference; - - /* private data */ - this->display_succeeded_asserts = display_succeeded_asserts; - this->failed_tests_count = 0; - this->tests_count = 0; - this->output = output; - pthread_mutex_init(&(this->mutex),NULL); - - return &(this->protected.public); -} diff --git a/src/libstrongswan/utils/tester.h b/src/libstrongswan/utils/tester.h deleted file mode 100644 index 21e678c59..000000000 --- a/src/libstrongswan/utils/tester.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file tester.h - * - * @brief Interface of tester_t. - * - */ - -/* - * Copyright (C) 2005-2006 Martin Willi - * Copyright (C) 2005 Jan Hutter - * 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 TESTER_H_ -#define TESTER_H_ - -#include <stdio.h> - -#include <types.h> - - -/* must be defined here cause it is used in test_t */ -typedef struct protected_tester_t protected_tester_t; - -typedef struct test_t test_t; - -/** - * @brief Representing a specified test. - * - * @ingroup utils - */ -struct test_t { - /** - * Testfunction called for this test. - * - * @param tester associated tester_t object - */ - void (*test_function) (protected_tester_t * tester); - - /** - * Name of the test. - */ - char * test_name; -}; - - -typedef struct tester_t tester_t; - -/** - * @brief A class to perform tests. - * - * @b Constructors: - * - tester_create() - * - * @ingroup utils - */ -struct tester_t { - /** - * @brief Test all testcases in array tests with specific tester_t object. - * - * @param tester tester_t object - * @param tests pointer to an array of test_t-pointers. - * The last item has to be NULL to mark end of array. - */ - void (*perform_tests) (tester_t *tester,test_t **tests); - - /** - * @brief Run a specific test case. - * - * @param this tester_t object - * @param test pointer to a test_t object which will be performed - */ - void (*perform_test) (tester_t *tester, test_t *test); - - /** - * @brief Destroys a tester_t object. - * - * @param tester tester_t object - */ - void (*destroy) (tester_t *tester); -}; - - -/** - * @brief A class used in a specific testcase. - * - * For each testcase an object of this type is passed to the testfunction. The testfunction uses this - * object to check specific asserts with protected_tester_t.assert_true and protected_tester_t.assert_false. - * - * @b Constructors: - * - tester_create() - * - * @ingroup utils - */ -struct protected_tester_t { - - /** - * Public functions of a tester_t object - */ - tester_t public; - - /** - * @brief Is called in a testcase to check a specific situation for TRUE. - * - * Log-Values to the tester output are protected from multiple access. - * - * @param this tester_t object - * @param to_be_true assert which has to be TRUE - * @param assert_name name of the assertion - */ - void (*assert_true) (protected_tester_t *tester, bool to_be_true, char *assert_name); - - /** - * @brief Is called in a testcase to check a specific situation for FALSE. - * - * Log-Values to the tester output are protected from multiple access. - * - * @param this tester_t object - * @param to_be_false assert which has to be FALSE - * @param assert_name name of the assertion - */ - void (*assert_false) (protected_tester_t *tester, bool to_be_false, char *assert_name); -}; - - -/** - * @brief Creates a tester_t object used to perform tests with. - * - * @param output test output is written to this output. - * @param display_succeeded_asserts has to be TRUE, if all asserts should be displayed, - * FALSE otherwise - * - * @return tester_t object - * - * @ingroup utils - */ -tester_t *tester_create(FILE *output, bool display_succeeded_asserts); - -#endif /*TESTER_H_*/ |