Blame clients/tui/nm-editor-utils.c

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
}