From 128c9d788f1ba50cc5b0de8faef543c7dadcfeb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 17 Jun 2013 14:29:45 +0200 Subject: [PATCH] libnm-util: verify() - can't set both IPv4 'disabled' and IPv6 'ignore' method --- libnm-util/nm-setting-ip4-config.c | 27 +++++++++++++++++++++++++++ libnm-util/nm-setting-ip6-config.c | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c index 6caf864a6..eb9ab9dcb 100644 --- a/libnm-util/nm-setting-ip4-config.c +++ b/libnm-util/nm-setting-ip4-config.c @@ -691,6 +691,15 @@ nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting) return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->may_fail; } +static gint +find_setting_by_name (gconstpointer a, gconstpointer b) +{ + NMSetting *setting = NM_SETTING (a); + const char *str = (const char *) b; + + return strcmp (nm_setting_get_name (setting), str); +} + static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { @@ -759,6 +768,24 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } + /* Disabled method is not allowed when IPv6 is set to 'ignore' */ + if (!strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) { + GSList *list = g_slist_find_custom (all_settings, NM_SETTING_IP6_CONFIG_SETTING_NAME, find_setting_by_name); + if (list) { + NMSettingIP6Config *s_ip6 = g_slist_nth_data (list, 0); + if ( s_ip6 + && !strcmp (nm_setting_ip6_config_get_method (s_ip6), NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) { + g_set_error (error, + NM_SETTING_IP4_CONFIG_ERROR, + NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, + _("IPv4 method '%s' is not allowed when IPv6 method 'ignore' is set"), + priv->method); + g_prefix_error (error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_SETTING_IP4_CONFIG_METHOD); + return FALSE; + } + } + } + if (priv->dhcp_client_id && !strlen (priv->dhcp_client_id)) { g_set_error_literal (error, NM_SETTING_IP4_CONFIG_ERROR, diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c index 950a70cfc..aae3ee706 100644 --- a/libnm-util/nm-setting-ip6-config.c +++ b/libnm-util/nm-setting-ip6-config.c @@ -675,6 +675,15 @@ nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting) return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ip6_privacy; } +static gint +find_setting_by_name (gconstpointer a, gconstpointer b) +{ + NMSetting *setting = NM_SETTING (a); + const char *str = (const char *) b; + + return strcmp (nm_setting_get_name (setting), str); +} + static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { @@ -743,6 +752,24 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } + /* Method 'ignore' is not allowed when IPv4 is set to 'disabled' */ + if (!strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) { + GSList *list = g_slist_find_custom (all_settings, NM_SETTING_IP4_CONFIG_SETTING_NAME, find_setting_by_name); + if (list) { + NMSettingIP4Config *s_ip4 = g_slist_nth_data (list, 0); + if ( s_ip4 + && !strcmp (nm_setting_ip4_config_get_method (s_ip4), NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) { + g_set_error (error, + NM_SETTING_IP6_CONFIG_ERROR, + NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, + _("IPv6 method '%s' is not allowed when IPv4 method 'disabled' is set"), + priv->method); + g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_METHOD); + return FALSE; + } + } + } + if (priv->dhcp_hostname && !strlen (priv->dhcp_hostname)) { g_set_error_literal (error, NM_SETTING_IP6_CONFIG_ERROR,