]>
Commit | Line | Data |
---|---|---|
bc7a85ec AM |
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 |