- static unsigned char res[4];
- struct sockaddr_in mysrv;
- struct sockaddr *myaddr;
- int addrlen = sizeof (mysrv); /* see bindport() for discussion of
- using `int' here. */
-
- myaddr = (struct sockaddr *) (&mysrv);
- if (getsockname (fd, myaddr, (int *)&addrlen) < 0)
- return NULL;
- memcpy (res, &mysrv.sin_addr, 4);
- return res;
+ wget_sockaddr mysrv;
+
+ /* see bindport() for discussion of using `int' here. */
+ int addrlen = sizeof (mysrv);
+
+ if (getsockname (fd, &mysrv.sa, (int *)&addrlen) < 0)
+ return 0;
+
+ switch (mysrv.sa.sa_family)
+ {
+#ifdef INET6
+ case AF_INET6:
+ memcpy (ip, &mysrv.sin6.sin6_addr, 16);
+ return 1;
+#endif
+ case AF_INET:
+ map_ipv4_to_ip ((ip4_address *)&mysrv.sin.sin_addr, ip);
+ return 1;
+ default:
+ abort ();
+ }
+ return 0;