diff options
Diffstat (limited to 'src/settings')
| -rw-r--r-- | src/settings/nm-settings-connection.c | 5 | ||||
| -rw-r--r-- | src/settings/nm-settings-connection.h | 4 | ||||
| -rw-r--r-- | src/settings/nm-settings.c | 17 | ||||
| -rw-r--r-- | src/settings/plugins/ifcfg-rh/nm-ifdown | 3 | ||||
| -rw-r--r-- | src/settings/plugins/ifcfg-rh/nm-ifup | 3 | ||||
| -rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 151 | ||||
| -rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 25 |
7 files changed, 114 insertions, 94 deletions
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 6526abc7..50cc1427 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -3189,8 +3189,9 @@ static const NMDBusInterfaceInfoExtended interface_info_settings_connection = { &signal_info_removed, ), .properties = NM_DEFINE_GDBUS_PROPERTY_INFOS ( - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Unsaved", "b", NM_SETTINGS_CONNECTION_UNSAVED), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Flags", "u", NM_SETTINGS_CONNECTION_FLAGS), + NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Unsaved", "b", NM_SETTINGS_CONNECTION_UNSAVED), + NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Flags", "u", NM_SETTINGS_CONNECTION_FLAGS), + NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Filename", "s", NM_SETTINGS_CONNECTION_FILENAME), ), ), .legacy_property_changed = TRUE, diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h index 70518687..cd64f976 100644 --- a/src/settings/nm-settings-connection.h +++ b/src/settings/nm-settings-connection.h @@ -42,11 +42,11 @@ /* Properties */ #define NM_SETTINGS_CONNECTION_UNSAVED "unsaved" +#define NM_SETTINGS_CONNECTION_FLAGS "flags" +#define NM_SETTINGS_CONNECTION_FILENAME "filename" /* Internal properties */ #define NM_SETTINGS_CONNECTION_READY "ready" -#define NM_SETTINGS_CONNECTION_FLAGS "flags" -#define NM_SETTINGS_CONNECTION_FILENAME "filename" /** * NMSettingsConnectionIntFlags: diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 94018734..5bb629dc 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -653,7 +653,7 @@ plugin_loaded (GSList *list, const char *path) } static gboolean -load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error) +load_plugin (NMSettings *self, GSList **list, const char *pname, GError **error) { gs_free char *full_name = NULL; gs_free char *path = NULL; @@ -666,7 +666,7 @@ load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error) full_name = g_strdup_printf ("nm-settings-plugin-%s", pname); path = g_module_build_path (NMPLUGINDIR, full_name); - if (plugin_loaded (list, path)) + if (plugin_loaded (*list, path)) return TRUE; if (stat (path, &st) != 0) { @@ -719,7 +719,7 @@ load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error) g_object_set_qdata_full (obj, plugin_module_path_quark (), path, g_free); path = NULL; if (add_plugin (self, NM_SETTINGS_PLUGIN (obj))) - list = g_slist_append (list, g_steal_pointer (&obj)); + *list = g_slist_append (*list, g_steal_pointer (&obj)); return TRUE; } @@ -787,7 +787,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error) continue; } - success = load_plugin (self, list, pname, error); + success = load_plugin (self, &list, pname, error); if (!success) break; @@ -797,7 +797,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error) pname = "ibft"; add_ibft = FALSE; - success = load_plugin (self, list, "ibft", error); + success = load_plugin (self, &list, "ibft", error); if (!success) break; } @@ -886,6 +886,8 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data) g_object_unref (connection); check_startup_complete (self); + + g_object_unref (self); /* Balanced by a ref in claim_connection() */ } #define NM_DBUS_SERVICE_OPENCONNECT "org.freedesktop.NetworkManager.openconnect" @@ -998,6 +1000,11 @@ claim_connection (NMSettings *self, NMSettingsConnection *connection) _clear_connections_cached_list (priv); g_object_ref (connection); + /* FIXME(shutdown): The NMSettings instance can't be disposed + * while there is any exported connection. Ideally we should + * unexport all connections on NMSettings' disposal, but for now + * leak @self on termination when there are connections alive. */ + g_object_ref (self); priv->connections_len++; c_list_link_tail (&priv->connections_lst_head, &connection->_connections_lst); diff --git a/src/settings/plugins/ifcfg-rh/nm-ifdown b/src/settings/plugins/ifcfg-rh/nm-ifdown new file mode 100644 index 00000000..e7bd73ae --- /dev/null +++ b/src/settings/plugins/ifcfg-rh/nm-ifdown @@ -0,0 +1,3 @@ +#!/bin/sh +nmcli connection load "/etc/sysconfig/network-scripts/ifcfg-$1" && +exec nmcli connection down filename "/etc/sysconfig/network-scripts/ifcfg-$1" diff --git a/src/settings/plugins/ifcfg-rh/nm-ifup b/src/settings/plugins/ifcfg-rh/nm-ifup new file mode 100644 index 00000000..96637a92 --- /dev/null +++ b/src/settings/plugins/ifcfg-rh/nm-ifup @@ -0,0 +1,3 @@ +#!/bin/sh +nmcli connection load "/etc/sysconfig/network-scripts/ifcfg-$1" && +exec nmcli connection up filename "/etc/sysconfig/network-scripts/ifcfg-$1" diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 722d4e36..c1960846 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -1685,12 +1685,13 @@ make_ip6_setting (shvarFile *ifcfg, { NMSettingIPConfig *s_ip6 = NULL; const char *v; - char *value = NULL; - char *str_value; + gs_free char *value = NULL; char *route6_path = NULL; gboolean ipv6init, ipv6forwarding, dhcp6 = FALSE; char *method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL; - char *ipv6addr, *ipv6addr_secondaries; + const char *ipv6addr, *ipv6addr_secondaries; + gs_free char *ipv6addr_to_free = NULL; + gs_free char *ipv6addr_secondaries_to_free = NULL; gs_free const char **list = NULL; const char *const *iter; guint32 i; @@ -1716,13 +1717,16 @@ make_ip6_setting (shvarFile *ifcfg, * When both are set, the device specified in IPV6_DEFAULTGW takes preference. */ if (network_ifcfg) { - char *ipv6_defaultgw, *ipv6_defaultdev; - char *default_dev = NULL; + const char *ipv6_defaultgw, *ipv6_defaultdev; + gs_free char *ipv6_defaultgw_to_free = NULL; + gs_free char *ipv6_defaultdev_to_free = NULL; + const char *default_dev = NULL; /* Get the connection ifcfg device name and the global default route device */ - value = svGetValueStr_cp (ifcfg, "DEVICE"); - ipv6_defaultgw = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTGW"); - ipv6_defaultdev = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTDEV"); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "DEVICE", &value); + ipv6_defaultgw = svGetValueStr (network_ifcfg, "IPV6_DEFAULTGW", &ipv6_defaultgw_to_free); + ipv6_defaultdev = svGetValueStr (network_ifcfg, "IPV6_DEFAULTDEV", &ipv6_defaultdev_to_free); if (ipv6_defaultgw) { default_dev = strchr (ipv6_defaultgw, '%'); @@ -1735,66 +1739,64 @@ make_ip6_setting (shvarFile *ifcfg, /* If there was a global default route device specified, then only connections * for that device can be the default connection. */ - if (default_dev && value) - never_default = !!strcmp (value, default_dev); - - g_free (ipv6_defaultgw); - g_free (ipv6_defaultdev); - g_free (value); + if (default_dev && v) + never_default = !!strcmp (v, default_dev); } /* Find out method property */ /* Is IPV6 enabled? Set method to "ignored", when not enabled */ - str_value = svGetValueStr_cp (ifcfg, "IPV6INIT"); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6INIT", &value); ipv6init = svGetValueBoolean (ifcfg, "IPV6INIT", FALSE); - if (!str_value) { + if (!v) { if (network_ifcfg) ipv6init = svGetValueBoolean (network_ifcfg, "IPV6INIT", FALSE); } - g_free (str_value); if (!ipv6init) method = NM_SETTING_IP6_CONFIG_METHOD_IGNORE; /* IPv6 is disabled */ else { ipv6forwarding = svGetValueBoolean (ifcfg, "IPV6FORWARDING", FALSE); - str_value = svGetValueStr_cp (ifcfg, "IPV6_AUTOCONF"); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6_AUTOCONF", &value); dhcp6 = svGetValueBoolean (ifcfg, "DHCPV6C", FALSE); - if (!g_strcmp0 (str_value, "shared")) + if (!g_strcmp0 (v, "shared")) method = NM_SETTING_IP6_CONFIG_METHOD_SHARED; - else if (svParseBoolean (str_value, !ipv6forwarding)) + else if (svParseBoolean (v, !ipv6forwarding)) method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; else if (dhcp6) method = NM_SETTING_IP6_CONFIG_METHOD_DHCP; else { /* IPV6_AUTOCONF=no and no IPv6 address -> method 'link-local' */ - g_free (str_value); - str_value = svGetValueStr_cp (ifcfg, "IPV6ADDR"); - if (!str_value) - str_value = svGetValueStr_cp (ifcfg, "IPV6ADDR_SECONDARIES"); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6ADDR", &value); + if (!v) { + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6ADDR_SECONDARIES", &value); + } - if (!str_value) + if (!v) method = NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL; } - g_free (str_value); } /* TODO - handle other methods */ /* Read IPv6 Privacy Extensions configuration */ - str_value = svGetValueStr_cp (ifcfg, "IPV6_PRIVACY"); - if (str_value) { - ip6_privacy = svParseBoolean (str_value, FALSE); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6_PRIVACY", &value); + if (v) { + ip6_privacy = svParseBoolean (v, FALSE); if (!ip6_privacy) - ip6_privacy = (g_strcmp0 (str_value, "rfc4941") == 0) || - (g_strcmp0 (str_value, "rfc3041") == 0); + ip6_privacy = (g_strcmp0 (v, "rfc4941") == 0) || + (g_strcmp0 (v, "rfc3041") == 0); } ip6_privacy_prefer_public_ip = svGetValueBoolean (ifcfg, "IPV6_PRIVACY_PREFER_PUBLIC_IP", FALSE); - ip6_privacy_val = str_value ? + ip6_privacy_val = v ? (ip6_privacy ? (ip6_privacy_prefer_public_ip ? NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR : NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR) : NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED) : NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN; - g_free (str_value); /* the route table (policy routing) is ignored if we don't handle routes. */ route_table = svGetValueInt64 (ifcfg, "IPV6_ROUTE_TABLE", 10, @@ -1821,19 +1823,25 @@ make_ip6_setting (shvarFile *ifcfg, if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) == 0) return NM_SETTING (s_ip6); - value = svGetValueStr_cp (ifcfg, "DHCPV6_HOSTNAME"); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "DHCPV6_DUID", &value); + if (v) + g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_DHCP_DUID, v, NULL); + + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "DHCPV6_HOSTNAME", &value); /* Use DHCP_HOSTNAME as fallback if it is in FQDN format and ipv6.method is * auto or dhcp: this is required to support old ifcfg files */ - if (!value && ( !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) + if (!v && ( !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) || !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP))) { - value = svGetValueStr_cp (ifcfg, "DHCP_HOSTNAME"); - if (value && !strchr (value, '.')) - g_clear_pointer (&value, g_free); + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "DHCP_HOSTNAME", &value); + if (v && !strchr (v, '.')) + v = NULL; } - if (value) - g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL); - g_free (value); + if (v) + g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, v, NULL); g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, svGetValueBoolean (ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), NULL); @@ -1843,18 +1851,16 @@ make_ip6_setting (shvarFile *ifcfg, * added to the automatic ones. Note that this is not currently supported by * the legacy 'network' service (ifup-eth). */ - ipv6addr = svGetValueStr_cp (ifcfg, "IPV6ADDR"); - ipv6addr_secondaries = svGetValueStr_cp (ifcfg, "IPV6ADDR_SECONDARIES"); + ipv6addr = svGetValueStr (ifcfg, "IPV6ADDR", &ipv6addr_to_free); + ipv6addr_secondaries = svGetValueStr (ifcfg, "IPV6ADDR_SECONDARIES", &ipv6addr_secondaries_to_free); + nm_clear_g_free (&value); value = g_strjoin (ipv6addr && ipv6addr_secondaries ? " " : NULL, ipv6addr ?: "", ipv6addr_secondaries ?: "", NULL); - g_free (ipv6addr); - g_free (ipv6addr_secondaries); list = nm_utils_strsplit_set (value, " "); - g_free (value); for (iter = list, i = 0; iter && *iter; iter++, i++) { NMIPAddress *addr = NULL; @@ -1868,25 +1874,26 @@ make_ip6_setting (shvarFile *ifcfg, /* Gateway */ if (nm_setting_ip_config_get_num_addresses (s_ip6)) { - value = svGetValueStr_cp (ifcfg, "IPV6_DEFAULTGW"); - if (!value) { + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6_DEFAULTGW", &value); + if (!v) { /* If no gateway in the ifcfg, try global /etc/sysconfig/network instead */ - if (network_ifcfg) - value = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTGW"); + if (network_ifcfg) { + nm_clear_g_free (&value); + v = svGetValueStr (network_ifcfg, "IPV6_DEFAULTGW", &value); + } } - if (value) { + if (v) { char *ptr; - if ((ptr = strchr (value, '%')) != NULL) + if ((ptr = strchr (v, '%')) != NULL) *ptr = '\0'; /* remove %interface prefix if present */ - if (!nm_utils_ipaddr_valid (AF_INET6, value)) { + if (!nm_utils_ipaddr_valid (AF_INET6, v)) { g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "Invalid IP6 address '%s'", value); - g_free (value); + "Invalid IP6 address '%s'", v); goto error; } - g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, value, NULL); - g_free (value); + g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL); } } @@ -1900,11 +1907,10 @@ make_ip6_setting (shvarFile *ifcfg, g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, i_val, NULL); /* IPv6 tokenized interface identifier */ - str_value = svGetValueStr_cp (ifcfg, "IPV6_TOKEN"); - if (str_value) { - g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_TOKEN, str_value, NULL); - g_free (str_value); - } + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, "IPV6_TOKEN", &value); + if (v) + g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_TOKEN, v, NULL); /* DNS servers * Pick up just IPv6 addresses (IPv4 addresses are taken by make_ip4_setting()) @@ -1913,24 +1919,22 @@ make_ip6_setting (shvarFile *ifcfg, char tag[256]; numbered_tag (tag, "DNS", i); - value = svGetValueStr_cp (ifcfg, tag); - if (!value) { + nm_clear_g_free (&value); + v = svGetValueStr (ifcfg, tag, &value); + if (!v) { /* all done */ break; } - if (nm_utils_ipaddr_valid (AF_INET6, value)) { - if (!nm_setting_ip_config_add_dns (s_ip6, value)) + if (nm_utils_ipaddr_valid (AF_INET6, v)) { + if (!nm_setting_ip_config_add_dns (s_ip6, v)) PARSE_WARNING ("duplicate DNS server %s", tag); - } else if (nm_utils_ipaddr_valid (AF_INET, value)) { + } else if (nm_utils_ipaddr_valid (AF_INET, v)) { /* Ignore IPv4 addresses */ } else { - PARSE_WARNING ("invalid DNS server address %s", value); - g_free (value); + PARSE_WARNING ("invalid DNS server address %s", v); goto error; } - - g_free (value); } if (!routes_read) { @@ -1961,7 +1965,6 @@ make_ip6_setting (shvarFile *ifcfg, /* DNS options */ nm_clear_g_free (&value); parse_dns_options (s_ip6, svGetValue (ifcfg, "IPV6_RES_OPTIONS", &value)); - g_free (value); /* DNS priority */ priority = svGetValueInt64 (ifcfg, "IPV6_DNS_PRIORITY", 10, G_MININT32, G_MAXINT32, 0); @@ -4171,8 +4174,8 @@ parse_ethtool_options (shvarFile *ifcfg, NMSettingWired *s_wired, const char *va NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags, NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, ignore_wol_password ? NULL : wol_password, NM_SETTING_WIRED_AUTO_NEGOTIATE, autoneg, - NM_SETTING_WIRED_SPEED, autoneg ? 0 : speed, - NM_SETTING_WIRED_DUPLEX, autoneg ? NULL : duplex, + NM_SETTING_WIRED_SPEED, speed, + NM_SETTING_WIRED_DUPLEX, duplex, NULL); } diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index bdad7389..fdb2e10a 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -1135,6 +1135,9 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) /* Stuff ETHTOOL_OPT with required options */ str = NULL; auto_negotiate = nm_setting_wired_get_auto_negotiate (s_wired); + speed = nm_setting_wired_get_speed (s_wired); + duplex = nm_setting_wired_get_duplex (s_wired); + /* autoneg off + speed 0 + duplex NULL, means we want NM * to skip link configuration which is default. So write * down link config only if we have auto-negotiate true or @@ -1143,18 +1146,14 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) if (auto_negotiate) { str = g_string_sized_new (64); g_string_printf (str, "autoneg on"); - } else { - speed = nm_setting_wired_get_speed (s_wired); - duplex = nm_setting_wired_get_duplex (s_wired); - if (speed || duplex) { - str = g_string_sized_new (64); - g_string_printf (str, "autoneg off"); - if (speed) - g_string_append_printf (str, " speed %u", speed); - if (duplex) - g_string_append_printf (str, " duplex %s", duplex); - } + } else if (speed || duplex) { + str = g_string_sized_new (64); + g_string_printf (str, "autoneg off"); } + if (speed) + g_string_append_printf (str, " speed %u", speed); + if (duplex) + g_string_append_printf (str, " duplex %s", duplex); wol = nm_setting_wired_get_wake_on_lan (s_wired); wol_password = nm_setting_wired_get_wake_on_lan_password (s_wired); @@ -2568,6 +2567,7 @@ write_ip6_setting (NMConnection *connection, svUnsetValue (ifcfg, "IPV6INIT"); svUnsetValue (ifcfg, "IPV6_AUTOCONF"); svUnsetValue (ifcfg, "DHCPV6C"); + svUnsetValue (ifcfg, "DHCPv6_DUID"); svUnsetValue (ifcfg, "DHCPV6_HOSTNAME"); svUnsetValue (ifcfg, "DHCPV6_SEND_HOSTNAME"); svUnsetValue (ifcfg, "IPV6_DEFROUTE"); @@ -2608,6 +2608,9 @@ write_ip6_setting (NMConnection *connection, svUnsetValue (ifcfg, "DHCPV6C"); } + svSetValueStr (ifcfg, "DHCPV6_DUID", + nm_setting_ip6_config_get_dhcp_duid (NM_SETTING_IP6_CONFIG (s_ip6))); + write_ip6_setting_dhcp_hostname (s_ip6, ifcfg); /* Write out IP addresses */ |