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)))
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,
status = 0;
-deinit_nm:
- nm_backend_deinit();
deinit:
libcharon_deinit();
libhydra_deinit();
return TRUE;
}
-/*
- * see header file
+/**
+ * Deinitialize NetworkManager backend
*/
-void nm_backend_deinit()
+static void nm_backend_deinit()
{
nm_backend_t *this = nm_backend;
nm_backend = NULL;
}
-/*
- * see header file
+/**
+ * Initialize NetworkManager backend
*/
-bool nm_backend_init()
+static bool nm_backend_init()
{
nm_backend_t *this;
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
*
* @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_ @}*/