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*);