unload the IMCs and IMVs using dlclose()

This commit is contained in:
Andreas Steffen
2010-11-09 20:43:51 +01:00
parent 83f08a783f
commit fa1a82f47a
2 changed files with 39 additions and 26 deletions
+20 -12
View File
@@ -37,6 +37,11 @@ struct private_tnc_imc_t {
*/
char *name;
/**
* Handle of loaded IMC
*/
void *handle;
/**
* ID of loaded IMC
*/
@@ -121,8 +126,9 @@ METHOD(imc_t, type_supported, bool,
METHOD(imc_t, destroy, void,
private_tnc_imc_t *this)
{
free(this->name);
dlclose(this->handle);
free(this->supported_types);
free(this->name);
free(this);
}
@@ -132,7 +138,6 @@ METHOD(imc_t, destroy, void,
imc_t* tnc_imc_create(char* name, char *filename)
{
private_tnc_imc_t *this;
void *handle;
INIT(this,
.public = {
@@ -145,8 +150,8 @@ imc_t* tnc_imc_create(char* name, char *filename)
},
);
handle = dlopen(filename, RTLD_NOW);
if (handle == NULL)
this->handle = dlopen(filename, RTLD_NOW);
if (!this->handle)
{
DBG1(DBG_TNC, "IMC '%s' failed to load from '%s': %s",
name, filename, dlerror());
@@ -154,39 +159,42 @@ imc_t* tnc_imc_create(char* name, char *filename)
return NULL;
}
/* we do not store or free dlopen() handles, leak_detective requires
/* we do not store or free dlopen() this->handles, leak_detective requires
* the modules to keep loaded until leak report */
this->public.initialize = dlsym(handle, "TNC_IMC_Initialize");
this->public.initialize = dlsym(this->handle, "TNC_IMC_Initialize");
if (!this->public.initialize)
{
DBG1(DBG_TNC, "could not resolve TNC_IMC_Initialize in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}
this->public.notify_connection_change =
dlsym(handle, "TNC_IMC_NotifyConnectionChange");
this->public.begin_handshake = dlsym(handle, "TNC_IMC_BeginHandshake");
dlsym(this->handle, "TNC_IMC_NotifyConnectionChange");
this->public.begin_handshake = dlsym(this->handle, "TNC_IMC_BeginHandshake");
if (!this->public.begin_handshake)
{
DBG1(DBG_TNC, "could not resolve TNC_IMC_BeginHandshake in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}
this->public.receive_message =
dlsym(handle, "TNC_IMC_ReceiveMessage");
dlsym(this->handle, "TNC_IMC_ReceiveMessage");
this->public.batch_ending =
dlsym(handle, "TNC_IMC_BatchEnding");
dlsym(this->handle, "TNC_IMC_BatchEnding");
this->public.terminate =
dlsym(handle, "TNC_IMC_Terminate");
dlsym(this->handle, "TNC_IMC_Terminate");
this->public.provide_bind_function =
dlsym(handle, "TNC_IMC_ProvideBindFunction");
dlsym(this->handle, "TNC_IMC_ProvideBindFunction");
if (!this->public.provide_bind_function)
{
DBG1(DBG_TNC, "could not resolve TNC_IMC_ProvideBindFunction in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}
+19 -14
View File
@@ -37,6 +37,11 @@ struct private_tnc_imv_t {
*/
char *name;
/**
* Handle of loaded IMV
*/
void *handle;
/**
* ID of loaded IMV
*/
@@ -121,8 +126,9 @@ METHOD(imv_t, type_supported, bool,
METHOD(imv_t, destroy, void,
private_tnc_imv_t *this)
{
free(this->name);
dlclose(this->handle);
free(this->supported_types);
free(this->name);
free(this);
}
@@ -132,7 +138,6 @@ METHOD(imv_t, destroy, void,
imv_t* tnc_imv_create(char *name, char *filename)
{
private_tnc_imv_t *this;
void *handle;
INIT(this,
.public = {
@@ -145,8 +150,8 @@ imv_t* tnc_imv_create(char *name, char *filename)
},
);
handle = dlopen(filename, RTLD_NOW);
if (handle == NULL)
this->handle = dlopen(filename, RTLD_NOW);
if (!this->handle)
{
DBG1(DBG_TNC, "IMV '%s' failed to load from '%s': %s",
name, filename, dlerror());
@@ -154,40 +159,40 @@ imv_t* tnc_imv_create(char *name, char *filename)
return NULL;
}
/* we do not store or free dlopen() handles, leak_detective requires
* the modules to keep loaded until leak report */
this->public.initialize = dlsym(handle, "TNC_IMV_Initialize");
this->public.initialize = dlsym(this->handle, "TNC_IMV_Initialize");
if (!this->public.initialize)
{
DBG1(DBG_TNC, "could not resolve TNC_IMV_Initialize in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}
this->public.notify_connection_change =
dlsym(handle, "TNC_IMV_NotifyConnectionChange");
dlsym(this->handle, "TNC_IMV_NotifyConnectionChange");
this->public.solicit_recommendation =
dlsym(handle, "TNC_IMV_SolicitRecommendation");
dlsym(this->handle, "TNC_IMV_SolicitRecommendation");
if (!this->public.solicit_recommendation)
{
DBG1(DBG_TNC, "could not resolve TNC_IMV_SolicitRecommendation in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}
this->public.receive_message =
dlsym(handle, "TNC_IMV_ReceiveMessage");
dlsym(this->handle, "TNC_IMV_ReceiveMessage");
this->public.batch_ending =
dlsym(handle, "TNC_IMV_BatchEnding");
dlsym(this->handle, "TNC_IMV_BatchEnding");
this->public.terminate =
dlsym(handle, "TNC_IMV_Terminate");
dlsym(this->handle, "TNC_IMV_Terminate");
this->public.provide_bind_function =
dlsym(handle, "TNC_IMV_ProvideBindFunction");
dlsym(this->handle, "TNC_IMV_ProvideBindFunction");
if (!this->public.provide_bind_function)
{
DBG1(DBG_TNC, "could not resolve TNC_IMV_ProvideBindFunction in %s: %s\n",
filename, dlerror());
dlclose(this->handle);
free(this);
return NULL;
}