--- a/lib/krb5/os/dnsglue.c +++ b/lib/krb5/os/dnsglue.c @@ -100,6 +100,41 @@ #else +#ifdef __ANDROID__ +#include +typedef int (*res_init_func_t)(void); +typedef int (*res_search_func_t)(const char *, int, int, unsigned char *, int); +static res_init_func_t res_init_func = res_init; +static res_search_func_t res_search_func = res_search; +#undef res_init +#undef res_search +static int res_funcs_initialized; + +int +res_init(void) +{ + if (!res_funcs_initialized) { + void *wrapper_handle = dlopen("libresolv_wrapper.so", RTLD_NOW); + if (wrapper_handle != NULL) { + res_init_func_t res_init_wrapper = dlsym(wrapper_handle, "res_init"); + res_search_func_t res_search_wrapper = dlsym(wrapper_handle, "res_search"); + if (res_init_wrapper != NULL && res_search_wrapper != NULL) { + res_init_func = res_init_wrapper; + res_search_func = res_search_wrapper; + } + } + res_funcs_initialized = 1; + } + return res_init_func(); +} + +int +res_search(const char *dname, int class, int type, unsigned char *answer, int anslen) +{ + return res_search_func(dname, class, type, answer, anslen); +} +#endif /* __ANDROID__ */ + /* Use res_init and res_search. */ #define DECLARE_HANDLE(h) #define INIT_HANDLE(h) (res_init() == 0) @@ -499,6 +534,9 @@ char * k5_primary_domain() { +#ifdef __ANDROID__ + return NULL; +#else char *domain; DECLARE_HANDLE(h); @@ -507,6 +545,7 @@ domain = PRIMARY_DOMAIN(h); DESTROY_HANDLE(h); return domain; +#endif } #endif /* not _WIN32 */