#include <netdb_async.h>
#include "CFNetworkInternal.h"
#include <sys/errno.h>
#include <mach-o/dyld.h>
#ifndef DYNAMICALLY_LOAD_LIBRESOLV
#define DYNAMICALLY_LOAD_LIBRESOLV 1
#endif
#if DYNAMICALLY_LOAD_LIBRESOLV
static const void* libresolv = NULL;
static int32_t returns_int32(void) { return EFAULT; }
#define GET_DYNAMIC_SYMBOL(sym, rettype, arglist, alt) \
static rettype (* sym##_proc)arglist = NULL; \
if (sym##_proc == NULL) { \
if (libresolv || (libresolv = __CFNetworkLoadFramework("/usr/lib/libresolv.9.dylib"))) \
sym##_proc = (rettype(*)arglist)NSAddressOfSymbol(NSLookupSymbolInImage(libresolv, "_"#sym, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND)); \
if (! sym##_proc) sym##_proc = (rettype(*)arglist)alt; \
}
int32_t
dns_async_start(mach_port_t *p, const char *name, uint16_t dnsclass, uint16_t dnstype, uint32_t do_search, dns_async_callback callback, void *context) {
GET_DYNAMIC_SYMBOL(dns_async_start, int32_t, (mach_port_t*, const char*, uint16_t, uint16_t, uint32_t, dns_async_callback, void*), returns_int32);
return (*dns_async_start_proc)(p, name, dnsclass, dnstype, do_search, callback, context);
}
int32_t
dns_async_handle_reply(void *msg) {
GET_DYNAMIC_SYMBOL(dns_async_handle_reply, int32_t, (void*), returns_int32);
return (*dns_async_handle_reply_proc)(msg);
}
#undef GET_DYNAMIC_SYMBOL
#endif