pidgin: a084eb6a: Use DNSServiceGetAddrInfo() from dns_sd....
datallah at pidgin.im
datallah at pidgin.im
Sun Oct 3 22:40:54 EDT 2010
----------------------------------------------------------------------
Revision: a084eb6aec289bbbf44ac9666db8dc52f3143730
Parent: 7e5183fe9919cf8f56e3932bf3f85840361f1792
Author: datallah at pidgin.im
Date: 10/03/10 20:35:26
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/a084eb6aec289bbbf44ac9666db8dc52f3143730
Changelog:
Use DNSServiceGetAddrInfo() from dns_sd.h to resolve the IP for remote bonjour
users on Win32 instead of the libpurple resolving API. This way, we make sure
we're using the same interface as we received the presence notification on.
There is also some debug message improvement and using constants instead of
magic numbers in this commit.
Changes against parent 7e5183fe9919cf8f56e3932bf3f85840361f1792
patched libpurple/protocols/bonjour/dns_sd_proxy.c
patched libpurple/protocols/bonjour/dns_sd_proxy.h
patched libpurple/protocols/bonjour/mdns_win32.c
-------------- next part --------------
============================================================
--- libpurple/protocols/bonjour/dns_sd_proxy.h 405efc1890eaa51e7a27046d25b734208563dbd5
+++ libpurple/protocols/bonjour/dns_sd_proxy.h 8f967eb783ccc11ee3dbe070795a2f6016a3bcfa
@@ -51,6 +51,11 @@ int _wpurple_DNSServiceConstructFullName
#define DNSServiceConstructFullName(fullName, service, regtype, domain) \
_wpurple_DNSServiceConstructFullName(fullName, service, regtype, domain)
+DNSServiceErrorType _wpurple_DNSServiceGetAddrInfo(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context);
+#define DNSServiceGetAddrInfo(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context) \
+ _wpurple_DNSServiceGetAddrInfo(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context)
+
DNSServiceErrorType _wpurple_DNSServiceProcessResult(DNSServiceRef sdRef);
#define DNSServiceProcessResult(sdRef) \
_wpurple_DNSServiceProcessResult(sdRef);
============================================================
--- libpurple/protocols/bonjour/mdns_win32.c a04348e8d391b683d0b170c3b534b2bd4537d4e3
+++ libpurple/protocols/bonjour/mdns_win32.c 7ce6eea61f43d1359e7ffbee2e7971ee86e9527c
@@ -25,7 +25,6 @@
#include "buddy.h"
#include "mdns_interface.h"
#include "dns_sd_proxy.h"
-#include "dnsquery.h"
#include "mdns_common.h"
static GSList *pending_buddies = NULL;
@@ -65,7 +64,6 @@ typedef struct _ResolveCallbackArgs {
BonjourBuddy *bb;
Win32SvcResolverData *res_data;
gchar *full_service_name;
- PurpleDnsQueryData *dns_query;
} ResolveCallbackArgs;
@@ -135,7 +133,7 @@ _mdns_record_query_callback(DNSServiceRe
{
if (errorCode != kDNSServiceErr_NoError) {
- purple_debug_error("bonjour", "record query - callback error.\n");
+ purple_debug_error("bonjour", "record query - callback error (%d).\n", errorCode);
/* TODO: Probably should remove the buddy when this happens */
} else if (flags & kDNSServiceFlagsAdd) {
if (rrtype == kDNSServiceType_TXT) {
@@ -161,14 +159,22 @@ _mdns_record_query_callback(DNSServiceRe
}
}
-static void
-_mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message)
+static void DNSSD_API
+_mdns_resolve_host_callback(DNSServiceRef sdRef, DNSServiceFlags flags,
+ uint32_t interfaceIndex, DNSServiceErrorType errorCode,
+ const char *hostname, const struct sockaddr *address,
+ uint32_t ttl, void *context)
{
- ResolveCallbackArgs *args = (ResolveCallbackArgs*) data;
+ ResolveCallbackArgs *args = (ResolveCallbackArgs*) context;
Win32BuddyImplData *idata = args->bb->mdns_impl_data;
gboolean delete_buddy = FALSE;
PurpleBuddy *pb = NULL;
+ purple_input_remove(args->resolver_query->input_handler);
+ DNSServiceRefDeallocate(args->resolver_query->sdRef);
+ g_free(args->resolver_query);
+ args->resolver_query = NULL;
+
if ((pb = purple_find_buddy(args->account, args->res_data->name))) {
if (pb->proto_data != args->bb) {
purple_debug_error("bonjour", "Found purple buddy for %s not matching bonjour buddy record.",
@@ -181,12 +187,10 @@ _mdns_resolve_host_callback(GSList *host
goto cleanup;
}
- if (!hosts || !hosts->data) {
- purple_debug_error("bonjour", "host resolution - callback error.\n");
+ if (errorCode != kDNSServiceErr_NoError) {
+ purple_debug_error("bonjour", "host resolution - callback error (%d).\n", errorCode);
delete_buddy = TRUE;
} else {
- struct sockaddr_in *addr = g_slist_nth_data(hosts, 1);
- DNSServiceErrorType errorCode;
DNSServiceRef txt_query_sr;
/* finally, set up the continuous txt record watcher, and add the buddy to purple */
@@ -194,7 +198,7 @@ _mdns_resolve_host_callback(GSList *host
kDNSServiceInterfaceIndexAny, args->full_service_name, kDNSServiceType_TXT,
kDNSServiceClass_IN, _mdns_record_query_callback, args->bb);
if (errorCode == kDNSServiceErr_NoError) {
- const char *ip = inet_ntoa(addr->sin_addr);
+ const char *ip = inet_ntoa(((struct sockaddr_in *) address)->sin_addr);
purple_debug_info("bonjour", "Found buddy %s at %s:%d\n", args->bb->name, ip, args->bb->port_p2pj);
@@ -218,13 +222,6 @@ _mdns_resolve_host_callback(GSList *host
cleanup:
- /* free the hosts list*/
- while (hosts != NULL) {
- hosts = g_slist_remove(hosts, hosts->data);
- g_free(hosts->data);
- hosts = g_slist_remove(hosts, hosts->data);
- }
-
if (delete_buddy) {
idata->resolvers = g_slist_remove(idata->resolvers, args->res_data);
_cleanup_resolver_data(args->res_data);
@@ -259,17 +256,20 @@ _mdns_service_resolve_callback(DNSServic
/* remove the input fd and destroy the service ref */
purple_input_remove(args->resolver_query->input_handler);
DNSServiceRefDeallocate(args->resolver_query->sdRef);
- g_free(args->resolver_query);
- args->resolver_query = NULL;
if (errorCode != kDNSServiceErr_NoError)
- purple_debug_error("bonjour", "service resolver - callback error.\n");
+ purple_debug_error("bonjour", "service resolver - callback error. (%d)\n", errorCode);
else {
+ DNSServiceRef getaddrinfo_sr;
/* set more arguments, and start the host resolver */
-
- if ((args->dns_query =
- purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args)) != NULL) {
-
+ errorCode = DNSServiceGetAddrInfo(&getaddrinfo_sr, 0, interfaceIndex,
+ kDNSServiceProtocol_IPv4, hosttarget, _mdns_resolve_host_callback, args);
+ if (errorCode != kDNSServiceErr_NoError)
+ purple_debug_error("bonjour", "service resolver - host resolution failed.\n");
+ else {
+ args->resolver_query->sdRef = getaddrinfo_sr;
+ args->resolver_query->input_handler = purple_input_add(DNSServiceRefSockFD(getaddrinfo_sr),
+ PURPLE_INPUT_READ, _mdns_handle_event, args->resolver_query);
args->full_service_name = g_strdup(fullname);
/* TODO: Should this be per resolver? */
@@ -277,12 +277,14 @@ _mdns_service_resolve_callback(DNSServic
/* We don't want to hit the cleanup code */
return;
- } else
- purple_debug_error("bonjour", "service resolver - host resolution failed.\n");
+ }
}
/* If we get this far, clean up */
+ g_free(args->resolver_query);
+ args->resolver_query = NULL;
+
idata->resolvers = g_slist_remove(idata->resolvers, args->res_data);
_cleanup_resolver_data(args->res_data);
@@ -334,7 +336,7 @@ _mdns_service_browse_callback(DNSService
serviceName, interfaceIndex, regtype ? regtype : "",
replyDomain ? replyDomain : "");
- resErrorCode = DNSServiceResolve(&resolver_sr, 0, 0, serviceName, regtype,
+ resErrorCode = DNSServiceResolve(&resolver_sr, 0, interfaceIndex, serviceName, regtype,
replyDomain, _mdns_service_resolve_callback, args);
if (resErrorCode == kDNSServiceErr_NoError) {
GSList *tmp = pending_buddies;
@@ -483,7 +485,8 @@ gboolean _mdns_publish(BonjourDnsSd *dat
switch (type) {
case PUBLISH_START:
purple_debug_info("bonjour", "Registering presence on port %d\n", data->port_p2pj);
- errorCode = DNSServiceRegister(&presence_sr, 0, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME,
+ errorCode = DNSServiceRegister(&presence_sr, kDNSServiceInterfaceIndexAny,
+ 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME,
NULL, NULL, htons(data->port_p2pj), TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data),
_mdns_service_register_callback, NULL);
break;
@@ -522,8 +525,9 @@ gboolean _mdns_browse(BonjourDnsSd *data
g_return_val_if_fail(idata != NULL, FALSE);
- errorCode = DNSServiceBrowse(&browser_sr, 0, 0, LINK_LOCAL_RECORD_NAME, NULL,
- _mdns_service_browse_callback, data->account);
+ errorCode = DNSServiceBrowse(&browser_sr, 0, kDNSServiceInterfaceIndexAny,
+ LINK_LOCAL_RECORD_NAME, NULL,_mdns_service_browse_callback,
+ data->account);
if (errorCode == kDNSServiceErr_NoError) {
idata->browser_query = g_new(DnsSDServiceRefHandlerData, 1);
idata->browser_query->sdRef = browser_sr;
============================================================
--- libpurple/protocols/bonjour/dns_sd_proxy.c 1ff2db7339997a3b2a855a82652148cb085009aa
+++ libpurple/protocols/bonjour/dns_sd_proxy.c c6a1840185f75cb510f9978aeaeed9818d3690e1
@@ -28,6 +28,8 @@ static int (DNSSD_API* _DNSServiceConstr
static DNSServiceErrorType (DNSSD_API* _DNSServiceBrowse)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context);
static int (DNSSD_API* _DNSServiceConstructFullName)(char *fullName, const char *service, const char *regtype, const char *domain);
+static DNSServiceErrorType (DNSSD_API* _DNSServiceGetAddrInfo)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context);
static DNSServiceErrorType (DNSSD_API* _DNSServiceProcessResult)(DNSServiceRef sdRef);
static DNSServiceErrorType (DNSSD_API* _DNSServiceQueryRecord)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context);
@@ -47,6 +49,7 @@ static DNSServiceErrorType (DNSSD_API* _
static int16_t (DNSSD_API* _TXTRecordGetLength)(const TXTRecordRef *txtRecord);
static const void * (DNSSD_API* _TXTRecordGetValuePtr)(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen);
static DNSServiceErrorType (DNSSD_API* _TXTRecordSetValue)(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value);
+
#endif
gboolean dns_sd_available(void) {
@@ -59,6 +62,7 @@ gboolean dns_sd_available(void) {
if ((_DNSServiceAddRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceAddRecord"))
&& (_DNSServiceBrowse = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceBrowse"))
&& (_DNSServiceConstructFullName = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceConstructFullName"))
+ && (_DNSServiceGetAddrInfo = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceGetAddrInfo"))
&& (_DNSServiceProcessResult = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceProcessResult"))
&& (_DNSServiceQueryRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceQueryRecord"))
&& (_DNSServiceRefDeallocate = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefDeallocate"))
@@ -101,6 +105,12 @@ int _wpurple_DNSServiceConstructFullName
return (_DNSServiceConstructFullName)(fullName, service, regtype, domain);
}
+DNSServiceErrorType _wpurple_DNSServiceGetAddrInfo(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context) {
+ g_return_val_if_fail(_DNSServiceGetAddrInfo != NULL, 0);
+ return (_DNSServiceGetAddrInfo)(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context);
+}
+
DNSServiceErrorType _wpurple_DNSServiceProcessResult(DNSServiceRef sdRef) {
g_return_val_if_fail(_DNSServiceProcessResult != NULL, kDNSServiceErr_Unknown);
return (_DNSServiceProcessResult)(sdRef);
More information about the Commits
mailing list