]> git.pld-linux.org Git - packages/mtr.git/blame - 0001-mtr-to-a-unreachable-host-is-possible-again.patch
- cleanup, updated dependencies
[packages/mtr.git] / 0001-mtr-to-a-unreachable-host-is-possible-again.patch
CommitLineData
bc7a85ec
AM
1From 240725528c5a756ee9aaff247e3731f4b8517c06 Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= <arekm@maven.pl>
3Date: Tue, 5 Jun 2018 17:38:08 +0200
4Subject: [PATCH] mtr to a unreachable host is possible again.
5
6In mtr 0.87 it was possible to start mtr against unreachable
7host (that local kernel already knew that it is unreachable).
8Later 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
14diff --git a/packet/probe.c b/packet/probe.c
15index 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);
56diff --git a/ui/net.c b/ui/net.c
57index 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--
782.17.1
79
This page took 0.325628 seconds and 4 git commands to generate.