]> git.pld-linux.org Git - packages/mtr.git/blob - 0001-mtr-to-a-unreachable-host-is-possible-again.patch
- bash completion: IPv6 fix
[packages/mtr.git] / 0001-mtr-to-a-unreachable-host-is-possible-again.patch
1 From 240725528c5a756ee9aaff247e3731f4b8517c06 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= <arekm@maven.pl>
3 Date: Tue, 5 Jun 2018 17:38:08 +0200
4 Subject: [PATCH] mtr to a unreachable host is possible again.
5
6 In mtr 0.87 it was possible to start mtr against unreachable
7 host (that local kernel already knew that it is unreachable).
8 Later it was broken. Make such tracing possible again.
9 ---
10  packet/probe.c | 28 +++++++++++++++++++++++-----
11  ui/net.c       | 10 ++++++++++
12  2 files changed, 33 insertions(+), 5 deletions(-)
13
14 diff --git a/packet/probe.c b/packet/probe.c
15 index 27bf138..cf95f8a 100644
16 --- a/packet/probe.c
17 +++ b/packet/probe.c
18 @@ -356,14 +356,32 @@ int find_source_addr(
19          return -1;
20      }
21  
22 -    if (connect(sock, (struct sockaddr *) &dest_with_port, len)) {
23 -        close(sock);
24 -        return -1;
25 -    }
26 +    if (connect(sock, (struct sockaddr *) &dest_with_port, len) == 0) {
27 +        if (getsockname(sock, (struct sockaddr *) srcaddr, &len)) {
28 +            close(sock);
29 +            return -1;
30 +        }
31 +    } else {
32 +#ifdef __linux__
33 +        /* Linux doesn't require source address, so we can support
34 +         * a case when mtr is run against unreachable host (that can become
35 +         * reachable) */
36 +        if (errno != EHOSTUNREACH) {
37 +            close(sock);
38 +            return -1;
39 +        }
40  
41 -    if (getsockname(sock, (struct sockaddr *) srcaddr, &len)) {
42 +        if (destaddr->ss_family == AF_INET6) {
43 +            srcaddr6 = (struct sockaddr_in6 *) srcaddr;
44 +            srcaddr6->sin6_addr = in6addr_any;
45 +        } else {
46 +            srcaddr4 = (struct sockaddr_in *) srcaddr;
47 +            srcaddr4->sin_addr.s_addr = INADDR_ANY;
48 +        }
49 +#else
50          close(sock);
51          return -1;
52 +#endif
53      }
54  
55      close(sock);
56 diff --git a/ui/net.c b/ui/net.c
57 index 69d4477..11dd4c8 100644
58 --- a/ui/net.c
59 +++ b/ui/net.c
60 @@ -720,6 +720,16 @@ static void net_find_local_address(
61  
62      if (connect
63          (udp_socket, (struct sockaddr *) &remote_sockaddr, addr_length)) {
64 +#ifdef __linux__
65 +        /* Linux doesn't require source address, so we can support
66 +         * a case when mtr is run against unreachable host (that can become
67 +         * reachable) */
68 +        if (errno == EHOSTUNREACH) {
69 +            close(udp_socket);
70 +            localaddr[0] = '\0';
71 +            return;
72 +        }
73 +#endif
74          error(EXIT_FAILURE, errno, "udp socket connect failed");
75      }
76  
77 -- 
78 2.17.1
79
This page took 0.160607 seconds and 3 git commands to generate.