]> git.ipfire.org Git - thirdparty/mtr.git/commitdiff
Merge branch 'master' of github.com:traviscross/mtr
authorR.E. Wolff <R.E.Wolff@BitWizard.nl>
Mon, 25 May 2026 18:03:20 +0000 (20:03 +0200)
committerR.E. Wolff <R.E.Wolff@BitWizard.nl>
Mon, 25 May 2026 18:03:20 +0000 (20:03 +0200)
1  2 
ui/mtr.c

diff --cc ui/mtr.c
index c3b66b08b0f4ff5b5d389a6931372ea889c49b55,3214122ecce60f8f7842b0954e1603a81d760add..830dbf701416e337c97cc0b36d77a20fc74e6940
+++ b/ui/mtr.c
@@@ -830,9 -993,47 +993,47 @@@ static void init_rand
      struct timeval tv;
  
      gettimeofday(&tv, NULL);
 -    srand(((getpid() & 0xffff) << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);
 +    srand((getpid() ^ (getuid() << 16) ^ tv.tv_sec ^ tv.tv_usec);
  }
  
+ static void unmap_v4mapped_addrinfo(
+     int requested_family,
+     struct addrinfo *res)
+ {
+ #if defined(ENABLE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
+     struct sockaddr_in6 *addr6;
+     struct sockaddr_in addr4;
+     if (requested_family != AF_UNSPEC ||
+         res == NULL ||
+         res->ai_family != AF_INET6 ||
+         res->ai_addr == NULL ||
+         res->ai_addrlen < sizeof(struct sockaddr_in6)) {
+         return;
+     }
+     addr6 = (struct sockaddr_in6 *) res->ai_addr;
+     if (!IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) {
+         return;
+     }
+     memset(&addr4, 0, sizeof(addr4));
+     addr4.sin_family = AF_INET;
+     addr4.sin_port = addr6->sin6_port;
+     memcpy(&addr4.sin_addr,
+            &addr6->sin6_addr.s6_addr[sizeof(addr6->sin6_addr.s6_addr) -
+                                      sizeof(addr4.sin_addr)],
+            sizeof(addr4.sin_addr));
+     memcpy(res->ai_addr, &addr4, sizeof(addr4));
+     res->ai_addrlen = sizeof(addr4);
+     res->ai_family = AF_INET;
+ #else
+     (void) requested_family;
+     (void) res;
+ #endif
+ }
  /*
      For historical reasons, we need a hostent structure to represent
      our remote target for probing.  The obsolete way of doing this