blob: 05c92c10cf1963b31a219ad79d233ee8550b5762 [file] [log] [blame]
/**
* @file darwin/srv.c Get DNS Server IP code for Mac OS X
*
* Copyright (C) 2010 Creytiv.com
*/
#include <re_types.h>
#include <re_fmt.h>
#include <re_mbuf.h>
#include <re_list.h>
#include <re_sa.h>
#include <re_dns.h>
#include "../dns.h"
#define __CF_USE_FRAMEWORK_INCLUDES__
#include <SystemConfiguration/SystemConfiguration.h>
int get_darwin_dns(char *domain, size_t dsize, struct sa *nsv, uint32_t *n)
{
#if TARGET_OS_IPHONE
(void)domain;
(void)dsize;
(void)nsv;
(void)n;
return ENOSYS;
#else
SCDynamicStoreContext context = {0, NULL, NULL, NULL, NULL};
CFArrayRef addresses, domains;
SCDynamicStoreRef store;
CFStringRef key, dom;
CFDictionaryRef dict;
uint32_t c, i;
int err = ENOENT;
if (!nsv || !n)
return EINVAL;
store = SCDynamicStoreCreate(NULL, CFSTR("get_darwin_dns"),
NULL, &context);
if (!store)
return ENOENT;
key = CFSTR("State:/Network/Global/DNS");
dict = SCDynamicStoreCopyValue(store, key);
if (!dict)
goto out1;
addresses = CFDictionaryGetValue(dict, kSCPropNetDNSServerAddresses);
if (!addresses)
goto out;
c = (uint32_t)CFArrayGetCount(addresses);
*n = min(*n, c);
for (i=0; i<*n; i++) {
CFStringRef address = CFArrayGetValueAtIndex(addresses, i);
char str[64];
CFStringGetCString(address, str, sizeof(str),
kCFStringEncodingUTF8);
err = sa_set_str(&nsv[i], str, DNS_PORT);
if (err)
break;
}
domains = CFDictionaryGetValue(dict, kSCPropNetDNSSearchDomains);
if (!domains)
goto out;
if (CFArrayGetCount(domains) < 1)
goto out;
dom = CFArrayGetValueAtIndex(domains, 0);
CFStringGetCString(dom, domain, dsize, kCFStringEncodingUTF8);
out:
CFRelease(dict);
out1:
CFRelease(store);
return err;
#endif
}