commit bbf3f12d7b2c79c49d87d41e6cf7b65ac7782071 Author: Dan Williams Date: Thu Oct 7 18:24:59 2010 -0500 policy: prevent hostname duplication in /etc/hosts diff --git a/src/nm-policy-hosts.c b/src/nm-policy-hosts.c index ddc828d..a6bb083 100644 --- a/src/nm-policy-hosts.c +++ b/src/nm-policy-hosts.c @@ -143,7 +143,9 @@ ip6_addr_matches (const char *str, const char *ip6_addr) static char * get_custom_hostnames (const char *line, const char *hostname, - const char *old_hostname) + const char *old_hostname, + const char *short_hostname, + const char *fallback_hostname) { char **items = NULL, **iter; guint start = 0; @@ -173,6 +175,10 @@ get_custom_hostnames (const char *line, continue; if (old_hostname && !strcmp (*iter, old_hostname)) continue; + if (short_hostname && !strcmp (*iter, short_hostname)) + continue; + if (fallback_hostname && !strcmp (*iter, fallback_hostname)) + continue; if (!strcmp (*iter, "localhost")) continue; if (!strcmp (*iter, "localhost6")) @@ -236,6 +242,24 @@ nm_policy_get_etc_hosts (const char **lines, hostname4_is_fallback = !strcmp (hostname, fallback_hostname4); hostname6_is_fallback = !strcmp (hostname, fallback_hostname6); + /* Find the short hostname, like 'foo' from 'foo.bar.baz'; we want to + * make sure that the entries we add for this host also include the short + * hostname too so that if the resolver does not answer queries for the + * machine's actual hostname/domain, that stuff like 'ping foo' still works. + */ + if (!hostname4_is_fallback || !hostname6_is_fallback) { + char *dot; + + short_hostname = g_strdup (hostname); + dot = strchr (short_hostname, '.'); + if (dot && *(dot+1)) + *dot = '\0'; + else { + g_free (short_hostname); + short_hostname = NULL; + } + } + /* We need the following in /etc/hosts: * * 1) current hostname mapped to current IPv4 addresses if IPv4 is active @@ -299,7 +323,7 @@ nm_policy_get_etc_hosts (const char **lines, if (is_local_mapping (*line, FALSE, "localhost")) { /* a 127.0.0.1 line containing 'localhost' */ found_localhost4 = TRUE; - custom4 = get_custom_hostnames (*line, hostname, old_hostname); + custom4 = get_custom_hostnames (*line, hostname, old_hostname, short_hostname, fallback_hostname4); if (!ip4_addr) { /* If there's no IP-specific mapping for the current hostname * but that hostname is present on in the local mapping line, @@ -313,7 +337,7 @@ nm_policy_get_etc_hosts (const char **lines, } else if (is_local_mapping (*line, TRUE, "localhost6")) { /* a ::1 line containing 'localhost6' */ found_localhost6 = TRUE; - custom6 = get_custom_hostnames (*line, hostname, old_hostname); + custom6 = get_custom_hostnames (*line, hostname, old_hostname, short_hostname, fallback_hostname6); if (!ip6_addr) { /* If there's no IP-specific mapping for the current hostname * but that hostname is present on in the local mapping line, @@ -342,24 +366,6 @@ nm_policy_get_etc_hosts (const char **lines, goto out; } - /* Find the short hostname, like 'foo' from 'foo.bar.baz'; we want to - * make sure that the entries we add for this host also include the short - * hostname too so that if the resolver does not answer queries for the - * machine's actual hostname/domain, that stuff like 'ping foo' still works. - */ - if (!hostname4_is_fallback || !hostname6_is_fallback) { - char *dot; - - short_hostname = g_strdup (hostname); - dot = strchr (short_hostname, '.'); - if (dot && *(dot+1)) - *dot = '\0'; - else { - g_free (short_hostname); - short_hostname = NULL; - } - } - /* Construct the new hosts file; replace any 127.0.0.1/::1 entry that is * at the beginning of the file or right after initial comments and contains * the string 'localhost' (for IPv4) or 'localhost6' (for IPv6). If there