---
 src/nm-policy-hosts.c |   54 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/src/nm-policy-hosts.c b/src/nm-policy-hosts.c
index 0403b03..e7d20bd 100644
--- a/src/nm-policy-hosts.c
+++ b/src/nm-policy-hosts.c
@@ -63,6 +63,41 @@ is_local_mapping (const char *str, gboolean ip6, const char 
*hostname)
                && nm_policy_hosts_find_token (str, hostname ? hostname : 
fallback));
 }
 
+static void
+add_local_mapping (GString *contents, const char *line, gboolean ip6,
+        const char *fallback, const char *hostname, const char *short_hostname)
+{
+       const char *addr = ip6 ? "::1" : "127.0.0.1";
+       const char *short_fallback = ip6 ? "localhost6" : "localhost";
+       const char *start, *p;
+       gboolean add_line = FALSE;
+
+       start = line + strlen (addr);
+       p = start;
+       /* Walk through the line to find the next whitespace character */
+       while (p <= line + strlen (line)) {
+               if (isblank (*p) || (*p == '\0')) {
+                       if ((p > start) && *start &&
+                                       /* Skip fallback and hostname tokens */
+                                       strncmp (start, short_fallback, p - 
start) &&
+                                       (!fallback || strncmp (start, fallback, 
p - start)) &&
+                                       (!short_hostname || strncmp (start, 
short_hostname, p - start)) &&
+                                       (!hostname || strncmp (start, hostname, 
p - start))) {
+                               if (!add_line) {
+                                       g_string_append (contents, addr);
+                                       add_line = TRUE;
+                               }
+                               g_string_append_c (contents, '\t');
+                               g_string_append_len (contents, start, p - 
start);
+                       }
+                       start = p + 1;
+               }
+               p++;
+       }
+       if (add_line)
+               g_string_append_c (contents, '\n');
+}
+
 static gboolean
 ip4_addr_matches (const char *str, const char *ip4_addr)
 {
@@ -283,18 +318,17 @@ nm_policy_get_etc_hosts (const char **lines,
                }
 
                /* Don't add the original line if it is a localhost mapping */
-               if (is_local_mapping (*line, FALSE, "localhost"))
-                       add_line = FALSE;
-               else if (is_local_mapping (*line, FALSE, fallback_hostname4))
+               if (is_local_mapping (*line, FALSE, "localhost") ||
+                               is_local_mapping (*line, FALSE, 
fallback_hostname4) ||
+                               is_local_mapping (*line, FALSE, hostname)) {
+                       add_local_mapping (contents, *line, FALSE, 
fallback_hostname4, hostname, short_hostname);
                        add_line = FALSE;
-               else if (is_local_mapping (*line, FALSE, hostname))
-                       add_line = FALSE;
-               else if (is_local_mapping (*line, TRUE, "localhost6"))
-                       add_line = FALSE;
-               else if (is_local_mapping (*line, TRUE, fallback_hostname6))
-                       add_line = FALSE;
-               else if (is_local_mapping (*line, TRUE, hostname))
+               } else if (is_local_mapping (*line, TRUE, "localhost6") ||
+                               is_local_mapping (*line, TRUE, 
fallback_hostname6) ||
+                               is_local_mapping (*line, TRUE, hostname)) {
+                       add_local_mapping (contents, *line, TRUE, 
fallback_hostname6, hostname, short_hostname);
                        add_line = FALSE;
+               }
 
                if (add_line && !strstr (*line, ADDED_TAG)) {
                        g_string_append (contents, *line);
-- 
1.7.2.3

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to