diff --git a/plugins/dell/fu-plugin-dell.c b/plugins/dell/fu-plugin-dell.c index 41261152e..ea1e28a48 100644 --- a/plugins/dell/fu-plugin-dell.c +++ b/plugins/dell/fu-plugin-dell.c @@ -1018,9 +1018,8 @@ fu_plugin_update_offline (FuPlugin *plugin, return TRUE; } -gboolean +static gboolean fu_plugin_dell_toggle_flash (FuPlugin *plugin, - FuDevice *device, GError **error, gboolean enable) { @@ -1063,7 +1062,7 @@ fu_plugin_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error) { - return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE); + return fu_plugin_dell_toggle_flash (plugin, error, TRUE); } gboolean @@ -1071,23 +1070,19 @@ fu_plugin_update_cleanup (FuPlugin *plugin, FuDevice *device, GError **error) { - return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE); + return fu_plugin_dell_toggle_flash (plugin, error, FALSE); } gboolean -fu_plugin_coldplug_prepare (FuPlugin *plugin, - FuDevice *device, - GError **error) +fu_plugin_coldplug_prepare (FuPlugin *plugin, GError **error) { - return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE); + return fu_plugin_dell_toggle_flash (plugin, error, TRUE); } gboolean -fu_plugin_coldplug_cleanup (FuPlugin *plugin, - FuDevice *device, - GError **error) +fu_plugin_coldplug_cleanup (FuPlugin *plugin, GError **error) { - return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE); + return fu_plugin_dell_toggle_flash (plugin, error, FALSE); } void diff --git a/plugins/dell/fu-plugin-dell.h b/plugins/dell/fu-plugin-dell.h index a409fc801..60337f660 100644 --- a/plugins/dell/fu-plugin-dell.h +++ b/plugins/dell/fu-plugin-dell.h @@ -34,12 +34,6 @@ fu_plugin_dell_inject_fake_data (FuPlugin *plugin, gboolean fu_plugin_dell_toggle_device_mode (const efi_guid_t, int); -gboolean -fu_plugin_dell_toggle_flash (FuPlugin *, - FuDevice *, - GError **, - gboolean); - gboolean fu_plugin_dell_detect_tpm (FuPlugin *plugin, GError **error); diff --git a/src/fu-main.c b/src/fu-main.c index e57b7c77b..ff07c5842 100644 --- a/src/fu-main.c +++ b/src/fu-main.c @@ -2320,6 +2320,15 @@ fu_main_plugins_coldplug (FuMainPrivate *priv) { g_autoptr(AsProfileTask) ptask = NULL; + /* prepare */ + for (guint i = 0; i < priv->plugins->len; i++) { + g_autoptr(GError) error = NULL; + FuPlugin *plugin = g_ptr_array_index (priv->plugins, i); + if (!fu_plugin_runner_coldplug_prepare (plugin, &error)) + g_warning ("failed to prepare coldplug: %s", error->message); + } + + /* exec */ ptask = as_profile_start_literal (priv->profile, "FuMain:coldplug"); g_assert (ptask != NULL); for (guint i = 0; i < priv->plugins->len; i++) { @@ -2335,6 +2344,14 @@ fu_main_plugins_coldplug (FuMainPrivate *priv) g_warning ("disabling plugin because: %s", error->message); } } + + /* cleanup */ + for (guint i = 0; i < priv->plugins->len; i++) { + g_autoptr(GError) error = NULL; + FuPlugin *plugin = g_ptr_array_index (priv->plugins, i); + if (!fu_plugin_runner_coldplug_cleanup (plugin, &error)) + g_warning ("failed to cleanup coldplug: %s", error->message); + } } static void diff --git a/src/fu-plugin-private.h b/src/fu-plugin-private.h index 7d5879185..b9603de41 100644 --- a/src/fu-plugin-private.h +++ b/src/fu-plugin-private.h @@ -38,6 +38,10 @@ gboolean fu_plugin_runner_startup (FuPlugin *plugin, GError **error); gboolean fu_plugin_runner_coldplug (FuPlugin *plugin, GError **error); +gboolean fu_plugin_runner_coldplug_prepare (FuPlugin *plugin, + GError **error); +gboolean fu_plugin_runner_coldplug_cleanup (FuPlugin *plugin, + GError **error); gboolean fu_plugin_runner_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error); diff --git a/src/fu-plugin-vfuncs.h b/src/fu-plugin-vfuncs.h index 56f6d8bb9..42614793c 100644 --- a/src/fu-plugin-vfuncs.h +++ b/src/fu-plugin-vfuncs.h @@ -33,6 +33,10 @@ gboolean fu_plugin_startup (FuPlugin *plugin, GError **error); gboolean fu_plugin_coldplug (FuPlugin *plugin, GError **error); +gboolean fu_plugin_coldplug_prepare (FuPlugin *plugin, + GError **error); +gboolean fu_plugin_coldplug_cleanup (FuPlugin *plugin, + GError **error); gboolean fu_plugin_update_online (FuPlugin *plugin, FuDevice *dev, GBytes *blob_fw, diff --git a/src/fu-plugin.c b/src/fu-plugin.c index 6840d3b6f..910183175 100644 --- a/src/fu-plugin.c +++ b/src/fu-plugin.c @@ -360,6 +360,50 @@ fu_plugin_runner_coldplug (FuPlugin *plugin, GError **error) return TRUE; } +gboolean +fu_plugin_runner_coldplug_prepare (FuPlugin *plugin, GError **error) +{ + FuPluginPrivate *priv = GET_PRIVATE (plugin); + FuPluginStartupFunc func = NULL; + + /* not enabled */ + if (!priv->enabled) + return TRUE; + + /* optional */ + g_module_symbol (priv->module, "fu_plugin_coldplug_prepare", (gpointer *) &func); + if (func == NULL) + return TRUE; + g_debug ("performing coldplug_prepare() on %s", priv->name); + if (!func (plugin, error)) { + g_prefix_error (error, "failed to prepare for coldplug %s: ", priv->name); + return FALSE; + } + return TRUE; +} + +gboolean +fu_plugin_runner_coldplug_cleanup (FuPlugin *plugin, GError **error) +{ + FuPluginPrivate *priv = GET_PRIVATE (plugin); + FuPluginStartupFunc func = NULL; + + /* not enabled */ + if (!priv->enabled) + return TRUE; + + /* optional */ + g_module_symbol (priv->module, "fu_plugin_coldplug_cleanup", (gpointer *) &func); + if (func == NULL) + return TRUE; + g_debug ("performing coldplug_cleanup() on %s", priv->name); + if (!func (plugin, error)) { + g_prefix_error (error, "failed to cleanup coldplug %s: ", priv->name); + return FALSE; + } + return TRUE; +} + gboolean fu_plugin_runner_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error) {