summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYouness Alaoui <kakaroto@kakaroto.homelinux.net>2014-11-15 16:17:58 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2015-01-30 18:35:30 -0500
commit925649e8c6ac8ce461fbf769dee0e2ce4d78e506 (patch)
tree2f26955a9948ab488a8103546a591c74bcaaddec
parentb7a36c0c0c4e5e48d6c97687cdf2dccd4c5f9565 (diff)
downloadlibnice-925649e8c6ac8ce461fbf769dee0e2ce4d78e506.tar.gz
Remove duplicate ips from nice_interfaces
OpenVPN creates a tun interface having the same IP assigned twice like: 9: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc ...100 link/none inet 10.222.111.10 peer 10.222.111.9/32 brd 10.222.111.10 scope global tun0 valid_lft forever preferred_lft forever inet 10.222.111.10/32 brd 10.222.111.10 scope global tun0 valid_lft forever preferred_lft forever This interface would generate two identical host candidates with the same value of foundation.
-rw-r--r--agent/interfaces.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/agent/interfaces.c b/agent/interfaces.c
index 6023fde..0ce16e4 100644
--- a/agent/interfaces.c
+++ b/agent/interfaces.c
@@ -195,6 +195,23 @@ nice_interfaces_is_private_ip (const struct sockaddr *_sa)
static gchar *
sockaddr_to_string (const struct sockaddr *addr);
+static GList *
+add_ip_to_list (GList *list, gchar *ip, gboolean append)
+{
+ GList *i;
+
+ for (i = list; i; i = i->next) {
+ gchar *addr = (gchar *) i->data;
+
+ if (g_strcmp0 (addr, ip) == 0)
+ return list;
+ }
+ if (append)
+ return g_list_append (list, ip);
+ else
+ return g_list_prepend (list, ip);
+}
+
GList *
nice_interfaces_get_local_ips (gboolean include_loopback)
{
@@ -229,16 +246,16 @@ nice_interfaces_get_local_ips (gboolean include_loopback)
nice_debug ("IP Address: %s", addr_string);
if ((ifa->ifa_flags & IFF_LOOPBACK) == IFF_LOOPBACK) {
if (include_loopback) {
- loopbacks = g_list_append (loopbacks, addr_string);
+ loopbacks = add_ip_to_list (loopbacks, addr_string, TRUE);
} else {
nice_debug ("Ignoring loopback interface");
g_free (addr_string);
}
} else {
if (nice_interfaces_is_private_ip (ifa->ifa_addr))
- ips = g_list_append (ips, addr_string);
+ ips = add_ip_to_list (ips, addr_string, TRUE);
else
- ips = g_list_prepend (ips, addr_string);
+ ips = add_ip_to_list (ips, addr_string, FALSE);
}
}
@@ -312,9 +329,9 @@ nice_interfaces_get_local_ips (gboolean include_loopback)
nice_debug ("Ignoring loopback interface");
} else {
if (nice_interfaces_is_private_ip (sa)) {
- ips = g_list_append (ips, g_strdup (inet_ntoa (sa->sin_addr)));
+ ips = add_ip_to_list (ips, g_strdup (inet_ntoa (sa->sin_addr)), TRUE);
} else {
- ips = g_list_prepend (ips, g_strdup (inet_ntoa (sa->sin_addr)));
+ ips = add_ip_to_list (ips, g_strdup (inet_ntoa (sa->sin_addr)), FALSE);
}
}
}
@@ -323,7 +340,7 @@ nice_interfaces_get_local_ips (gboolean include_loopback)
free (ifc.ifc_req);
if (loopback)
- ips = g_list_append (ips, loopback);
+ ips = add_ip_to_list (ips, loopback, TRUE);
return ips;
}