mirror of
https://gitdl.cn/https://github.com/chakralinux/core.git
synced 2025-02-11 20:44:58 +08:00
253 lines
8.5 KiB
Diff
253 lines
8.5 KiB
Diff
diff --git a/src/devices/nm-device-team.c b/src/devices/nm-device-team.c
|
|
index f3b25e3..51778c1 100644
|
|
--- a/src/devices/nm-device-team.c
|
|
+++ b/src/devices/nm-device-team.c
|
|
@@ -51,7 +51,7 @@ G_DEFINE_TYPE (NMDeviceTeam, nm_device_team, NM_TYPE_DEVICE)
|
|
|
|
#define NM_DEVICE_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_TEAM, NMDeviceTeamPrivate))
|
|
|
|
-#define NM_TEAM_ERROR (nm_team_error_quark ())
|
|
+#define NM_DEVICE_TEAM_ERROR (nm_device_team_error_quark ())
|
|
|
|
static gboolean teamd_start (NMDevice *dev, NMSettingTeam *s_team);
|
|
|
|
@@ -75,7 +75,7 @@ enum {
|
|
/******************************************************************/
|
|
|
|
static GQuark
|
|
-nm_team_error_quark (void)
|
|
+nm_device_team_error_quark (void)
|
|
{
|
|
static GQuark quark = 0;
|
|
if (!quark)
|
|
@@ -890,5 +890,5 @@ nm_device_team_class_init (NMDeviceTeamClass *klass)
|
|
G_TYPE_FROM_CLASS (klass),
|
|
&dbus_glib_nm_device_team_object_info);
|
|
|
|
- dbus_g_error_domain_register (NM_TEAM_ERROR, NULL, NM_TYPE_TEAM_ERROR);
|
|
+ dbus_g_error_domain_register (NM_DEVICE_TEAM_ERROR, NULL, NM_TYPE_TEAM_ERROR);
|
|
}
|
|
diff --git a/src/devices/nm-device-team.h b/src/devices/nm-device-team.h
|
|
index fe1275c..32bc5fd 100644
|
|
--- a/src/devices/nm-device-team.h
|
|
+++ b/src/devices/nm-device-team.h
|
|
@@ -35,9 +35,9 @@ G_BEGIN_DECLS
|
|
#define NM_DEVICE_TEAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_TEAM, NMDeviceTeamClass))
|
|
|
|
typedef enum {
|
|
- NM_TEAM_ERROR_CONNECTION_NOT_TEAM = 0, /*< nick=ConnectionNotTeam >*/
|
|
- NM_TEAM_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/
|
|
- NM_TEAM_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/
|
|
+ NM_DEVICE_TEAM_ERROR_CONNECTION_NOT_TEAM = 0, /*< nick=ConnectionNotTeam >*/
|
|
+ NM_DEVICE_TEAM_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/
|
|
+ NM_DEVICE_TEAM_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/
|
|
} NMTeamError;
|
|
|
|
#define NM_DEVICE_TEAM_SLAVES "slaves"
|
|
diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.c b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
|
|
index 8527e6c..bc9de12 100644
|
|
--- a/src/dhcp-manager/nm-dhcp-dhclient-utils.c
|
|
+++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
|
|
@@ -225,7 +225,6 @@ nm_dhcp_dhclient_create_config (const char *interface,
|
|
add_also_request (alsoreq, "dhcp6.name-servers");
|
|
add_also_request (alsoreq, "dhcp6.domain-search");
|
|
add_also_request (alsoreq, "dhcp6.client-id");
|
|
- add_also_request (alsoreq, "dhcp6.server-id");
|
|
} else {
|
|
add_ip4_config (new_contents, dhcp_client_id, hostname);
|
|
add_also_request (alsoreq, "rfc3442-classless-static-routes");
|
|
diff --git a/src/nm-manager.c b/src/nm-manager.c
|
|
index 09a1985..0cf78e3 100644
|
|
--- a/src/nm-manager.c
|
|
+++ b/src/nm-manager.c
|
|
@@ -1879,42 +1879,116 @@ factory_component_added_cb (NMDeviceFactory *factory,
|
|
#define PLUGIN_PATH_TAG "NMManager-plugin-path"
|
|
#define PLUGIN_TYPEFUNC_TAG "typefunc"
|
|
|
|
-static void
|
|
-load_device_factories (NMManager *self)
|
|
+struct read_device_factory_paths_data {
|
|
+ char *path;
|
|
+ struct stat st;
|
|
+};
|
|
+
|
|
+static gint
|
|
+read_device_factory_paths_sort_fcn (gconstpointer a, gconstpointer b)
|
|
+{
|
|
+ const struct read_device_factory_paths_data *da = a;
|
|
+ const struct read_device_factory_paths_data *db = b;
|
|
+ time_t ta, tb;
|
|
+
|
|
+ ta = MAX (da->st.st_mtime, da->st.st_ctime);
|
|
+ tb = MAX (db->st.st_mtime, db->st.st_ctime);
|
|
+
|
|
+ if (ta < tb)
|
|
+ return 1;
|
|
+ if (ta > tb)
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static char**
|
|
+read_device_factory_paths ()
|
|
{
|
|
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
GDir *dir;
|
|
GError *error = NULL;
|
|
const char *item;
|
|
- char *path;
|
|
- GSList *iter;
|
|
+ GArray *paths;
|
|
+ char **result;
|
|
+ guint i;
|
|
|
|
dir = g_dir_open (NMPLUGINDIR, 0, &error);
|
|
if (!dir) {
|
|
- nm_log_warn (LOGD_HW, "Failed to open plugin directory %s: %s",
|
|
+ nm_log_warn (LOGD_HW, "device plugin: failed to open directory %s: %s",
|
|
NMPLUGINDIR,
|
|
(error && error->message) ? error->message : "(unknown)");
|
|
g_clear_error (&error);
|
|
- return;
|
|
+ return NULL;
|
|
}
|
|
|
|
+ paths = g_array_new (FALSE, FALSE, sizeof (struct read_device_factory_paths_data));
|
|
+
|
|
while ((item = g_dir_read_name (dir))) {
|
|
- GModule *plugin;
|
|
- NMDeviceFactory *factory;
|
|
- NMDeviceFactoryCreateFunc create_func;
|
|
- NMDeviceFactoryDeviceTypeFunc type_func;
|
|
- NMDeviceType dev_type;
|
|
- const char *found = NULL;
|
|
+ struct read_device_factory_paths_data data;
|
|
|
|
if (!g_str_has_prefix (item, PLUGIN_PREFIX))
|
|
continue;
|
|
if (g_str_has_suffix (item, ".la"))
|
|
continue;
|
|
|
|
- path = g_module_build_path (NMPLUGINDIR, item);
|
|
- g_assert (path);
|
|
- plugin = g_module_open (path, G_MODULE_BIND_LOCAL);
|
|
- g_free (path);
|
|
+ data.path = g_build_filename (NMPLUGINDIR, item, NULL);
|
|
+
|
|
+ if (stat (data.path, &data.st) != 0)
|
|
+ goto continue_with_error;
|
|
+ if (!S_ISREG (data.st.st_mode))
|
|
+ goto continue_silently;
|
|
+ if (data.st.st_uid != 0)
|
|
+ goto continue_with_error;
|
|
+ if (data.st.st_mode & (S_IWGRP | S_IWOTH | S_ISUID))
|
|
+ goto continue_with_error;
|
|
+
|
|
+ g_array_append_val (paths, data);
|
|
+ continue;
|
|
+
|
|
+continue_with_error:
|
|
+ nm_log_dbg (LOGD_HW, "device plugin: skip invalid file %s", data.path);
|
|
+continue_silently:
|
|
+ g_free (data.path);
|
|
+ }
|
|
+ g_dir_close (dir);
|
|
+
|
|
+ /* sort filenames by modification time. */
|
|
+ g_array_sort (paths, read_device_factory_paths_sort_fcn);
|
|
+
|
|
+ result = g_new (char *, paths->len + 1);
|
|
+ for (i = 0; i < paths->len; i++)
|
|
+ result[i] = g_array_index (paths, struct read_device_factory_paths_data, i).path;
|
|
+ result[i] = NULL;
|
|
+
|
|
+ g_array_free (paths, TRUE);
|
|
+ return result;
|
|
+}
|
|
+
|
|
+static void
|
|
+load_device_factories (NMManager *self)
|
|
+{
|
|
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
+ char **path;
|
|
+ char **paths;
|
|
+
|
|
+ paths = read_device_factory_paths ();
|
|
+ if (!paths)
|
|
+ return;
|
|
+
|
|
+ for (path = paths; *path; path++) {
|
|
+ GError *error = NULL;
|
|
+ GModule *plugin;
|
|
+ NMDeviceFactory *factory;
|
|
+ NMDeviceFactoryCreateFunc create_func;
|
|
+ NMDeviceFactoryDeviceTypeFunc type_func;
|
|
+ NMDeviceType dev_type;
|
|
+ const char *found = NULL;
|
|
+ GSList *iter;
|
|
+ const char *item;
|
|
+
|
|
+ item = strrchr (*path, '/');
|
|
+ g_assert (item);
|
|
+
|
|
+ plugin = g_module_open (*path, G_MODULE_BIND_LOCAL);
|
|
|
|
if (!plugin) {
|
|
nm_log_warn (LOGD_HW, "(%s): failed to load plugin: %s", item, g_module_error ());
|
|
@@ -1939,7 +2013,7 @@ load_device_factories (NMManager *self)
|
|
}
|
|
}
|
|
if (found) {
|
|
- nm_log_warn (LOGD_HW, "Found multiple device plugins for same type: %s vs %s",
|
|
+ nm_log_warn (LOGD_HW, "Found multiple device plugins for same type: use '%s' instead of '%s'",
|
|
found, g_module_name (plugin));
|
|
g_module_close (plugin);
|
|
continue;
|
|
@@ -1978,7 +2052,7 @@ load_device_factories (NMManager *self)
|
|
|
|
nm_log_info (LOGD_HW, "Loaded device plugin: %s", g_module_name (plugin));
|
|
};
|
|
- g_dir_close (dir);
|
|
+ g_strfreev (paths);
|
|
|
|
priv->factories = g_slist_reverse (priv->factories);
|
|
}
|
|
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
|
|
index f73ff32..7b11a6b 100644
|
|
--- a/src/platform/nm-linux-platform.c
|
|
+++ b/src/platform/nm-linux-platform.c
|
|
@@ -1584,7 +1584,9 @@ announce_object (NMPlatform *platform, const struct nl_object *object, NMPlatfor
|
|
*/
|
|
switch (change_type) {
|
|
case NM_PLATFORM_SIGNAL_REMOVED:
|
|
- check_cache_items (platform, priv->route_cache, address.ifindex);
|
|
+ check_cache_items (platform,
|
|
+ priv->route_cache,
|
|
+ rtnl_addr_get_ifindex ((struct rtnl_addr *) object));
|
|
break;
|
|
default:
|
|
break;
|
|
@@ -3500,7 +3502,8 @@ _route_match (struct rtnl_route *rtnlroute, int family, int ifindex)
|
|
rtnl_route_get_table (rtnlroute) != RT_TABLE_MAIN ||
|
|
rtnl_route_get_protocol (rtnlroute) == RTPROT_KERNEL ||
|
|
rtnl_route_get_family (rtnlroute) != family ||
|
|
- rtnl_route_get_nnexthops (rtnlroute) != 1)
|
|
+ rtnl_route_get_nnexthops (rtnlroute) != 1 ||
|
|
+ rtnl_route_get_flags (rtnlroute) & RTM_F_CLONED)
|
|
return FALSE;
|
|
|
|
nexthop = rtnl_route_nexthop_n (rtnlroute, 0);
|
|
diff --git a/vapi/NMClient-1.0.metadata b/vapi/NMClient-1.0.metadata
|
|
index 12f1469..2d894d8 100644
|
|
--- a/vapi/NMClient-1.0.metadata
|
|
+++ b/vapi/NMClient-1.0.metadata
|
|
@@ -1,6 +1,6 @@
|
|
-RemoteSettings.new_async skip
|
|
+RemoteSettings.new_finish symbol_type="function"
|
|
RemoteConnection.updated#virtual_method skip
|
|
-Client.new_async skip
|
|
+Client.new_finish symbol_type="function"
|
|
|
|
ACTIVE_CONNECTION_* cheader_filename="nm-active-connection.h" name="ACTIVE_CONNECTION_(.+)" parent="NM.ActiveConnection"
|
|
CLIENT_* cheader_filename="nm-client.h" name="CLIENT_(.+)" parent="NM.Client"
|