113 lines
2.6 KiB
Diff
113 lines
2.6 KiB
Diff
--- a/src/resolv_wrapper.c
|
|
+++ b/src/resolv_wrapper.c
|
|
@@ -51,6 +51,17 @@
|
|
#include <ctype.h>
|
|
|
|
#include <resolv.h>
|
|
+#include "resolv_private.h"
|
|
+
|
|
+#if __ANDROID_API__ >= 29
|
|
+#define HAVE_RES_RANDOMID 1
|
|
+#else
|
|
+#undef HAVE_RES_RANDOMID
|
|
+#undef res_randomid
|
|
+static u_int res_randomid(void);
|
|
+#include <fcntl.h>
|
|
+#include <sys/time.h>
|
|
+#endif
|
|
|
|
#if defined(HAVE_RES_STATE_U_EXT_NSADDRS) || defined(HAVE_RES_SOCKADDR_UNION_SIN6)
|
|
#define HAVE_RESOLV_IPV6_NSADDRS 1
|
|
@@ -74,7 +85,7 @@
|
|
#endif /* RWRAP_DEFAULT_FAKE_TTL */
|
|
|
|
#ifndef HAVE_NS_NAME_COMPRESS
|
|
-#define ns_name_compress dn_comp
|
|
+#define ns_name_compress __dn_comp
|
|
#endif
|
|
|
|
#define ns_t_uri 256
|
|
@@ -1944,6 +1955,8 @@
|
|
* RES_NINIT
|
|
***************************************************************************/
|
|
|
|
+static const char *const resolv_conf_default = "@TERMUX_PREFIX@/etc/resolv.conf";
|
|
+
|
|
static int rwrap_res_ninit(struct __res_state *state)
|
|
{
|
|
int rc;
|
|
@@ -1952,6 +1965,10 @@
|
|
if (rc == 0) {
|
|
const char *resolv_conf = getenv("RESOLV_WRAPPER_CONF");
|
|
|
|
+ if (resolv_conf == NULL) {
|
|
+ resolv_conf = resolv_conf_default;
|
|
+ }
|
|
+
|
|
if (resolv_conf != NULL) {
|
|
rc = rwrap_parse_resolv_conf(state, resolv_conf);
|
|
}
|
|
@@ -1984,6 +2001,7 @@
|
|
return rc;
|
|
}
|
|
|
|
+#ifndef __ANDROID__
|
|
#if !defined(res_ninit) && defined(HAVE_RES_INIT)
|
|
int res_init(void)
|
|
#elif defined(HAVE___RES_INIT)
|
|
@@ -1992,6 +2010,7 @@
|
|
{
|
|
return rwrap_res_init();
|
|
}
|
|
+#endif
|
|
|
|
/****************************************************************************
|
|
* RES_NCLOSE
|
|
@@ -2222,3 +2241,46 @@
|
|
{
|
|
return rwrap_res_search(dname, class, type, answer, anslen);
|
|
}
|
|
+
|
|
+#ifndef HAVE_RES_RANDOMID
|
|
+#ifdef ANDROID_CHANGES
|
|
+static int
|
|
+real_randomid(u_int *random_value) {
|
|
+ /* open the nonblocking random device, returning -1 on failure */
|
|
+ int random_device = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
|
+ if (random_device < 0) {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ /* read from the random device, returning -1 on failure (or too many retries)*/
|
|
+ for (u_int retry = 5; retry > 0; retry--) {
|
|
+ int retval = read(random_device, random_value, sizeof(u_int));
|
|
+ if (retval == sizeof(u_int)) {
|
|
+ *random_value &= 0xffff;
|
|
+ close(random_device);
|
|
+ return 0;
|
|
+ } else if ((retval < 0) && (errno != EINTR)) {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ close(random_device);
|
|
+ return -1;
|
|
+}
|
|
+#endif /* ANDROID_CHANGES */
|
|
+
|
|
+static u_int
|
|
+res_randomid(void) {
|
|
+#ifdef ANDROID_CHANGES
|
|
+ int status = 0;
|
|
+ u_int output = 0;
|
|
+ status = real_randomid(&output);
|
|
+ if (status != -1) {
|
|
+ return output;
|
|
+ }
|
|
+#endif /* ANDROID_CHANGES */
|
|
+ struct timeval now;
|
|
+ gettimeofday(&now, NULL);
|
|
+ return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid()));
|
|
+}
|
|
+#endif
|