kernel-interface: Return bool for kernel interface registration
If the (un)registering of a kernel interface (net or ipsec) fails, the plugin loader will never know, since the appropriate functions always returns TRUE. By making the (un)register functions return a boolean value, the loader can detect a failure during initializing the kernel interface and abort charon startup if desired.
This commit is contained in:
committed by
Tobias Brunner
parent
e8f2c13f9a
commit
db61c37690
@@ -738,44 +738,52 @@ METHOD(kernel_interface_t, get_address_by_ts, status_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
METHOD(kernel_interface_t, add_ipsec_interface, void,
|
METHOD(kernel_interface_t, add_ipsec_interface, bool,
|
||||||
private_kernel_interface_t *this, kernel_ipsec_constructor_t constructor)
|
private_kernel_interface_t *this, kernel_ipsec_constructor_t constructor)
|
||||||
{
|
{
|
||||||
if (!this->ipsec)
|
if (!this->ipsec)
|
||||||
{
|
{
|
||||||
this->ipsec_constructor = constructor;
|
this->ipsec_constructor = constructor;
|
||||||
this->ipsec = constructor();
|
this->ipsec = constructor();
|
||||||
|
return this->ipsec != NULL;
|
||||||
}
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(kernel_interface_t, remove_ipsec_interface, void,
|
METHOD(kernel_interface_t, remove_ipsec_interface, bool,
|
||||||
private_kernel_interface_t *this, kernel_ipsec_constructor_t constructor)
|
private_kernel_interface_t *this, kernel_ipsec_constructor_t constructor)
|
||||||
{
|
{
|
||||||
if (constructor == this->ipsec_constructor && this->ipsec)
|
if (constructor == this->ipsec_constructor && this->ipsec)
|
||||||
{
|
{
|
||||||
this->ipsec->destroy(this->ipsec);
|
this->ipsec->destroy(this->ipsec);
|
||||||
this->ipsec = NULL;
|
this->ipsec = NULL;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(kernel_interface_t, add_net_interface, void,
|
METHOD(kernel_interface_t, add_net_interface, bool,
|
||||||
private_kernel_interface_t *this, kernel_net_constructor_t constructor)
|
private_kernel_interface_t *this, kernel_net_constructor_t constructor)
|
||||||
{
|
{
|
||||||
if (!this->net)
|
if (!this->net)
|
||||||
{
|
{
|
||||||
this->net_constructor = constructor;
|
this->net_constructor = constructor;
|
||||||
this->net = constructor();
|
this->net = constructor();
|
||||||
|
return this->net != NULL;
|
||||||
}
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(kernel_interface_t, remove_net_interface, void,
|
METHOD(kernel_interface_t, remove_net_interface, bool,
|
||||||
private_kernel_interface_t *this, kernel_net_constructor_t constructor)
|
private_kernel_interface_t *this, kernel_net_constructor_t constructor)
|
||||||
{
|
{
|
||||||
if (constructor == this->net_constructor && this->net)
|
if (constructor == this->net_constructor && this->net)
|
||||||
{
|
{
|
||||||
this->net->destroy(this->net);
|
this->net->destroy(this->net);
|
||||||
this->net = NULL;
|
this->net = NULL;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(kernel_interface_t, add_listener, void,
|
METHOD(kernel_interface_t, add_listener, void,
|
||||||
|
|||||||
@@ -502,39 +502,49 @@ struct kernel_interface_t {
|
|||||||
/**
|
/**
|
||||||
* Register an ipsec kernel interface constructor on the manager.
|
* Register an ipsec kernel interface constructor on the manager.
|
||||||
*
|
*
|
||||||
* @param create constructor to register
|
* @param create constructor to register
|
||||||
|
* @return TRUE if the ipsec kernel interface was registered
|
||||||
|
* successfully, FALSE if an interface was already
|
||||||
|
* registered or the registration failed
|
||||||
*/
|
*/
|
||||||
void (*add_ipsec_interface)(kernel_interface_t *this,
|
bool (*add_ipsec_interface)(kernel_interface_t *this,
|
||||||
kernel_ipsec_constructor_t create);
|
kernel_ipsec_constructor_t create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister an ipsec kernel interface constructor.
|
* Unregister an ipsec kernel interface constructor.
|
||||||
*
|
*
|
||||||
* @param create constructor to unregister
|
* @param create constructor to unregister
|
||||||
|
* @return TRUE if the ipsec kernel interface was unregistered
|
||||||
|
* successfully, FALSE otherwise
|
||||||
*/
|
*/
|
||||||
void (*remove_ipsec_interface)(kernel_interface_t *this,
|
bool (*remove_ipsec_interface)(kernel_interface_t *this,
|
||||||
kernel_ipsec_constructor_t create);
|
kernel_ipsec_constructor_t create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a network kernel interface constructor on the manager.
|
* Register a network kernel interface constructor on the manager.
|
||||||
*
|
*
|
||||||
* @param create constructor to register
|
* @param create constructor to register
|
||||||
|
* @return TRUE if the kernel net interface was registered
|
||||||
|
* successfully, FALSE if an interface was already
|
||||||
|
* registered or the registration failed
|
||||||
*/
|
*/
|
||||||
void (*add_net_interface)(kernel_interface_t *this,
|
bool (*add_net_interface)(kernel_interface_t *this,
|
||||||
kernel_net_constructor_t create);
|
kernel_net_constructor_t create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister a network kernel interface constructor.
|
* Unregister a network kernel interface constructor.
|
||||||
*
|
*
|
||||||
* @param create constructor to unregister
|
* @param create constructor to unregister
|
||||||
|
* @return TRUE if the kernel net interface was unregistered
|
||||||
|
* successfully, FALSE otherwise
|
||||||
*/
|
*/
|
||||||
void (*remove_net_interface)(kernel_interface_t *this,
|
bool (*remove_net_interface)(kernel_interface_t *this,
|
||||||
kernel_net_constructor_t create);
|
kernel_net_constructor_t create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a listener to the kernel interface.
|
* Add a listener to the kernel interface.
|
||||||
*
|
*
|
||||||
* @param listener listener to add
|
* @param listener listener to add
|
||||||
*/
|
*/
|
||||||
void (*add_listener)(kernel_interface_t *this,
|
void (*add_listener)(kernel_interface_t *this,
|
||||||
kernel_listener_t *listener);
|
kernel_listener_t *listener);
|
||||||
@@ -542,7 +552,7 @@ struct kernel_interface_t {
|
|||||||
/**
|
/**
|
||||||
* Remove a listener from the kernel interface.
|
* Remove a listener from the kernel interface.
|
||||||
*
|
*
|
||||||
* @param listener listener to remove
|
* @param listener listener to remove
|
||||||
*/
|
*/
|
||||||
void (*remove_listener)(kernel_interface_t *this,
|
void (*remove_listener)(kernel_interface_t *this,
|
||||||
kernel_listener_t *listener);
|
kernel_listener_t *listener);
|
||||||
|
|||||||
@@ -25,13 +25,14 @@ bool kernel_ipsec_register(plugin_t *plugin, plugin_feature_t *feature,
|
|||||||
{
|
{
|
||||||
if (reg)
|
if (reg)
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->add_ipsec_interface(hydra->kernel_interface,
|
return hydra->kernel_interface->add_ipsec_interface(
|
||||||
|
hydra->kernel_interface,
|
||||||
(kernel_ipsec_constructor_t)data);
|
(kernel_ipsec_constructor_t)data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->remove_ipsec_interface(hydra->kernel_interface,
|
return hydra->kernel_interface->remove_ipsec_interface(
|
||||||
|
hydra->kernel_interface,
|
||||||
(kernel_ipsec_constructor_t)data);
|
(kernel_ipsec_constructor_t)data);
|
||||||
}
|
}
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,13 +25,14 @@ bool kernel_net_register(plugin_t *plugin, plugin_feature_t *feature,
|
|||||||
{
|
{
|
||||||
if (reg)
|
if (reg)
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->add_net_interface(hydra->kernel_interface,
|
return hydra->kernel_interface->add_net_interface(
|
||||||
|
hydra->kernel_interface,
|
||||||
(kernel_net_constructor_t)data);
|
(kernel_net_constructor_t)data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->remove_net_interface(hydra->kernel_interface,
|
return hydra->kernel_interface->remove_net_interface(
|
||||||
|
hydra->kernel_interface,
|
||||||
(kernel_net_constructor_t)data);
|
(kernel_net_constructor_t)data);
|
||||||
}
|
}
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user