|
Packit Service |
b23acc |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
b23acc |
/*
|
|
Packit Service |
b23acc |
* Copyright (C) 2012, 2013 Red Hat, Inc.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* SECTION:nm-editor-utils
|
|
Packit Service |
b23acc |
* @short_description: Miscellaneous connection editor utilities
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* nm-editor-utils contains helper functions for connection editors.
|
|
Packit Service |
b23acc |
* The goal is that this should eventually be shared between nmtui,
|
|
Packit Service |
b23acc |
* nm-connection-editor, and gnome-control-center.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-default.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-editor-utils.h"
|
|
Packit Service |
b23acc |
#if 0
|
|
Packit Service |
b23acc |
#include "nm-vpn-helpers.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static GSList *vpn_plugins;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static int
|
|
Packit Service |
b23acc |
sort_vpn_plugins (gconstpointer a, gconstpointer b)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMVpnEditorPlugin *aa = NM_VPN_EDITOR_PLUGIN (a);
|
|
Packit Service |
b23acc |
NMVpnEditorPlugin *bb = NM_VPN_EDITOR_PLUGIN (b);
|
|
Packit Service |
b23acc |
char *aa_desc = NULL, *bb_desc = NULL;
|
|
Packit Service |
b23acc |
int ret;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_object_get (aa, NM_VPN_EDITOR_PLUGIN_NAME, &aa_desc, NULL);
|
|
Packit Service |
b23acc |
g_object_get (bb, NM_VPN_EDITOR_PLUGIN_NAME, &bb_desc, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
ret = g_strcmp0 (aa_desc, bb_desc);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_free (aa_desc);
|
|
Packit Service |
b23acc |
g_free (bb_desc);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return ret;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static void
|
|
Packit Service |
b23acc |
wifi_connection_setup_func (NMConnection *connection,
|
|
Packit Service |
b23acc |
NMSettingConnection *s_con,
|
|
Packit Service |
b23acc |
NMSetting *s_hw)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
g_object_set (G_OBJECT (s_hw),
|
|
Packit Service |
b23acc |
NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
|
|
Packit Service |
b23acc |
NULL);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static void
|
|
Packit Service |
b23acc |
bond_connection_setup_func (NMConnection *connection,
|
|
Packit Service |
b23acc |
NMSettingConnection *s_con,
|
|
Packit Service |
b23acc |
NMSetting *s_hw)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingBond *s_bond = NM_SETTING_BOND (s_hw);
|
|
Packit Service |
b23acc |
guint i;
|
|
Packit Service |
b23acc |
const char *value;
|
|
Packit Service |
b23acc |
static const char *const options[] = {
|
|
Packit Service |
b23acc |
NM_SETTING_BOND_OPTION_MODE,
|
|
Packit Service |
b23acc |
NM_SETTING_BOND_OPTION_MIIMON,
|
|
Packit Service |
b23acc |
NM_SETTING_BOND_OPTION_DOWNDELAY,
|
|
Packit Service |
b23acc |
NM_SETTING_BOND_OPTION_UPDELAY,
|
|
Packit Service |
b23acc |
};
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for (i = 0; i < G_N_ELEMENTS (options); i++) {
|
|
Packit Service |
b23acc |
value = nm_setting_bond_get_option_default (s_bond, options[i]);
|
|
Packit Service |
b23acc |
if (value)
|
|
Packit Service |
b23acc |
nm_setting_bond_add_option (s_bond, options[i], value);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
typedef void (*NMEditorNewConnectionSetupFunc) (NMConnection *connection,
|
|
Packit Service |
b23acc |
NMSettingConnection *s_con,
|
|
Packit Service |
b23acc |
NMSetting *s_hw);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
typedef struct {
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData data;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
const char *id_format;
|
|
Packit Service |
b23acc |
NMEditorNewConnectionSetupFunc connection_setup_func;
|
|
Packit Service |
b23acc |
gboolean no_autoconnect;
|
|
Packit Service |
b23acc |
} NMEditorConnectionTypeDataReal;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static int
|
|
Packit Service |
b23acc |
sort_types (gconstpointer a, gconstpointer b)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData *typea = *(NMEditorConnectionTypeData **)a;
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData *typeb = *(NMEditorConnectionTypeData **)b;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (typea->virtual && !typeb->virtual)
|
|
Packit Service |
b23acc |
return 1;
|
|
Packit Service |
b23acc |
else if (typeb->virtual && !typea->virtual)
|
|
Packit Service |
b23acc |
return -1;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (typea->setting_type == NM_TYPE_SETTING_VPN &&
|
|
Packit Service |
b23acc |
typeb->setting_type != NM_TYPE_SETTING_VPN)
|
|
Packit Service |
b23acc |
return 1;
|
|
Packit Service |
b23acc |
else if (typeb->setting_type == NM_TYPE_SETTING_VPN &&
|
|
Packit Service |
b23acc |
typea->setting_type != NM_TYPE_SETTING_VPN)
|
|
Packit Service |
b23acc |
return -1;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return g_utf8_collate (typea->name, typeb->name);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* nm_editor_utils_get_connection_type_list:
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Gets an array of information about supported connection types. The
|
|
Packit Service |
b23acc |
* array is sorted in a standard presentation order (hardware types
|
|
Packit Service |
b23acc |
* first, alphabetized, then virtual types, alphabetized, then VPN
|
|
Packit Service |
b23acc |
* types, alphabetized).
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Returns: the array of connection type information
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData **
|
|
Packit Service |
b23acc |
nm_editor_utils_get_connection_type_list (void)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
GPtrArray *array;
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeDataReal *item;
|
|
Packit Service |
b23acc |
static NMEditorConnectionTypeData **list;
|
|
Packit Service |
b23acc |
#if 0
|
|
Packit Service |
b23acc |
GHashTable *vpn_plugins_hash;
|
|
Packit Service |
b23acc |
gboolean have_vpn_plugins;
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (list)
|
|
Packit Service |
b23acc |
return list;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
array = g_ptr_array_new ();
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Ethernet");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_WIRED;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_ETHERNET;
|
|
Packit Service |
b23acc |
item->data.virtual = FALSE;
|
|
Packit Service |
b23acc |
item->id_format = _("Ethernet connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Wi-Fi");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_WIRELESS;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_WIFI;
|
|
Packit Service |
b23acc |
item->data.virtual = FALSE;
|
|
Packit Service |
b23acc |
item->id_format = _("Wi-Fi connection %d");
|
|
Packit Service |
b23acc |
item->connection_setup_func = wifi_connection_setup_func;
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("InfiniBand");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_INFINIBAND;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_INFINIBAND;
|
|
Packit Service |
b23acc |
item->data.virtual = FALSE;
|
|
Packit Service |
b23acc |
item->id_format = _("InfiniBand connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#if 0
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Mobile Broadband");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_GSM;
|
|
Packit Service |
b23acc |
item->data.virtual = FALSE;
|
|
Packit Service |
b23acc |
item->id_format = _("Mobile broadband connection %d");
|
|
Packit Service |
b23acc |
item->no_autoconnect = TRUE;
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("DSL");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_PPPOE;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_ETHERNET;
|
|
Packit Service |
b23acc |
item->data.virtual = FALSE;
|
|
Packit Service |
b23acc |
item->id_format = _("DSL connection %d");
|
|
Packit Service |
b23acc |
item->no_autoconnect = TRUE;
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Bond");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_BOND;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_BOND;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("Bond connection %d");
|
|
Packit Service |
b23acc |
item->connection_setup_func = bond_connection_setup_func;
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Bridge");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_BRIDGE;
|
|
Packit Service |
b23acc |
item->data.slave_setting_type = NM_TYPE_SETTING_BRIDGE_PORT;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_BRIDGE;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("Bridge connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("Team");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_TEAM;
|
|
Packit Service |
b23acc |
item->data.slave_setting_type = NM_TYPE_SETTING_TEAM_PORT;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_TEAM;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("Team connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("VLAN");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_VLAN;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_VLAN;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("VLAN connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("IP tunnel");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_IP_TUNNEL;
|
|
Packit Service |
b23acc |
item->data.device_type = NM_TYPE_DEVICE_IP_TUNNEL;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("IP tunnel connection %d");
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#if 0
|
|
Packit Service |
b23acc |
/* Add "VPN" only if there are plugins */
|
|
Packit Service |
b23acc |
vpn_plugins_hash = nm_vpn_get_plugin_infos ();
|
|
Packit Service |
b23acc |
have_vpn_plugins = vpn_plugins_hash && g_hash_table_size (vpn_plugins_hash);
|
|
Packit Service |
b23acc |
if (have_vpn_plugins) {
|
|
Packit Service |
b23acc |
GHashTableIter iter;
|
|
Packit Service |
b23acc |
gpointer name, plugin;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
item = g_new0 (NMEditorConnectionTypeDataReal, 1);
|
|
Packit Service |
b23acc |
item->data.name = _("VPN");
|
|
Packit Service |
b23acc |
item->data.setting_type = NM_TYPE_SETTING_VPN;
|
|
Packit Service |
b23acc |
item->data.virtual = TRUE;
|
|
Packit Service |
b23acc |
item->id_format = _("VPN connection %d");
|
|
Packit Service |
b23acc |
item->no_autoconnect = TRUE;
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, item);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
vpn_plugins = NULL;
|
|
Packit Service |
b23acc |
g_hash_table_iter_init (&iter, vpn_plugins_hash);
|
|
Packit Service |
b23acc |
while (g_hash_table_iter_next (&iter, &name, &plugin))
|
|
Packit Service |
b23acc |
vpn_plugins = g_slist_prepend (vpn_plugins, plugin);
|
|
Packit Service |
b23acc |
vpn_plugins = g_slist_sort (vpn_plugins, sort_vpn_plugins);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_ptr_array_sort (array, sort_types);
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
list = (NMEditorConnectionTypeData **)g_ptr_array_free (array, FALSE);
|
|
Packit Service |
b23acc |
return list;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static gboolean
|
|
Packit Service |
b23acc |
_assert_format_int (const char *format)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
g_assert (format);
|
|
Packit Service |
b23acc |
format = strchr (format, '%');
|
|
Packit Service |
b23acc |
g_assert (format);
|
|
Packit Service |
b23acc |
format++;
|
|
Packit Service |
b23acc |
g_assert (!strchr (format, '%'));
|
|
Packit Service |
b23acc |
g_assert (format[0] == 'd');
|
|
Packit Service |
b23acc |
return TRUE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static char *
|
|
Packit Service |
b23acc |
get_available_connection_name (const char *format,
|
|
Packit Service |
b23acc |
NMClient *client)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
const GPtrArray *conns;
|
|
Packit Service |
b23acc |
GSList *names = NULL, *iter;
|
|
Packit Service |
b23acc |
char *cname = NULL;
|
|
Packit Service |
b23acc |
int i = 0;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
nm_assert (_assert_format_int (format));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
conns = nm_client_get_connections (client);
|
|
Packit Service |
b23acc |
for (i = 0; i < conns->len; i++) {
|
|
Packit Service |
b23acc |
const char *id;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
id = nm_connection_get_id (NM_CONNECTION (conns->pdata[i]));
|
|
Packit Service |
b23acc |
g_assert (id);
|
|
Packit Service |
b23acc |
names = g_slist_append (names, (gpointer) id);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* Find the next available unique connection name */
|
|
Packit Service |
b23acc |
for (i = 1; !cname && i < 10000; i++) {
|
|
Packit Service |
b23acc |
char *temp;
|
|
Packit Service |
b23acc |
gboolean found = FALSE;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral")
|
|
Packit Service |
b23acc |
temp = g_strdup_printf (format, i);
|
|
Packit Service |
b23acc |
NM_PRAGMA_WARNING_REENABLE
|
|
Packit Service |
b23acc |
for (iter = names; iter; iter = g_slist_next (iter)) {
|
|
Packit Service |
b23acc |
if (!strcmp (iter->data, temp)) {
|
|
Packit Service |
b23acc |
found = TRUE;
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
if (!found)
|
|
Packit Service |
b23acc |
cname = temp;
|
|
Packit Service |
b23acc |
else
|
|
Packit Service |
b23acc |
g_free (temp);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_slist_free (names);
|
|
Packit Service |
b23acc |
return cname;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static char *
|
|
Packit Service |
b23acc |
get_available_iface_name (const char *try_name,
|
|
Packit Service |
b23acc |
NMClient *client)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
const GPtrArray *connections;
|
|
Packit Service |
b23acc |
NMConnection *connection;
|
|
Packit Service |
b23acc |
char *new_name;
|
|
Packit Service |
b23acc |
unsigned num = 1;
|
|
Packit Service |
b23acc |
int i = 0;
|
|
Packit Service |
b23acc |
const char *ifname = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
connections = nm_client_get_connections (client);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
new_name = g_strdup (try_name);
|
|
Packit Service |
b23acc |
while (i < connections->len) {
|
|
Packit Service |
b23acc |
connection = NM_CONNECTION (connections->pdata[i]);
|
|
Packit Service |
b23acc |
ifname = nm_connection_get_interface_name (connection);
|
|
Packit Service |
b23acc |
if (g_strcmp0 (new_name, ifname) == 0) {
|
|
Packit Service |
b23acc |
g_free (new_name);
|
|
Packit Service |
b23acc |
new_name = g_strdup_printf ("%s%d", try_name, num++);
|
|
Packit Service |
b23acc |
i = 0;
|
|
Packit Service |
b23acc |
} else
|
|
Packit Service |
b23acc |
i++;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
return new_name;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* nm_editor_utils_create_connection:
|
|
Packit Service |
b23acc |
* @type: the type of the connection's primary #NMSetting
|
|
Packit Service |
b23acc |
* @master: (allow-none): the connection's master, if any
|
|
Packit Service |
b23acc |
* @client: an #NMClient
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Creates a new #NMConnection of the given type, automatically
|
|
Packit Service |
b23acc |
* creating a UUID and an appropriate not-currently-in-use connection
|
|
Packit Service |
b23acc |
* name, setting #NMSettingConnection:autoconnect appropriately for
|
|
Packit Service |
b23acc |
* the connection type, filling in slave-related information if
|
|
Packit Service |
b23acc |
* @master is not %NULL, and initializing any other mandatory-to-set
|
|
Packit Service |
b23acc |
* properties to reasonable initial values.
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Returns: a new #NMConnection
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
NMConnection *
|
|
Packit Service |
b23acc |
nm_editor_utils_create_connection (GType type,
|
|
Packit Service |
b23acc |
NMConnection *master,
|
|
Packit Service |
b23acc |
NMClient *client)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData **types;
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeDataReal *type_data = NULL;
|
|
Packit Service |
b23acc |
const char *master_setting_type = NULL, *master_uuid = NULL;
|
|
Packit Service |
b23acc |
GType master_type = G_TYPE_INVALID, slave_setting_type = G_TYPE_INVALID;
|
|
Packit Service |
b23acc |
NMConnection *connection;
|
|
Packit Service |
b23acc |
NMSettingConnection *s_con;
|
|
Packit Service |
b23acc |
NMSetting *s_hw, *s_slave;
|
|
Packit Service |
b23acc |
char *uuid, *id, *ifname;
|
|
Packit Service |
b23acc |
int i;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (master) {
|
|
Packit Service |
b23acc |
NMSettingConnection *master_s_con;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
master_s_con = nm_connection_get_setting_connection (master);
|
|
Packit Service |
b23acc |
master_setting_type = nm_setting_connection_get_connection_type (master_s_con);
|
|
Packit Service |
b23acc |
master_uuid = nm_setting_connection_get_uuid (master_s_con);
|
|
Packit Service |
b23acc |
master_type = nm_setting_lookup_type (master_setting_type);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
types = nm_editor_utils_get_connection_type_list ();
|
|
Packit Service |
b23acc |
for (i = 0; types[i]; i++) {
|
|
Packit Service |
b23acc |
if (types[i]->setting_type == type)
|
|
Packit Service |
b23acc |
type_data = (NMEditorConnectionTypeDataReal *)types[i];
|
|
Packit Service |
b23acc |
if (types[i]->setting_type == master_type)
|
|
Packit Service |
b23acc |
slave_setting_type = types[i]->slave_setting_type;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
if (!type_data) {
|
|
Packit Service |
b23acc |
g_return_val_if_reached (NULL);
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
connection = nm_simple_connection_new ();
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
|
|
Packit Service |
b23acc |
nm_connection_add_setting (connection, NM_SETTING (s_con));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
s_hw = g_object_new (type, NULL);
|
|
Packit Service |
b23acc |
nm_connection_add_setting (connection, s_hw);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (type == NM_TYPE_SETTING_BOND)
|
|
Packit Service |
b23acc |
ifname = get_available_iface_name ("nm-bond", client);
|
|
Packit Service |
b23acc |
else if (type == NM_TYPE_SETTING_TEAM)
|
|
Packit Service |
b23acc |
ifname = get_available_iface_name ("nm-team", client);
|
|
Packit Service |
b23acc |
else if (type == NM_TYPE_SETTING_BRIDGE)
|
|
Packit Service |
b23acc |
ifname = get_available_iface_name ("nm-bridge", client);
|
|
Packit Service |
b23acc |
else
|
|
Packit Service |
b23acc |
ifname = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (slave_setting_type != G_TYPE_INVALID) {
|
|
Packit Service |
b23acc |
s_slave = g_object_new (slave_setting_type, NULL);
|
|
Packit Service |
b23acc |
nm_connection_add_setting (connection, s_slave);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
uuid = nm_utils_uuid_generate ();
|
|
Packit Service |
b23acc |
id = get_available_connection_name (type_data->id_format, client);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_object_set (s_con,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_UUID, uuid,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_ID, id,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_TYPE, nm_setting_get_name (s_hw),
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_AUTOCONNECT, !type_data->no_autoconnect,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_MASTER, master_uuid,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_SLAVE_TYPE, master_setting_type,
|
|
Packit Service |
b23acc |
NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
|
|
Packit Service |
b23acc |
NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_free (uuid);
|
|
Packit Service |
b23acc |
g_free (id);
|
|
Packit Service |
b23acc |
g_free (ifname);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (type_data->connection_setup_func)
|
|
Packit Service |
b23acc |
type_data->connection_setup_func (connection, s_con, s_hw);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return connection;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* nm_editor_utils_get_connection_type_data:
|
|
Packit Service |
b23acc |
* @conn: an #NMConnection
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Gets the #NMEditorConnectionTypeData corresponding to
|
|
Packit Service |
b23acc |
* @conn's connection type.
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Returns: the #NMEditorConnectionTypeData
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData *
|
|
Packit Service |
b23acc |
nm_editor_utils_get_connection_type_data (NMConnection *conn)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
NMSettingConnection *s_con;
|
|
Packit Service |
b23acc |
const char *conn_type;
|
|
Packit Service |
b23acc |
GType conn_gtype;
|
|
Packit Service |
b23acc |
NMEditorConnectionTypeData **types;
|
|
Packit Service |
b23acc |
int i;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
s_con = nm_connection_get_setting_connection (conn);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (s_con != NULL, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
conn_type = nm_setting_connection_get_connection_type (s_con);
|
|
Packit Service |
b23acc |
conn_gtype = nm_setting_lookup_type (conn_type);
|
|
Packit Service |
b23acc |
g_return_val_if_fail (conn_gtype != G_TYPE_INVALID, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
types = nm_editor_utils_get_connection_type_list ();
|
|
Packit Service |
b23acc |
for (i = 0; types[i]; i++) {
|
|
Packit Service |
b23acc |
if (types[i]->setting_type == conn_gtype)
|
|
Packit Service |
b23acc |
return types[i];
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
}
|