+/* wget_sockaddr is used instead of sockaddr where an IPV6 address
+ must fit. */
+
+typedef union {
+ struct sockaddr sa; /* Generic but too small */
+ struct sockaddr_in sin; /* IPv4 socket address */
+#ifdef INET6
+ struct sockaddr_in6 sin6; /* IPv6 socket address */
+#endif
+} wget_sockaddr;
+
+typedef struct {
+ unsigned char bytes[4];
+} ip4_address;
+
+/* If compiled with IPv6 support, we internally represent all IP
+ addresses as IPv6 addresses. IPv4 addresses are dynamically mapped
+ to IPv6, i.e. stored in the format ::ffff:<Ipv4>. */
+
+#ifdef INET6
+# define MAX_IP_ADDRESS_SIZE 16
+#else
+# define MAX_IP_ADDRESS_SIZE 4
+#endif
+
+typedef struct {
+ unsigned char bytes[MAX_IP_ADDRESS_SIZE];
+} ip_address;
+