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:
Thomas Egerer
2015-11-10 15:40:14 +01:00
committed by Tobias Brunner
parent e8f2c13f9a
commit db61c37690
4 changed files with 40 additions and 20 deletions
+12 -4
View File
@@ -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,
+20 -10
View File
@@ -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);
+4 -3
View File
@@ -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;
} }
+4 -3
View File
@@ -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;
} }