diff options
Diffstat (limited to 'src/libstrongswan/library.c')
-rw-r--r-- | src/libstrongswan/library.c | 79 |
1 files changed, 60 insertions, 19 deletions
diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c index b7e75aec5..cd6a41f44 100644 --- a/src/libstrongswan/library.c +++ b/src/libstrongswan/library.c @@ -22,12 +22,10 @@ #include <threading/thread.h> #include <utils/identification.h> #include <utils/host.h> +#include <utils/hashtable.h> #include <selectors/traffic_selector.h> -#ifdef LEAK_DETECTIVE -#include <utils/leak_detective.h> -#endif -#define CHECKSUM_LIBRARY IPSEC_DIR"/libchecksum.so" +#define CHECKSUM_LIBRARY IPSEC_LIB_DIR"/libchecksum.so" typedef struct private_library_t private_library_t; @@ -41,12 +39,10 @@ struct private_library_t { */ library_t public; -#ifdef LEAK_DETECTIVE /** - * Memory leak detective, if enabled + * Hashtable with registered objects (name => object) */ - leak_detective_t *detective; -#endif /* LEAK_DETECTIVE */ + hashtable_t *objects; }; /** @@ -55,7 +51,7 @@ struct private_library_t { library_t *lib; /** - * Implementation of library_t.destroy + * Deinitialize library */ void library_deinit() { @@ -65,6 +61,9 @@ void library_deinit() detailed = lib->settings->get_bool(lib->settings, "libstrongswan.leak_detective.detailed", TRUE); + /* make sure the cache is clear before unloading plugins */ + lib->credmgr->flush_cache(lib->credmgr, CERT_ANY); + this->public.scheduler->destroy(this->public.scheduler); this->public.processor->destroy(this->public.processor); this->public.plugins->destroy(this->public.plugins); @@ -76,18 +75,17 @@ void library_deinit() this->public.fetcher->destroy(this->public.fetcher); this->public.db->destroy(this->public.db); this->public.printf_hook->destroy(this->public.printf_hook); + this->objects->destroy(this->objects); if (this->public.integrity) { this->public.integrity->destroy(this->public.integrity); } -#ifdef LEAK_DETECTIVE - if (this->detective) + if (lib->leak_detective) { - this->detective->report(this->detective, detailed); - this->detective->destroy(this->detective); + lib->leak_detective->report(lib->leak_detective, detailed); + lib->leak_detective->destroy(lib->leak_detective); } -#endif /* LEAK_DETECTIVE */ threads_deinit(); @@ -95,21 +93,63 @@ void library_deinit() lib = NULL; } +METHOD(library_t, get, void*, + private_library_t *this, char *name) +{ + return this->objects->get(this->objects, name); +} + +METHOD(library_t, set, bool, + private_library_t *this, char *name, void *object) +{ + if (object) + { + if (this->objects->get(this->objects, name)) + { + return FALSE; + } + this->objects->put(this->objects, name, object); + return TRUE; + } + return this->objects->remove(this->objects, name) != NULL; +} + +/** + * Hashtable hash function + */ +static u_int hash(char *key) +{ + return chunk_hash(chunk_create(key, strlen(key))); +} + +/** + * Hashtable equals function + */ +static bool equals(char *a, char *b) +{ + return streq(a, b); +} + /* * see header file */ bool library_init(char *settings) { + private_library_t *this; printf_hook_t *pfh; - private_library_t *this = malloc_thing(private_library_t); + + INIT(this, + .public = { + .get = _get, + .set = _set, + }, + ); lib = &this->public; threads_init(); - lib->leak_detective = FALSE; - #ifdef LEAK_DETECTIVE - this->detective = leak_detective_create(); + lib->leak_detective = leak_detective_create(); #endif /* LEAK_DETECTIVE */ pfh = printf_hook_create(); @@ -136,6 +176,8 @@ bool library_init(char *settings) pfh->add_handler(pfh, 'R', traffic_selector_printf_hook, PRINTF_HOOK_ARGTYPE_POINTER, PRINTF_HOOK_ARGTYPE_END); + this->objects = hashtable_create((hashtable_hash_t)hash, + (hashtable_equals_t)equals, 4); this->public.settings = settings_create(settings); this->public.crypto = crypto_factory_create(); this->public.creds = credential_factory_create(); @@ -146,7 +188,6 @@ bool library_init(char *settings) this->public.processor = processor_create(); this->public.scheduler = scheduler_create(); this->public.plugins = plugin_loader_create(); - this->public.integrity = NULL; if (lib->settings->get_bool(lib->settings, "libstrongswan.integrity_test", FALSE)) |