diff --git a/configure.ac b/configure.ac index 94b0758..e61657d 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ dnl The NM version number m4_define([nm_major_version], [0]) m4_define([nm_minor_version], [9]) m4_define([nm_micro_version], [10]) -m4_define([nm_nano_version], [0]) +m4_define([nm_nano_version], [1]) m4_define([nm_version], [nm_major_version.nm_minor_version.nm_micro_version.nm_nano_version]) m4_define([nm_git_sha], [m4_esyscmd([ ( [ -d ./.git/ ] && [ "$(readlink -f ./.git/)" = "$(readlink -f "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null)" ] && git rev-parse --verify -q HEAD 2>/dev/null ) || true ])]) 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"