resolv: Unify sockaddr union
Merge the following unions into a single union.
sockaddr_union
_sockaddr_union
res_sockaddr_union
Test: netd_{unit,integration}_test pass
Change-Id: I46685e7380dd25070ccd9eaf5387efde91cded8a
diff --git a/resolv/getaddrinfo.cpp b/resolv/getaddrinfo.cpp
index e4a850a..f1aff7a 100644
--- a/resolv/getaddrinfo.cpp
+++ b/resolv/getaddrinfo.cpp
@@ -101,12 +101,6 @@
#include "resolv_cache.h"
#include "resolv_private.h"
-typedef union sockaddr_union {
- struct sockaddr generic;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
-} sockaddr_union;
-
#define ANY 0
static const char in_addrany[] = {0, 0, 0, 0};
@@ -300,8 +294,8 @@
.sin6_family = AF_INET6,
.sin6_addr.s6_addr = {// 2000::
0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
- sockaddr_union addr = {.in6 = sin6_test};
- return _find_src_addr(&addr.generic, NULL, mark, uid) == 1;
+ sockaddr_union addr = {.sin6 = sin6_test};
+ return _find_src_addr(&addr.sa, NULL, mark, uid) == 1;
}
static int _have_ipv4(unsigned mark, uid_t uid) {
@@ -309,8 +303,8 @@
.sin_family = AF_INET,
.sin_addr.s_addr = __constant_htonl(0x08080808L) // 8.8.8.8
};
- sockaddr_union addr = {.in = sin_test};
- return _find_src_addr(&addr.generic, NULL, mark, uid) == 1;
+ sockaddr_union addr = {.sin = sin_test};
+ return _find_src_addr(&addr.sa, NULL, mark, uid) == 1;
}
bool readBE32(FILE* fp, int32_t* result) {
@@ -1258,11 +1252,11 @@
}
/* Rule 2: Prefer matching scope. */
- scope_src1 = _get_scope(&a1->src_addr.generic);
+ scope_src1 = _get_scope(&a1->src_addr.sa);
scope_dst1 = _get_scope(a1->ai->ai_addr);
scope_match1 = (scope_src1 == scope_dst1);
- scope_src2 = _get_scope(&a2->src_addr.generic);
+ scope_src2 = _get_scope(&a2->src_addr.sa);
scope_dst2 = _get_scope(a2->ai->ai_addr);
scope_match2 = (scope_src2 == scope_dst2);
@@ -1281,11 +1275,11 @@
*/
/* Rule 5: Prefer matching label. */
- label_src1 = _get_label(&a1->src_addr.generic);
+ label_src1 = _get_label(&a1->src_addr.sa);
label_dst1 = _get_label(a1->ai->ai_addr);
label_match1 = (label_src1 == label_dst1);
- label_src2 = _get_label(&a2->src_addr.generic);
+ label_src2 = _get_label(&a2->src_addr.sa);
label_dst2 = _get_label(a2->ai->ai_addr);
label_match2 = (label_src2 == label_dst2);
@@ -1318,9 +1312,9 @@
*/
if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && a2->has_src_addr &&
a2->ai->ai_addr->sa_family == AF_INET6) {
- const struct sockaddr_in6* a1_src = &a1->src_addr.in6;
+ const struct sockaddr_in6* a1_src = &a1->src_addr.sin6;
const struct sockaddr_in6* a1_dst = (const struct sockaddr_in6*) a1->ai->ai_addr;
- const struct sockaddr_in6* a2_src = &a2->src_addr.in6;
+ const struct sockaddr_in6* a2_src = &a2->src_addr.sin6;
const struct sockaddr_in6* a2_dst = (const struct sockaddr_in6*) a2->ai->ai_addr;
prefixlen1 = _common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr);
prefixlen2 = _common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr);
@@ -1427,7 +1421,7 @@
elems[i].ai = cur;
elems[i].original_order = i;
- has_src_addr = _find_src_addr(cur->ai_addr, &elems[i].src_addr.generic, mark, uid);
+ has_src_addr = _find_src_addr(cur->ai_addr, &elems[i].src_addr.sa, mark, uid);
if (has_src_addr == -1) {
goto error;
}
diff --git a/resolv/include/netd_resolv/resolv.h b/resolv/include/netd_resolv/resolv.h
index e921958..6bf1bdd 100644
--- a/resolv/include/netd_resolv/resolv.h
+++ b/resolv/include/netd_resolv/resolv.h
@@ -36,6 +36,12 @@
#include "params.h"
+typedef union sockaddr_union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+} sockaddr_union;
+
/*
* Passing NETID_UNSET as the netId causes system/netd/server/DnsProxyListener.cpp to
* fill in the appropriate default netId for the query.
diff --git a/resolv/res_init.cpp b/resolv/res_init.cpp
index 05404cb..cfb6f08 100644
--- a/resolv/res_init.cpp
+++ b/resolv/res_init.cpp
@@ -135,7 +135,7 @@
int nserv = 0; /* number of nameserver records read from file */
int havesearch = 0;
int dots;
- union res_sockaddr_union u[2];
+ sockaddr_union u[2];
if ((statp->options & RES_INIT) != 0U) res_ndestroy(statp);
@@ -331,7 +331,7 @@
statp->_u._ext.ext = NULL;
}
-void res_setservers(res_state statp, const union res_sockaddr_union* set, int cnt) {
+void res_setservers(res_state statp, const sockaddr_union* set, int cnt) {
int i, nserv;
size_t size;
@@ -376,7 +376,7 @@
statp->nscount = nserv;
}
-int res_getservers(res_state statp, union res_sockaddr_union* set, int cnt) {
+int res_getservers(res_state statp, sockaddr_union* set, int cnt) {
int i;
size_t size;
uint16_t family;
diff --git a/resolv/res_send.cpp b/resolv/res_send.cpp
index 1fb8ddd..5a79f28 100644
--- a/resolv/res_send.cpp
+++ b/resolv/res_send.cpp
@@ -148,11 +148,6 @@
static int retrying_poll(const int sock, short events, const struct timespec* finish);
/* BIONIC-BEGIN: implement source port randomization */
-typedef union {
- struct sockaddr sa;
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
-} _sockaddr_union;
// BEGIN: Code copied from ISC eventlib
// TODO: move away from this code
@@ -221,7 +216,7 @@
// END: Code copied from ISC eventlib
static int random_bind(int s, int family) {
- _sockaddr_union u;
+ sockaddr_union u;
int j;
socklen_t slen;
@@ -473,7 +468,7 @@
* Note that RES_BLAST overrides RES_ROTATE.
*/
if ((statp->options & RES_ROTATE) != 0U && (statp->options & RES_BLAST) == 0U) {
- union res_sockaddr_union inu;
+ sockaddr_union inu;
struct sockaddr_in ina;
int lastns = statp->nscount - 1;
int fd;
diff --git a/resolv/res_state_ext.h b/resolv/res_state_ext.h
index cf906f0..6ed3398 100644
--- a/resolv/res_state_ext.h
+++ b/resolv/res_state_ext.h
@@ -7,7 +7,7 @@
// TODO: consider inlining into res_state
struct res_state_ext {
- union res_sockaddr_union nsaddrs[MAXNS];
+ sockaddr_union nsaddrs[MAXNS];
struct sort_list {
int af;
union {
diff --git a/resolv/resolv_private.h b/resolv/resolv_private.h
index 72fbe7c..8fd168c 100644
--- a/resolv/resolv_private.h
+++ b/resolv/resolv_private.h
@@ -59,6 +59,7 @@
#include <time.h>
#include "netd_resolv/params.h"
+#include "netd_resolv/resolv.h"
#include "netd_resolv/stats.h"
#include "resolv_static.h"
@@ -166,19 +167,6 @@
/* End of stats related definitions */
-union res_sockaddr_union {
- struct sockaddr_in sin;
-#ifdef IN6ADDR_ANY_INIT
- struct sockaddr_in6 sin6;
-#endif
-#ifdef ISC_ALIGN64
- int64_t __align64; /* 64bit alignment */
-#else
- int32_t __align32; /* 32bit alignment */
-#endif
- char __space[128]; /* max size */
-};
-
/*
* Resolver flags (used to be discrete per-module statics ints).
*/
@@ -287,14 +275,13 @@
int res_nsend(res_state, const u_char*, int, u_char*, int);
int res_nsendsigned(res_state, const u_char*, int, ns_tsig_key*, u_char*, int);
int res_findzonecut(res_state, const char*, ns_class, int, char*, size_t, struct in_addr*, int);
-int res_findzonecut2(res_state, const char*, ns_class, int, char*, size_t,
- union res_sockaddr_union*, int);
+int res_findzonecut2(res_state, const char*, ns_class, int, char*, size_t, sockaddr_union*, int);
void res_nclose(res_state);
int res_nopt(res_state, int, u_char*, int, int);
int res_vinit(res_state, int);
void res_ndestroy(res_state);
-void res_setservers(res_state, const union res_sockaddr_union*, int);
-int res_getservers(res_state, union res_sockaddr_union*, int);
+void res_setservers(res_state, const sockaddr_union*, int);
+int res_getservers(res_state, sockaddr_union*, int);
struct android_net_context; /* forward */
void res_setnetcontext(res_state, const struct android_net_context*);