diff --git a/scripts/aes-test.c b/scripts/aes-test.c index f326b7ee1..eb94180f8 100644 --- a/scripts/aes-test.c +++ b/scripts/aes-test.c @@ -556,7 +556,7 @@ int main(int argc, char *argv[]) ctx.in = stdin; ctx.out = stdout; - library_init(NULL); + library_init(NULL, "aes-test"); atexit(library_deinit); while (true) diff --git a/scripts/crypt_burn.c b/scripts/crypt_burn.c index 8101f9cbd..729472e7d 100644 --- a/scripts/crypt_burn.c +++ b/scripts/crypt_burn.c @@ -26,7 +26,7 @@ int main(int argc, char *argv[]) int i = 0, limit = 0; - library_init(NULL); + library_init(NULL, "crypt_burn"); lib->plugins->load(lib->plugins, PLUGINS); atexit(library_deinit); diff --git a/scripts/dh_speed.c b/scripts/dh_speed.c index dc0a2870f..8a782d80b 100644 --- a/scripts/dh_speed.c +++ b/scripts/dh_speed.c @@ -118,7 +118,7 @@ int main(int argc, char *argv[]) usage(); } - library_init(NULL); + library_init(NULL, "dh_speed"); lib->plugins->load(lib->plugins, argv[1]); atexit(library_deinit); diff --git a/scripts/dnssec.c b/scripts/dnssec.c index 0cddfc47e..9d35c7cda 100644 --- a/scripts/dnssec.c +++ b/scripts/dnssec.c @@ -45,7 +45,7 @@ int main(int argc, char *argv[]) rr_set_t *rrset; rr_t *rr; - library_init(NULL); + library_init(NULL, "dnssec"); atexit(library_deinit); dbg = dbg_dnssec; diff --git a/scripts/fetch.c b/scripts/fetch.c index f58b37f89..a7d98c946 100644 --- a/scripts/fetch.c +++ b/scripts/fetch.c @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) { chunk_t res; - library_init(NULL); + library_init(NULL, "fetch"); atexit(library_deinit); lib->plugins->load(lib->plugins, PLUGINS); diff --git a/scripts/hash_burn.c b/scripts/hash_burn.c index 20e5642d4..97eab0d84 100644 --- a/scripts/hash_burn.c +++ b/scripts/hash_burn.c @@ -25,7 +25,7 @@ int main(int argc, char *argv[]) char buffer[1024]; int limit = 0, i = 0; - library_init(NULL); + library_init(NULL, "hash_burn"); lib->plugins->load(lib->plugins, PLUGINS); atexit(library_deinit); diff --git a/scripts/key2keyid.c b/scripts/key2keyid.c index 31f3bee82..e9a4ee692 100644 --- a/scripts/key2keyid.c +++ b/scripts/key2keyid.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) char buf[8096]; int read; - library_init(NULL); + library_init(NULL, "key2keyid"); lib->plugins->load(lib->plugins, PLUGINS); atexit(library_deinit); diff --git a/scripts/keyid2sql.c b/scripts/keyid2sql.c index 6e9a1334e..46257891c 100644 --- a/scripts/keyid2sql.c +++ b/scripts/keyid2sql.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) char buf[8096]; int read, n; - library_init(NULL); + library_init(NULL, "keyid2sql"); lib->plugins->load(lib->plugins, PLUGINS); atexit(library_deinit); diff --git a/scripts/malloc_speed.c b/scripts/malloc_speed.c index 85d51a281..2038098db 100644 --- a/scripts/malloc_speed.c +++ b/scripts/malloc_speed.c @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) int sizes[16] = { 1, 13, 100, 1000, 16, 10000, 50, 17, 123, 32, 8, 64, 8096, 1024, 123, 9 }; - library_init(NULL); + library_init(NULL, "malloc_speed"); atexit(library_deinit); print_mallinfo(); diff --git a/scripts/pubkey_speed.c b/scripts/pubkey_speed.c index f7e75162a..66279ada3 100644 --- a/scripts/pubkey_speed.c +++ b/scripts/pubkey_speed.c @@ -71,7 +71,7 @@ int main(int argc, char *argv[]) usage(); } - library_init(NULL); + library_init(NULL, "pubkey_speed"); lib->plugins->load(lib->plugins, argv[1]); atexit(library_deinit); diff --git a/scripts/tls_test.c b/scripts/tls_test.c index e1e8ca82b..7ec477aae 100644 --- a/scripts/tls_test.c +++ b/scripts/tls_test.c @@ -251,7 +251,7 @@ static void cleanup() */ static void init() { - library_init(NULL); + library_init(NULL, "tls_test"); dbg = dbg_tls; diff --git a/src/_copyright/_copyright.c b/src/_copyright/_copyright.c index f9f0a859d..806f78062 100644 --- a/src/_copyright/_copyright.c +++ b/src/_copyright/_copyright.c @@ -76,7 +76,7 @@ main(int argc, char *argv[]) const char **notice = copyright; const char **co; - library_init(NULL); + library_init(NULL, "_copyright"); atexit(library_deinit); while ((opt = getopt_long(argc, argv, "", opts, NULL)) != EOF) diff --git a/src/charon-cmd/charon-cmd.c b/src/charon-cmd/charon-cmd.c index 0c24fd146..13f97856f 100644 --- a/src/charon-cmd/charon-cmd.c +++ b/src/charon-cmd/charon-cmd.c @@ -322,7 +322,7 @@ int main(int argc, char *argv[]) dbg = dbg_stderr; atexit(library_deinit); - if (!library_init(NULL)) + if (!library_init(NULL, "charon-cmd")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/charon-nm/charon-nm.c b/src/charon-nm/charon-nm.c index 9ce6dbaeb..12667ab19 100644 --- a/src/charon-nm/charon-nm.c +++ b/src/charon-nm/charon-nm.c @@ -161,7 +161,7 @@ int main(int argc, char *argv[]) dbg = dbg_syslog; /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "charon-nm")) { library_deinit(); exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); diff --git a/src/charon-tkm/src/charon-tkm.c b/src/charon-tkm/src/charon-tkm.c index 3db06743d..1e9fecd2d 100644 --- a/src/charon-tkm/src/charon-tkm.c +++ b/src/charon-tkm/src/charon-tkm.c @@ -250,7 +250,7 @@ int main(int argc, char *argv[]) dbg = dbg_syslog; /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, dmn_name)) { library_deinit(); exit(status); diff --git a/src/charon/charon.c b/src/charon/charon.c index 340f852cd..d79969125 100644 --- a/src/charon/charon.c +++ b/src/charon/charon.c @@ -289,7 +289,7 @@ int main(int argc, char *argv[]) dbg = dbg_stderr; /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "charon")) { library_deinit(); exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); diff --git a/src/checksum/checksum_builder.c b/src/checksum/checksum_builder.c index ae9ba93b6..cc8185ecd 100644 --- a/src/checksum/checksum_builder.c +++ b/src/checksum/checksum_builder.c @@ -136,7 +136,7 @@ int main(int argc, char* argv[]) /* avoid confusing leak reports in build process */ setenv("LEAK_DETECTIVE_DISABLE", "1", 0); /* don't use a strongswan.conf, forces integrity check to disabled */ - library_init(""); + library_init("", "checksum_builder"); atexit(library_deinit); integrity = integrity_checker_create(NULL); diff --git a/src/conftest/conftest.c b/src/conftest/conftest.c index faf9df91f..d935058cb 100644 --- a/src/conftest/conftest.c +++ b/src/conftest/conftest.c @@ -435,7 +435,7 @@ int main(int argc, char *argv[]) char *suite_file = "suite.conf", *test_file = NULL, *preload, *plugins; file_logger_t *logger; - if (!library_init(NULL)) + if (!library_init(NULL, "conftest")) { library_deinit(); return SS_RC_LIBSTRONGSWAN_INTEGRITY; diff --git a/src/dumm/ext/dumm.c b/src/dumm/ext/dumm.c index 5acda3a9c..03ecbe40d 100644 --- a/src/dumm/ext/dumm.c +++ b/src/dumm/ext/dumm.c @@ -774,7 +774,7 @@ void Init_dumm() /* there are too many to report, rubyruby... */ setenv("LEAK_DETECTIVE_DISABLE", "1", 1); - library_init(NULL); + library_init(NULL, "dumm"); dumm = dumm_create(NULL); diff --git a/src/dumm/main.c b/src/dumm/main.c index 4cdf4682f..a53e1f67c 100644 --- a/src/dumm/main.c +++ b/src/dumm/main.c @@ -479,7 +479,7 @@ int main(int argc, char *argv[]) enumerator_t *enumerator; guest_t *guest; - library_init(NULL); + library_init(NULL, "dumm"); gtk_init(&argc, &argv); pages = linked_list_create(); diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c index 60485b66f..d5a68bbc1 100644 --- a/src/frontends/android/jni/libandroidbridge/charonservice.c +++ b/src/frontends/android/jni/libandroidbridge/charonservice.c @@ -600,7 +600,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, jboolean, dbg = dbg_android; /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "charon")) { library_deinit(); return FALSE; diff --git a/src/frontends/osx/charon-xpc/charon-xpc.c b/src/frontends/osx/charon-xpc/charon-xpc.c index 0a30ff866..74ad2140b 100644 --- a/src/frontends/osx/charon-xpc/charon-xpc.c +++ b/src/frontends/osx/charon-xpc/charon-xpc.c @@ -133,7 +133,7 @@ int main(int argc, char *argv[]) dbg = dbg_stderr; atexit(library_deinit); - if (!library_init(NULL)) + if (!library_init(NULL, "charon-xpc")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/libimcv/imcv.c b/src/libimcv/imcv.c index b5862daee..aa55746fc 100644 --- a/src/libimcv/imcv.c +++ b/src/libimcv/imcv.c @@ -109,7 +109,7 @@ bool libimcv_init(bool is_imv) else { /* we are the first to initialize libstrongswan */ - if (!library_init(NULL)) + if (!library_init(NULL, "libimcv")) { return FALSE; } diff --git a/src/libimcv/imv/imv_policy_manager.c b/src/libimcv/imv/imv_policy_manager.c index 61e0cd05b..15d291adf 100644 --- a/src/libimcv/imv/imv_policy_manager.c +++ b/src/libimcv/imv/imv_policy_manager.c @@ -288,7 +288,7 @@ int main(int argc, char *argv[]) atexit(library_deinit); /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "imv_policy_manager")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/libimcv/plugins/imv_os/pacman.c b/src/libimcv/plugins/imv_os/pacman.c index 57cc62a08..019e2adb8 100644 --- a/src/libimcv/plugins/imv_os/pacman.c +++ b/src/libimcv/plugins/imv_os/pacman.c @@ -466,12 +466,12 @@ int main(int argc, char *argv[]) atexit(cleanup); /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "pacman")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } if (!lib->plugins->load(lib->plugins, - lib->settings->get_str(lib->settings, "attest.load", "sqlite"))) + lib->settings->get_str(lib->settings, "pacman.load", "sqlite"))) { exit(SS_RC_INITIALIZATION_FAILED); } diff --git a/src/libpts/plugins/imv_attestation/attest.c b/src/libpts/plugins/imv_attestation/attest.c index 4d25df3f4..6e63c2653 100644 --- a/src/libpts/plugins/imv_attestation/attest.c +++ b/src/libpts/plugins/imv_attestation/attest.c @@ -439,7 +439,7 @@ int main(int argc, char *argv[]) atexit(library_deinit); /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "attest")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c index 72fc2fa44..e0876ef9f 100644 --- a/src/libstrongswan/library.c +++ b/src/libstrongswan/library.c @@ -145,6 +145,7 @@ void library_deinit() threads_deinit(); backtrace_deinit(); + free((void*)this->public.ns); free(this); lib = NULL; } @@ -234,7 +235,7 @@ static bool check_memwipe() /* * see header file */ -bool library_init(char *settings) +bool library_init(char *settings, const char *namespace) { private_library_t *this; printf_hook_t *pfh; @@ -250,6 +251,7 @@ bool library_init(char *settings) .public = { .get = _get, .set = _set, + .ns = strdup(namespace ?: "libstrongswan"), }, .ref = 1, ); diff --git a/src/libstrongswan/library.h b/src/libstrongswan/library.h index e53cf09e2..4125328b7 100644 --- a/src/libstrongswan/library.h +++ b/src/libstrongswan/library.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2010-2014 Tobias Brunner * Copyright (C) 2008 Martin Willi * Hochschule fuer Technik Rapperswil * @@ -139,6 +140,12 @@ struct library_t { */ bool (*set)(library_t *this, char *name, void *object); + /** + * Namespace used for settings etc. (i.e. the name of the binary that uses + * the library) + */ + const char *ns; + /** * Printf hook registering facility */ @@ -239,12 +246,17 @@ struct library_t { * Initialize library, creates "lib" instance. * * library_init() may be called multiple times in a single process, but each - * caller should call library_deinit() for each call to library_init(). + * caller must call library_deinit() for each call to library_init(). + * + * The settings and namespace arguments are only used on the first call. * * @param settings file to read settings from, may be NULL for default + * @param namespace name of the binary that uses the library, determines + * the first section name when reading config options. + * Defaults to libstrongswan if NULL. * @return FALSE if integrity check failed */ -bool library_init(char *settings); +bool library_init(char *settings, const char *namespace); /** * Deinitialize library, destroys "lib" instance. diff --git a/src/libstrongswan/tests/test_runner.c b/src/libstrongswan/tests/test_runner.c index 1e46cfe8e..0b26ee128 100644 --- a/src/libstrongswan/tests/test_runner.c +++ b/src/libstrongswan/tests/test_runner.c @@ -65,7 +65,7 @@ static array_t *load_suites(test_configuration_t configs[], bool old = FALSE; int i; - library_init(NULL); + library_init(NULL, "test-runner"); test_setup_handler(); @@ -178,7 +178,7 @@ static bool call_fixture(test_case_t *tcase, bool up) */ static bool pre_test(test_runner_init_t init) { - library_init(NULL); + library_init(NULL, "test-runner"); /* use non-blocking RNG to generate keys fast */ lib->settings->set_default_str(lib->settings, diff --git a/src/manager/main.c b/src/manager/main.c index 5c845b157..b6169082f 100644 --- a/src/manager/main.c +++ b/src/manager/main.c @@ -34,7 +34,7 @@ int main (int arc, char *argv[]) bool debug; int threads, timeout; - library_init(NULL); + library_init(NULL, "manager"); if (!lib->plugins->load(lib->plugins, lib->settings->get_str(lib->settings, "manager.load", PLUGINS))) { diff --git a/src/medsrv/main.c b/src/medsrv/main.c index 6f08b97e5..745fcc359 100644 --- a/src/medsrv/main.c +++ b/src/medsrv/main.c @@ -33,7 +33,7 @@ int main(int arc, char *argv[]) char *uri; int timeout, threads; - library_init(NULL); + library_init(NULL, "medsrv"); if (!lib->plugins->load(lib->plugins, lib->settings->get_str(lib->settings, "medsrv.load", PLUGINS))) { diff --git a/src/openac/openac.c b/src/openac/openac.c index 1996025e2..8862e9ab0 100644 --- a/src/openac/openac.c +++ b/src/openac/openac.c @@ -229,7 +229,7 @@ int main(int argc, char **argv) /* initialize library */ atexit(library_deinit); - if (!library_init(NULL)) + if (!library_init(NULL, "openac")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/pki/pki.c b/src/pki/pki.c index ecc0702cd..eb614dd7f 100644 --- a/src/pki/pki.c +++ b/src/pki/pki.c @@ -168,7 +168,7 @@ static void remove_callback() int main(int argc, char *argv[]) { atexit(library_deinit); - if (!library_init(NULL)) + if (!library_init(NULL, "pki")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/pool/pool.c b/src/pool/pool.c index 05043cd8c..cc58f7890 100644 --- a/src/pool/pool.c +++ b/src/pool/pool.c @@ -1212,7 +1212,7 @@ int main(int argc, char *argv[]) atexit(library_deinit); /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "pool")) { exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); } diff --git a/src/pt-tls-client/pt-tls-client.c b/src/pt-tls-client/pt-tls-client.c index e7d75f078..90edb0c8e 100644 --- a/src/pt-tls-client/pt-tls-client.c +++ b/src/pt-tls-client/pt-tls-client.c @@ -166,7 +166,7 @@ static void init() PLUGIN_PROVIDE(CUSTOM, "pt-tls-client"), PLUGIN_DEPENDS(CUSTOM, "tnccs-manager"), }; - library_init(NULL); + library_init(NULL, "pt-tls-client"); libtnccs_init(); dbg = dbg_pt_tls; diff --git a/src/scepclient/scepclient.c b/src/scepclient/scepclient.c index ec892cc0b..d7abcb423 100644 --- a/src/scepclient/scepclient.c +++ b/src/scepclient/scepclient.c @@ -487,7 +487,7 @@ int main(int argc, char **argv) err_t ugh = NULL; /* initialize library */ - if (!library_init(NULL)) + if (!library_init(NULL, "scepclient")) { library_deinit(); exit(SS_RC_LIBSTRONGSWAN_INTEGRITY); diff --git a/src/starter/starter.c b/src/starter/starter.c index 06eb142bd..87ad66dd9 100644 --- a/src/starter/starter.c +++ b/src/starter/starter.c @@ -419,7 +419,7 @@ int main (int argc, char **argv) bool attach_gdb = FALSE; bool load_warning = FALSE; - library_init(NULL); + library_init(NULL, "starter"); atexit(library_deinit); libhydra_init("starter"); diff --git a/src/stroke/stroke.c b/src/stroke/stroke.c index 75f014516..69c8ea2a4 100644 --- a/src/stroke/stroke.c +++ b/src/stroke/stroke.c @@ -480,7 +480,7 @@ int main(int argc, char *argv[]) const stroke_token_t *token; int res = 0; - library_init(NULL); + library_init(NULL, "stroke"); atexit(library_deinit); if (argc < 2)