libpurple/protocols/jabber/disco.c

branch
use-gresolver
changeset 37457
0b957b80c46a
parent 35676
d9fdd45925ec
child 37466
ef015fb22744
--- 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... */
 		}
 	}

mercurial