Blame src/nmtui/nm-editor-utils.c

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