#include "DNSLookups.h"
CFMutableArrayRef ParseServiceResults( dns_reply_t *answer )
{
CFMutableArrayRef cfArray = 0;
if (answer != NULL)
{
dns_SRV_record_t *srv;
int index = 0;
if ( (answer->header != NULL) && (answer->header->ancount > 0) )
{
cfArray = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
while( index < answer->header->ancount )
{
if ( answer->answer[index] != NULL)
{
srv = answer->answer[index]->data.SRV;
if ( (srv != NULL) && (srv->target != NULL) )
{
CFNumberRef cfNumber = 0;
CFMutableDictionaryRef cfDict = CFDictionaryCreateMutable( kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFStringRef cfStringRef = 0;
cfStringRef = CFStringCreateWithCString( kCFAllocatorDefault, srv->target, kCFStringEncodingUTF8 );
CFDictionarySetValue( cfDict, CFSTR("Host"), cfStringRef );
CFRelease(cfStringRef);
cfNumber = CFNumberCreate(kCFAllocatorDefault,kCFNumberShortType,&(srv->port));
CFDictionarySetValue( cfDict, CFSTR("Port"), cfNumber );
CFRelease(cfNumber);
cfNumber = CFNumberCreate(kCFAllocatorDefault,kCFNumberShortType,&(srv->weight));
CFDictionarySetValue( cfDict, CFSTR("Weight"), cfNumber );
CFRelease(cfNumber);
cfNumber = CFNumberCreate(kCFAllocatorDefault,kCFNumberShortType,&(srv->priority));
CFDictionarySetValue( cfDict, CFSTR("Priority"), cfNumber );
CFRelease(cfNumber);
CFArrayAppendValue(cfArray, cfDict);
CFRelease(cfDict);
}
}
index++;
}
}
dns_free_reply( answer );
}
return(cfArray);
}
dns_reply_t *doDNSLookup( const char *inType, const char *inQuery )
{
uint16_t type = 0;
uint16_t classtype = 0;
dns_handle_t dns = dns_open(NULL);
dns_reply_t *outReply = NULL;
if( dns ) {
dns_type_number( inType, &type );
dns_class_number( "IN", &classtype );
dns_set_buffer_size( dns, 256*1024 );
outReply = dns_lookup( dns, inQuery, classtype, type );
dns_free( dns );
}
return outReply;
}
CFMutableArrayRef getDNSServiceRecs( const char *type, const char *domain )
{
char *service;
dns_reply_t *answer;
CFMutableArrayRef finalResults = 0;
if ( type != NULL)
{
service = (char *)calloc(1, 256);
if( domain != NULL )
{
snprintf( service, 256, "_%s._tcp.%s.", type, domain );
}
else
{
snprintf( service, 256, "_%s._tcp", type );
}
answer = doDNSLookup( "SRV", service );
free(service);
service = NULL;
finalResults = ParseServiceResults( answer ); }
return(finalResults);
}