|
Packit Service |
b23acc |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
b23acc |
/*
|
|
Packit Service |
b23acc |
* Copyright (C) 2007 - 2018 Red Hat, Inc.
|
|
Packit Service |
b23acc |
* Copyright (C) 2008 Novell, Inc.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-default.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-settings-plugin.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-utils.h"
|
|
Packit Service |
b23acc |
#include "nm-core-internal.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-settings-connection.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
enum {
|
|
Packit Service |
b23acc |
UNMANAGED_SPECS_CHANGED,
|
|
Packit Service |
b23acc |
UNRECOGNIZED_SPECS_CHANGED,
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
LAST_SIGNAL
|
|
Packit Service |
b23acc |
};
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static guint signals[LAST_SIGNAL] = { 0 };
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
G_DEFINE_TYPE (NMSettingsPlugin, nm_settings_plugin, G_TYPE_OBJECT)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
int
|
|
Packit Service |
b23acc |
nm_settings_plugin_cmp_by_priority (const NMSettingsPlugin *a,
|
|
Packit Service |
b23acc |
const NMSettingsPlugin *b,
|
|
Packit Service |
b23acc |
const GSList *plugin_list)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_SETTINGS_PLUGIN (a));
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_SETTINGS_PLUGIN (b));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (a != b) {
|
|
Packit Service |
b23acc |
int idx_a = g_slist_index ((GSList *) plugin_list, a);
|
|
Packit Service |
b23acc |
int idx_b = g_slist_index ((GSList *) plugin_list, b);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* the plugins must be found in the list. */
|
|
Packit Service |
b23acc |
nm_assert (idx_a >= 0);
|
|
Packit Service |
b23acc |
nm_assert (idx_b >= 0);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* plugins that appear first in @plugin_list have higher priority.
|
|
Packit Service |
b23acc |
* That means: smaller index -> higher priority. Reverse sort. */
|
|
Packit Service |
b23acc |
NM_CMP_DIRECT (idx_b, idx_a);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return 0;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
GSList *
|
|
Packit Service |
b23acc |
nm_settings_plugin_get_unmanaged_specs (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (!klass->get_unmanaged_specs)
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
return klass->get_unmanaged_specs (self);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
GSList *
|
|
Packit Service |
b23acc |
nm_settings_plugin_get_unrecognized_specs (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (!klass->get_unrecognized_specs)
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
return klass->get_unrecognized_specs (self);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void
|
|
Packit Service |
b23acc |
nm_settings_plugin_reload_connections (NMSettingsPlugin *self,
|
|
Packit Service |
b23acc |
NMSettingsPluginConnectionLoadCallback callback,
|
|
Packit Service |
b23acc |
gpointer user_data)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_if_fail (NM_IS_SETTINGS_PLUGIN (self));
|
|
Packit Service |
b23acc |
g_return_if_fail (callback);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (klass->reload_connections)
|
|
Packit Service |
b23acc |
klass->reload_connections (self, callback, user_data);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NMSettingsPluginConnectionLoadEntry *
|
|
Packit Service |
b23acc |
nm_settings_plugin_create_connection_load_entries (const char *const*filenames,
|
|
Packit Service |
b23acc |
gsize *out_len)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginConnectionLoadEntry *entries;
|
|
Packit Service |
b23acc |
gsize len;
|
|
Packit Service |
b23acc |
gsize i;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
len = NM_PTRARRAY_LEN (filenames);
|
|
Packit Service |
b23acc |
if (len == 0) {
|
|
Packit Service |
b23acc |
*out_len = 0;
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
entries = g_new (NMSettingsPluginConnectionLoadEntry, len);
|
|
Packit Service |
b23acc |
for (i = 0; i < len; i++) {
|
|
Packit Service |
b23acc |
entries[i] = (NMSettingsPluginConnectionLoadEntry) {
|
|
Packit Service |
b23acc |
.filename = filenames[i],
|
|
Packit Service |
b23acc |
.error = NULL,
|
|
Packit Service |
b23acc |
.handled = FALSE,
|
|
Packit Service |
b23acc |
};
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
*out_len = len;
|
|
Packit Service |
b23acc |
return entries;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void
|
|
Packit Service |
b23acc |
nm_settings_plugin_load_connections (NMSettingsPlugin *self,
|
|
Packit Service |
b23acc |
NMSettingsPluginConnectionLoadEntry *entries,
|
|
Packit Service |
b23acc |
gsize n_entries,
|
|
Packit Service |
b23acc |
NMSettingsPluginConnectionLoadCallback callback,
|
|
Packit Service |
b23acc |
gpointer user_data)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_if_fail (NM_IS_SETTINGS_PLUGIN (self));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (klass->load_connections)
|
|
Packit Service |
b23acc |
klass->load_connections (self, entries, n_entries, callback, user_data);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void
|
|
Packit Service |
b23acc |
nm_settings_plugin_load_connections_done (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_if_fail (NM_IS_SETTINGS_PLUGIN (self));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (klass->load_connections_done)
|
|
Packit Service |
b23acc |
klass->load_connections_done (self);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gboolean
|
|
Packit Service |
b23acc |
nm_settings_plugin_add_connection (NMSettingsPlugin *self,
|
|
Packit Service |
b23acc |
NMConnection *connection,
|
|
Packit Service |
b23acc |
NMSettingsStorage **out_storage,
|
|
Packit Service |
b23acc |
NMConnection **out_connection,
|
|
Packit Service |
b23acc |
GError **error)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#if NM_MORE_ASSERTS > 5
|
|
Packit Service |
b23acc |
nm_assert (nm_connection_verify (connection, NULL));
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NM_SET_OUT (out_storage, NULL);
|
|
Packit Service |
b23acc |
NM_SET_OUT (out_connection, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
if (!klass->add_connection) {
|
|
Packit Service |
b23acc |
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_NOT_SUPPORTED,
|
|
Packit Service |
b23acc |
"settings plugin does not support adding connections");
|
|
Packit Service |
b23acc |
return FALSE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
return klass->add_connection (self,
|
|
Packit Service |
b23acc |
connection,
|
|
Packit Service |
b23acc |
out_storage,
|
|
Packit Service |
b23acc |
out_connection,
|
|
Packit Service |
b23acc |
error);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gboolean
|
|
Packit Service |
b23acc |
nm_settings_plugin_update_connection (NMSettingsPlugin *self,
|
|
Packit Service |
b23acc |
NMSettingsStorage *storage,
|
|
Packit Service |
b23acc |
NMConnection *connection,
|
|
Packit Service |
b23acc |
NMSettingsStorage **out_storage,
|
|
Packit Service |
b23acc |
NMConnection **out_connection,
|
|
Packit Service |
b23acc |
GError **error)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_STORAGE (storage), FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (nm_settings_storage_get_plugin (storage) == self, FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#if NM_MORE_ASSERTS > 5
|
|
Packit Service |
b23acc |
nm_assert (nm_connection_verify (connection, NULL));
|
|
Packit Service |
b23acc |
nm_assert (nm_streq (nm_connection_get_uuid (connection), nm_settings_storage_get_uuid (storage)));
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NM_SET_OUT (out_storage, NULL);
|
|
Packit Service |
b23acc |
NM_SET_OUT (out_connection, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (!klass->update_connection) {
|
|
Packit Service |
b23acc |
g_set_error (error,
|
|
Packit Service |
b23acc |
NM_SETTINGS_ERROR,
|
|
Packit Service |
b23acc |
NM_SETTINGS_ERROR_NOT_SUPPORTED,
|
|
Packit Service |
b23acc |
"settings plugin does not support modifying connections");
|
|
Packit Service |
b23acc |
return FALSE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
return klass->update_connection (self,
|
|
Packit Service |
b23acc |
storage,
|
|
Packit Service |
b23acc |
connection,
|
|
Packit Service |
b23acc |
out_storage,
|
|
Packit Service |
b23acc |
out_connection,
|
|
Packit Service |
b23acc |
error);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gboolean
|
|
Packit Service |
b23acc |
nm_settings_plugin_delete_connection (NMSettingsPlugin *self,
|
|
Packit Service |
b23acc |
NMSettingsStorage *storage,
|
|
Packit Service |
b23acc |
GError **error)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingsPluginClass *klass = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_SETTINGS_STORAGE (storage), FALSE);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (nm_settings_storage_get_plugin (storage) == self, FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (!klass->delete_connection) {
|
|
Packit Service |
b23acc |
g_set_error (error,
|
|
Packit Service |
b23acc |
NM_SETTINGS_ERROR,
|
|
Packit Service |
b23acc |
NM_SETTINGS_ERROR_NOT_SUPPORTED,
|
|
Packit Service |
b23acc |
"settings plugin does not support deleting connections");
|
|
Packit Service |
b23acc |
return FALSE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return klass->delete_connection (self,
|
|
Packit Service |
b23acc |
storage,
|
|
Packit Service |
b23acc |
error);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void
|
|
Packit Service |
b23acc |
_nm_settings_plugin_emit_signal_unmanaged_specs_changed (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_SETTINGS_PLUGIN (self));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_signal_emit (self, signals[UNMANAGED_SPECS_CHANGED], 0);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void
|
|
Packit Service |
b23acc |
_nm_settings_plugin_emit_signal_unrecognized_specs_changed (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_SETTINGS_PLUGIN (self));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_signal_emit (self, signals[UNRECOGNIZED_SPECS_CHANGED], 0);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static void
|
|
Packit Service |
b23acc |
nm_settings_plugin_init (NMSettingsPlugin *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static void
|
|
Packit Service |
b23acc |
nm_settings_plugin_class_init (NMSettingsPluginClass *klass)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
signals[UNMANAGED_SPECS_CHANGED] =
|
|
Packit Service |
b23acc |
g_signal_new (NM_SETTINGS_PLUGIN_UNMANAGED_SPECS_CHANGED,
|
|
Packit Service |
b23acc |
G_OBJECT_CLASS_TYPE (object_class),
|
|
Packit Service |
b23acc |
G_SIGNAL_RUN_FIRST,
|
|
Packit Service |
b23acc |
0, NULL, NULL,
|
|
Packit Service |
b23acc |
g_cclosure_marshal_VOID__VOID,
|
|
Packit Service |
b23acc |
G_TYPE_NONE, 0);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
signals[UNRECOGNIZED_SPECS_CHANGED] =
|
|
Packit Service |
b23acc |
g_signal_new (NM_SETTINGS_PLUGIN_UNRECOGNIZED_SPECS_CHANGED,
|
|
Packit Service |
b23acc |
G_OBJECT_CLASS_TYPE (object_class),
|
|
Packit Service |
b23acc |
G_SIGNAL_RUN_FIRST,
|
|
Packit Service |
b23acc |
0, NULL, NULL,
|
|
Packit Service |
b23acc |
g_cclosure_marshal_VOID__VOID,
|
|
Packit Service |
b23acc |
G_TYPE_NONE, 0);
|
|
Packit Service |
b23acc |
}
|