diff options
| author | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
| commit | 80ec1decc49c72efec2a8b87c06245c92c0ab807 (patch) | |
| tree | e3b229aa94e8dcf0590f2317664176e7b8f7607b /src/devices/nm-device-factory.c | |
| parent | 65f86e8f56267192d42f2b629fc6b0c99fb9cd0c (diff) | |
New upstream version 1.29.90 upstream/1.29.90
Diffstat (limited to 'src/devices/nm-device-factory.c')
| -rw-r--r-- | src/devices/nm-device-factory.c | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/src/devices/nm-device-factory.c b/src/devices/nm-device-factory.c deleted file mode 100644 index a238ce1b..00000000 --- a/src/devices/nm-device-factory.c +++ /dev/null @@ -1,413 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (C) 2014 - 2018 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-device-factory.h" - -#include <sys/types.h> -#include <sys/stat.h> -#include <gmodule.h> - -#include "platform/nm-platform.h" -#include "nm-utils.h" -#include "nm-core-internal.h" -#include "nm-setting-bluetooth.h" - -#define PLUGIN_PREFIX "libnm-device-plugin-" - -/*****************************************************************************/ - -enum { DEVICE_ADDED, LAST_SIGNAL }; - -static guint signals[LAST_SIGNAL] = {0}; - -G_DEFINE_ABSTRACT_TYPE(NMDeviceFactory, nm_device_factory, G_TYPE_OBJECT) - -/*****************************************************************************/ - -static void -nm_device_factory_get_supported_types(NMDeviceFactory * factory, - const NMLinkType ** out_link_types, - const char *const **out_setting_types) -{ - g_return_if_fail(NM_IS_DEVICE_FACTORY(factory)); - - NM_DEVICE_FACTORY_GET_CLASS(factory)->get_supported_types(factory, - out_link_types, - out_setting_types); -} - -void -nm_device_factory_start(NMDeviceFactory *factory) -{ - g_return_if_fail(factory != NULL); - - if (NM_DEVICE_FACTORY_GET_CLASS(factory)->start) - NM_DEVICE_FACTORY_GET_CLASS(factory)->start(factory); -} - -NMDevice * -nm_device_factory_create_device(NMDeviceFactory * factory, - const char * iface, - const NMPlatformLink *plink, - NMConnection * connection, - gboolean * out_ignore, - GError ** error) -{ - NMDeviceFactoryClass *klass; - NMDevice * device; - gboolean ignore = FALSE; - - g_return_val_if_fail(factory, NULL); - g_return_val_if_fail(iface && *iface, NULL); - if (plink) { - g_return_val_if_fail(!connection, NULL); - g_return_val_if_fail(strcmp(iface, plink->name) == 0, NULL); - nm_assert(factory == nm_device_factory_manager_find_factory_for_link_type(plink->type)); - } else if (connection) - nm_assert(factory == nm_device_factory_manager_find_factory_for_connection(connection)); - else - g_return_val_if_reached(NULL); - - klass = NM_DEVICE_FACTORY_GET_CLASS(factory); - if (!klass->create_device) { - g_set_error(error, - NM_MANAGER_ERROR, - NM_MANAGER_ERROR_FAILED, - "Device factory %s cannot manage new devices", - G_OBJECT_TYPE_NAME(factory)); - NM_SET_OUT(out_ignore, FALSE); - return NULL; - } - - device = klass->create_device(factory, iface, plink, connection, &ignore); - NM_SET_OUT(out_ignore, ignore); - if (!device) { - if (ignore) { - g_set_error(error, - NM_MANAGER_ERROR, - NM_MANAGER_ERROR_FAILED, - "Device factory %s ignores device %s", - G_OBJECT_TYPE_NAME(factory), - iface); - } else { - g_set_error(error, - NM_MANAGER_ERROR, - NM_MANAGER_ERROR_FAILED, - "Device factory %s failed to create device %s", - G_OBJECT_TYPE_NAME(factory), - iface); - } - } - return device; -} - -const char * -nm_device_factory_get_connection_parent(NMDeviceFactory *factory, NMConnection *connection) -{ - g_return_val_if_fail(factory != NULL, NULL); - g_return_val_if_fail(connection != NULL, NULL); - - if (!nm_connection_is_virtual(connection)) - return NULL; - - if (NM_DEVICE_FACTORY_GET_CLASS(factory)->get_connection_parent) - return NM_DEVICE_FACTORY_GET_CLASS(factory)->get_connection_parent(factory, connection); - return NULL; -} - -char * -nm_device_factory_get_connection_iface(NMDeviceFactory *factory, - NMConnection * connection, - const char * parent_iface, - GError ** error) -{ - NMDeviceFactoryClass *klass; - char * ifname; - - g_return_val_if_fail(factory != NULL, NULL); - g_return_val_if_fail(connection != NULL, NULL); - g_return_val_if_fail(!error || !*error, NULL); - - klass = NM_DEVICE_FACTORY_GET_CLASS(factory); - - ifname = g_strdup(nm_connection_get_interface_name(connection)); - if (!ifname && klass->get_connection_iface) - ifname = klass->get_connection_iface(factory, connection, parent_iface); - - if (!ifname) { - g_set_error(error, - NM_MANAGER_ERROR, - NM_MANAGER_ERROR_FAILED, - "failed to determine interface name: error determine name for %s", - nm_connection_get_connection_type(connection)); - return NULL; - } - - return ifname; -} - -/*****************************************************************************/ - -static void -nm_device_factory_init(NMDeviceFactory *self) -{} - -static void -nm_device_factory_class_init(NMDeviceFactoryClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS(klass); - - signals[DEVICE_ADDED] = g_signal_new(NM_DEVICE_FACTORY_DEVICE_ADDED, - G_OBJECT_CLASS_TYPE(object_class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, - NULL, - NULL, - G_TYPE_NONE, - 1, - NM_TYPE_DEVICE); -} - -/*****************************************************************************/ - -static GHashTable *factories_by_link = NULL; -static GHashTable *factories_by_setting = NULL; - -static void __attribute__((destructor)) _cleanup(void) -{ - nm_clear_pointer(&factories_by_link, g_hash_table_unref); - nm_clear_pointer(&factories_by_setting, g_hash_table_unref); -} - -NMDeviceFactory * -nm_device_factory_manager_find_factory_for_link_type(NMLinkType link_type) -{ - g_return_val_if_fail(factories_by_link, NULL); - - return g_hash_table_lookup(factories_by_link, GUINT_TO_POINTER(link_type)); -} - -NMDeviceFactory * -nm_device_factory_manager_find_factory_for_connection(NMConnection *connection) -{ - NMDeviceFactoryClass *klass; - NMDeviceFactory * factory; - const char * type; - GSList * list; - - g_return_val_if_fail(factories_by_setting, NULL); - - type = nm_connection_get_connection_type(connection); - list = g_hash_table_lookup(factories_by_setting, type); - - for (; list; list = g_slist_next(list)) { - factory = list->data; - klass = NM_DEVICE_FACTORY_GET_CLASS(factory); - if (!klass->match_connection || klass->match_connection(factory, connection)) - return factory; - } - - return NULL; -} - -void -nm_device_factory_manager_for_each_factory(NMDeviceFactoryManagerFactoryFunc callback, - gpointer user_data) -{ - GHashTableIter iter; - NMDeviceFactory *factory; - GSList * list_iter, *list = NULL; - - if (factories_by_link) { - g_hash_table_iter_init(&iter, factories_by_link); - while (g_hash_table_iter_next(&iter, NULL, (gpointer) &factory)) { - if (!g_slist_find(list, factory)) - list = g_slist_prepend(list, factory); - } - } - - if (factories_by_setting) { - g_hash_table_iter_init(&iter, factories_by_setting); - while (g_hash_table_iter_next(&iter, NULL, (gpointer) &list_iter)) { - for (; list_iter; list_iter = g_slist_next(list_iter)) { - if (!g_slist_find(list, list_iter->data)) - list = g_slist_prepend(list, list_iter->data); - } - } - } - - for (list_iter = list; list_iter; list_iter = list_iter->next) - callback(list_iter->data, user_data); - - g_slist_free(list); -} - -static gboolean -_add_factory(NMDeviceFactory * factory, - const char * path, - NMDeviceFactoryManagerFactoryFunc callback, - gpointer user_data) -{ - const NMLinkType * link_types = NULL; - const char *const *setting_types = NULL; - GSList * list, *list2; - int i; - - g_return_val_if_fail(factories_by_link, FALSE); - g_return_val_if_fail(factories_by_setting, FALSE); - - nm_device_factory_get_supported_types(factory, &link_types, &setting_types); - - g_return_val_if_fail((link_types && link_types[0] > NM_LINK_TYPE_UNKNOWN) - || (setting_types && setting_types[0]), - FALSE); - - for (i = 0; link_types && link_types[i] > NM_LINK_TYPE_UNKNOWN; i++) - g_hash_table_insert(factories_by_link, - GUINT_TO_POINTER(link_types[i]), - g_object_ref(factory)); - for (i = 0; setting_types && setting_types[i]; i++) { - list = g_hash_table_lookup(factories_by_setting, (char *) setting_types[i]); - if (list) { - list2 = g_slist_append(list, g_object_ref(factory)); - nm_assert(list == list2); - } else { - list = g_slist_append(list, g_object_ref(factory)); - g_hash_table_insert(factories_by_setting, (char *) setting_types[i], list); - } - } - - callback(factory, user_data); - - nm_log(path ? LOGL_INFO : LOGL_DEBUG, - LOGD_PLATFORM, - NULL, - NULL, - "Loaded device plugin: %s (%s)", - G_OBJECT_TYPE_NAME(factory), - path ?: "internal"); - return TRUE; -} - -static void -_load_internal_factory(GType factory_gtype, - NMDeviceFactoryManagerFactoryFunc callback, - gpointer user_data) -{ - gs_unref_object NMDeviceFactory *factory = NULL; - - factory = (NMDeviceFactory *) g_object_new(factory_gtype, NULL); - _add_factory(factory, NULL, callback, user_data); -} - -static void -factories_list_unref(GSList *list) -{ - g_slist_free_full(list, g_object_unref); -} - -static void -load_factories_from_dir(const char * dirname, - NMDeviceFactoryManagerFactoryFunc callback, - gpointer user_data) -{ - NMDeviceFactory *factory; - GError * error = NULL; - char ** path, **paths; - - paths = nm_utils_read_plugin_paths(dirname, PLUGIN_PREFIX); - if (!paths) - return; - - for (path = paths; *path; path++) { - GModule * plugin; - NMDeviceFactoryCreateFunc create_func; - const char * item; - - item = strrchr(*path, '/'); - g_assert(item); - - plugin = g_module_open(*path, G_MODULE_BIND_LOCAL); - - if (!plugin) { - nm_log_warn(LOGD_PLATFORM, "(%s): failed to load plugin: %s", item, g_module_error()); - continue; - } - - if (!g_module_symbol(plugin, "nm_device_factory_create", (gpointer) &create_func)) { - nm_log_warn(LOGD_PLATFORM, - "(%s): failed to find device factory creator: %s", - item, - g_module_error()); - g_module_close(plugin); - continue; - } - - /* after loading glib types from the plugin, we cannot unload the library anymore. - * Make it resident. */ - g_module_make_resident(plugin); - - factory = create_func(&error); - if (!factory) { - nm_log_warn(LOGD_PLATFORM, - "(%s): failed to initialize device factory: %s", - item, - NM_G_ERROR_MSG(error)); - g_clear_error(&error); - continue; - } - g_clear_error(&error); - - _add_factory(factory, g_module_name(plugin), callback, user_data); - - g_object_unref(factory); - } - g_strfreev(paths); -} - -void -nm_device_factory_manager_load_factories(NMDeviceFactoryManagerFactoryFunc callback, - gpointer user_data) -{ - g_return_if_fail(factories_by_link == NULL); - g_return_if_fail(factories_by_setting == NULL); - - factories_by_link = g_hash_table_new_full(nm_direct_hash, NULL, NULL, g_object_unref); - factories_by_setting = g_hash_table_new_full(nm_str_hash, - g_str_equal, - NULL, - (GDestroyNotify) factories_list_unref); - -#define _ADD_INTERNAL(get_type_fcn) \ - G_STMT_START \ - { \ - GType get_type_fcn(void); \ - _load_internal_factory(get_type_fcn(), callback, user_data); \ - } \ - G_STMT_END - - _ADD_INTERNAL(nm_6lowpan_device_factory_get_type); - _ADD_INTERNAL(nm_bond_device_factory_get_type); - _ADD_INTERNAL(nm_bridge_device_factory_get_type); - _ADD_INTERNAL(nm_dummy_device_factory_get_type); - _ADD_INTERNAL(nm_ethernet_device_factory_get_type); - _ADD_INTERNAL(nm_infiniband_device_factory_get_type); - _ADD_INTERNAL(nm_ip_tunnel_device_factory_get_type); - _ADD_INTERNAL(nm_macsec_device_factory_get_type); - _ADD_INTERNAL(nm_macvlan_device_factory_get_type); - _ADD_INTERNAL(nm_ppp_device_factory_get_type); - _ADD_INTERNAL(nm_tun_device_factory_get_type); - _ADD_INTERNAL(nm_veth_device_factory_get_type); - _ADD_INTERNAL(nm_vlan_device_factory_get_type); - _ADD_INTERNAL(nm_vrf_device_factory_get_type); - _ADD_INTERNAL(nm_vxlan_device_factory_get_type); - _ADD_INTERNAL(nm_wireguard_device_factory_get_type); - _ADD_INTERNAL(nm_wpan_device_factory_get_type); - - load_factories_from_dir(NMPLUGINDIR, callback, user_data); -} |