diff --git a/src/charon-nm/charon-nm.c b/src/charon-nm/charon-nm.c index 2e781c08a..d847d1e83 100644 --- a/src/charon-nm/charon-nm.c +++ b/src/charon-nm/charon-nm.c @@ -264,6 +264,9 @@ int main(int argc, char *argv[]) DBG1(DBG_DMN, "daemon 'charon-nm': passed file integrity test"); } + /* register NM backend to be loaded with plugins */ + nm_backend_register(); + /* initialize daemon */ if (!charon->initialize(charon, lib->settings->get_str(lib->settings, "charon-nm.load", PLUGINS))) @@ -272,17 +275,10 @@ int main(int argc, char *argv[]) goto deinit; } - /* load NM backend */ - if (!nm_backend_init()) - { - DBG1(DBG_DMN, "failed to initialize NetworkManager backend - aborting charon-nm"); - goto deinit_nm; - } - if (!drop_capabilities()) { DBG1(DBG_DMN, "capability dropping failed - aborting charon-nm"); - goto deinit_nm; + goto deinit; } /* add handler for SEGV and ILL, @@ -308,8 +304,6 @@ int main(int argc, char *argv[]) status = 0; -deinit_nm: - nm_backend_deinit(); deinit: libcharon_deinit(); libhydra_deinit(); diff --git a/src/charon-nm/nm/nm_backend.c b/src/charon-nm/nm/nm_backend.c index 19d095935..f8ed23ef1 100644 --- a/src/charon-nm/nm/nm_backend.c +++ b/src/charon-nm/nm/nm_backend.c @@ -83,10 +83,10 @@ static bool cancel(nm_backend_t *this) return TRUE; } -/* - * see header file +/** + * Deinitialize NetworkManager backend */ -void nm_backend_deinit() +static void nm_backend_deinit() { nm_backend_t *this = nm_backend; @@ -107,10 +107,10 @@ void nm_backend_deinit() nm_backend = NULL; } -/* - * see header file +/** + * Initialize NetworkManager backend */ -bool nm_backend_init() +static bool nm_backend_init() { nm_backend_t *this; @@ -145,3 +145,29 @@ bool nm_backend_init() return TRUE; } +/** + * Initialize/deinitialize NetworkManager backend + */ +static bool nm_backend_cb(void *plugin, + plugin_feature_t *feature, bool reg, void *data) +{ + if (reg) + { + return nm_backend_init(); + } + nm_backend_deinit(); + return TRUE; +} + +/* + * see header file + */ +void nm_backend_register() +{ + static plugin_feature_t features[] = { + PLUGIN_CALLBACK((plugin_feature_callback_t)nm_backend_cb, NULL), + PLUGIN_PROVIDE(CUSTOM, "NetworkManager backend"), + }; + lib->plugins->add_static_features(lib->plugins, "nm-backend", features, + countof(features), TRUE); +} \ No newline at end of file diff --git a/src/charon-nm/nm/nm_backend.h b/src/charon-nm/nm/nm_backend.h index bff9d4d6f..89dc536f6 100644 --- a/src/charon-nm/nm/nm_backend.h +++ b/src/charon-nm/nm/nm_backend.h @@ -31,11 +31,6 @@ * * @return TRUE, if initialization was successful */ -bool nm_backend_init(); - -/** - * Deinitialize the NetworkManager backend. - */ -void nm_backend_deinit(); +void nm_backend_register(); #endif /** NM_BACKEND_H_ @}*/