--- a/libpurple/protocols/jabber/disco.c Fri Dec 18 18:25:55 2015 -0600 +++ b/libpurple/protocols/jabber/disco.c Fri Dec 18 18:26:12 2015 -0600 @@ -419,77 +419,39 @@ } -/* should probably share this code with google.c, or maybe from 2.7.0 - introduce an abstracted hostname -> IP function in dns.c */ static void -jabber_disco_stun_lookup_cb(GSList *hosts, gpointer data, - const char *error_message) -{ +jabber_disco_stun_srv_resolve_cb(GObject *sender, GAsyncResult *result, gpointer data) { + GError *error = NULL; + GList *services = NULL; JabberStream *js = (JabberStream *) data; + gint results = 0; - if (error_message) { - purple_debug_error("jabber", "STUN lookup failed: %s\n", - error_message); - g_slist_free(hosts); - js->stun_query = NULL; + services = g_resolver_lookup_service_finish(g_resolver_get_default(), result, &error); + + if(error != NULL) { + purple_debug_info("jabber", "Failed to look up a STUN record : %s\n", error->message); + + g_error_free(error); + return; } - if (hosts && g_slist_next(hosts)) { - common_sockaddr_t addr; - char dst[INET6_ADDRSTRLEN]; - int port; + results = g_list_length(services); - memcpy(&addr, g_slist_next(hosts)->data, sizeof(addr)); + purple_debug_info("jabber", "got %d SRV responses for STUN.\n", results); - if (addr.sa.sa_family == AF_INET6) { - inet_ntop(addr.sa.sa_family, &addr.in6.sin6_addr, - dst, sizeof(dst)); - port = ntohs(addr.in6.sin6_port); - } else { - inet_ntop(addr.sa.sa_family, &addr.in.sin_addr, - dst, sizeof(dst)); - port = ntohs(addr.in.sin_port); - } + if (results > 0) { + GSrvTarget *target = (GSrvTarget *)services->data; + const gchar *hostname = g_srv_target_get_hostname(target); - if (js->stun_ip) - g_free(js->stun_ip); - js->stun_ip = g_strdup(dst); - js->stun_port = port; + js->stun_ip = g_strdup(hostname); + js->stun_port = g_srv_target_get_port(target); - purple_debug_info("jabber", "set STUN IP/port address: " - "%s:%d\n", dst, port); - - /* unmark ongoing query */ - js->stun_query = NULL; + purple_debug_info("jabber", "set stun address to %s:%d\n", + hostname, js->stun_port); } - while (hosts != NULL) { - hosts = g_slist_delete_link(hosts, hosts); - /* Free the address */ - g_free(hosts->data); - hosts = g_slist_delete_link(hosts, hosts); - } -} - - -static void -jabber_disco_stun_srv_resolve_cb(PurpleSrvResponse *resp, int results, gpointer data) -{ - JabberStream *js = (JabberStream *) data; - - purple_debug_info("jabber", "got %d SRV responses for STUN.\n", results); - js->srv_query_data = NULL; - - if (results > 0) { - PurpleAccount *account; - purple_debug_info("jabber", "looking up IP for %s:%d\n", - resp[0].hostname, resp[0].port); - account = purple_connection_get_account(js->gc); - js->stun_query = - purple_dnsquery_a(account, resp[0].hostname, resp[0].port, - jabber_disco_stun_lookup_cb, js); - } + g_resolver_free_targets(services); } @@ -553,11 +515,14 @@ } } else if (purple_network_get_stun_ip() == NULL || purple_strequal(purple_network_get_stun_ip(), "")) { - js->srv_query_data = - purple_srv_resolve( - purple_connection_get_account(js->gc), "stun", "udp", - js->user->domain, - jabber_disco_stun_srv_resolve_cb, js); + + g_resolver_lookup_service_async(g_resolver_get_default(), + "stun", + "udp", + js->user->domain, + NULL, + jabber_disco_stun_srv_resolve_cb, + js); /* TODO: add TURN support later... */ } }