diff --git a/libs/freetdm/src/ftdm_dso.c b/libs/freetdm/src/ftdm_dso.c index ea5056130a..6e7403165d 100644 --- a/libs/freetdm/src/ftdm_dso.c +++ b/libs/freetdm/src/ftdm_dso.c @@ -27,11 +27,12 @@ #include -FT_DECLARE(void) ftdm_dso_destroy(ftdm_dso_lib_t *lib) { +FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) { if (lib && *lib) { FreeLibrary(*lib); *lib = NULL; } + return FTDM_SUCCESS; } FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) { @@ -78,11 +79,20 @@ FT_DECLARE(void*) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char ** #include -FT_DECLARE(void) ftdm_dso_destroy(ftdm_dso_lib_t *lib) { +FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) { + int rc; if (lib && *lib) { - dlclose(*lib); + rc = dlclose(*lib); + if (rc) { + ftdm_log(FTDM_LOG_ERROR, "Failed to close lib %p: %s\n", *lib, dlerror()); + return FTDM_FAIL; + } + ftdm_log(FTDM_LOG_DEBUG, "lib %p was closed with success\n", *lib); *lib = NULL; + return FTDM_SUCCESS; } + ftdm_log(FTDM_LOG_ERROR, "Invalid pointer provided to ftdm_dso_destroy\n"); + return FTDM_FAIL; } FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) { @@ -93,7 +103,7 @@ FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) { return lib; } -FT_DECLARE(void*) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) { +FT_DECLARE(void *) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) { void *func = dlsym(lib, sym); if (!func) { *err = ftdm_strdup(dlerror()); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c index e7a0dd18d1..ab7f734c96 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c @@ -2142,12 +2142,13 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_boost_destroy) const void *key = NULL; void *val = NULL; ftdm_dso_lib_t lib; - + ftdm_log(FTDM_LOG_DEBUG, "Destroying sangoma boost module\n"); for (i = hashtable_first(g_boost_modules_hash); i; i = hashtable_next(i)) { hashtable_this(i, &key, NULL, &val); if (key && val) { sigmod = val; lib = sigmod->pvt; + ftdm_log(FTDM_LOG_DEBUG, "destroying sigmod %s\n", sigmod->name); ftdm_dso_destroy(&lib); } } diff --git a/libs/freetdm/src/include/private/ftdm_dso.h b/libs/freetdm/src/include/private/ftdm_dso.h index c4c4b705d1..7e9d6d6be9 100644 --- a/libs/freetdm/src/include/private/ftdm_dso.h +++ b/libs/freetdm/src/include/private/ftdm_dso.h @@ -17,6 +17,7 @@ * */ +#include "freetdm.h" #ifndef _FTDM_DSO_H #define _FTDM_DSO_H @@ -28,7 +29,7 @@ extern "C" { typedef void (*ftdm_func_ptr_t) (void); typedef void * ftdm_dso_lib_t; -FT_DECLARE(void) ftdm_dso_destroy(ftdm_dso_lib_t *lib); +FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib); FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err); FT_DECLARE(void *) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err);