--- a/libpurple/network.c Tue Dec 15 22:04:13 2015 -0600
+++ b/libpurple/network.c Tue Dec 15 22:04:26 2015 -0600
@@ -21,6 +21,8 @@
#include <arpa/nameser.h>
@@ -46,7 +48,6 @@
@@ -976,41 +977,40 @@
-purple_network_ip_lookup_cb(GSList *hosts, gpointer data,
- const char *error_message)
- const gchar **ip = (const gchar **) data;
+purple_network_ip_lookup(const gchar *hostname) { + GResolver *resolver = NULL; + GList *addresses =NULL, *l = NULL; + GInetAddress *address = NULL;
- purple_debug_error("network", "lookup of IP address failed: %s\n",
+ resolver = g_resolver_get_default(); + addresses = g_resolver_lookup_by_name(resolver, hostname, NULL, &error); + if(addresses == NULL) { + purple_debug_info("network", "lookup of IP address failed: %s\n", error->message); - if (hosts && g_slist_next(hosts)) {
- common_sockaddr_t *addr = g_slist_next(hosts)->data;
- char dst[INET6_ADDRSTRLEN];
+ for(l = addresses; l; l = l->next) { + address = G_INET_ADDRESS(l->data); - if (addr->sa.sa_family == AF_INET6) {
- inet_ntop(addr->sa.sa_family, &addr->in6.sin6_addr,
- inet_ntop(addr->sa.sa_family, &addr->in.sin_addr,
+ if(!g_inet_address_get_is_loopback(address) && !g_inet_address_get_is_link_local(address)) {
- purple_debug_info("network", "set IP address: %s\n", *ip);
- while (hosts != NULL) {
- hosts = g_slist_delete_link(hosts, hosts);
- hosts = g_slist_delete_link(hosts, hosts);
+ g_object_ref(G_OBJECT(address)); + g_resolver_free_addresses(addresses); @@ -1018,9 +1018,17 @@
if (stun_server && stun_server[0] != '\0') {
if (purple_network_is_available()) {
+ GInetAddress *address = NULL; purple_debug_info("network", "running DNS query for STUN server\n");
- purple_dnsquery_a(NULL, stun_server, 3478, purple_network_ip_lookup_cb,
+ address = purple_network_ip_lookup(stun_server); + stun_ip = g_inet_address_to_string(address); + g_object_unref(G_OBJECT(address)); purple_debug_info("network",
"network is unavailable, don't try to update STUN IP");
@@ -1036,10 +1044,17 @@
if (turn_server && turn_server[0] != '\0') {
if (purple_network_is_available()) {
+ GInetAddress *address = NULL; purple_debug_info("network", "running DNS query for TURN server\n");
- purple_dnsquery_a(NULL, turn_server,
- purple_prefs_get_int("/purple/network/turn_port"),
- purple_network_ip_lookup_cb, &turn_ip);
+ address = purple_network_ip_lookup(turn_server); + turn_ip = g_inet_address_to_string(address); + g_object_unref(G_OBJECT(address)); purple_debug_info("network",
"network is unavailable, don't try to update TURN IP");