diff options
Diffstat (limited to 'networking/ping6.c')
-rw-r--r-- | networking/ping6.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/networking/ping6.c b/networking/ping6.c index a92387e79..ccb19b2b5 100644 --- a/networking/ping6.c +++ b/networking/ping6.c | |||
@@ -48,7 +48,7 @@ static void ping(const char *host); | |||
48 | 48 | ||
49 | /* simple version */ | 49 | /* simple version */ |
50 | 50 | ||
51 | static struct hostent *h; | 51 | //static struct hostent *h; |
52 | 52 | ||
53 | static void noresp(int ign) | 53 | static void noresp(int ign) |
54 | { | 54 | { |
@@ -58,6 +58,7 @@ static void noresp(int ign) | |||
58 | 58 | ||
59 | static void ping(const char *host) | 59 | static void ping(const char *host) |
60 | { | 60 | { |
61 | len_and_sockaddr *lsa;// | ||
61 | struct sockaddr_in6 pingaddr; | 62 | struct sockaddr_in6 pingaddr; |
62 | struct icmp6_hdr *pkt; | 63 | struct icmp6_hdr *pkt; |
63 | int pingsock, c; | 64 | int pingsock, c; |
@@ -66,11 +67,12 @@ static void ping(const char *host) | |||
66 | 67 | ||
67 | pingsock = create_icmp6_socket(); | 68 | pingsock = create_icmp6_socket(); |
68 | 69 | ||
69 | memset(&pingaddr, 0, sizeof(pingaddr)); | 70 | //memset(&pingaddr, 0, sizeof(pingaddr)); |
70 | 71 | //pingaddr.sin6_family = AF_INET6; | |
71 | pingaddr.sin6_family = AF_INET6; | 72 | //h = xgethostbyname2(host, AF_INET6); |
72 | h = xgethostbyname2(host, AF_INET6); | 73 | //memcpy(&pingaddr.sin6_addr, h->h_addr, sizeof(pingaddr.sin6_addr)); |
73 | memcpy(&pingaddr.sin6_addr, h->h_addr, sizeof(pingaddr.sin6_addr)); | 74 | lsa = host_and_af2sockaddr(host, 0, AF_INET6); |
75 | pingaddr = lsa->sin6; | ||
74 | 76 | ||
75 | pkt = (struct icmp6_hdr *) packet; | 77 | pkt = (struct icmp6_hdr *) packet; |
76 | memset(pkt, 0, sizeof(packet)); | 78 | memset(pkt, 0, sizeof(packet)); |
@@ -88,7 +90,7 @@ static void ping(const char *host) | |||
88 | } | 90 | } |
89 | 91 | ||
90 | signal(SIGALRM, noresp); | 92 | signal(SIGALRM, noresp); |
91 | alarm(5); /* give the host 5000ms to respond */ | 93 | alarm(5); /* give the host 5000ms to respond */ |
92 | /* listen for replies */ | 94 | /* listen for replies */ |
93 | while (1) { | 95 | while (1) { |
94 | struct sockaddr_in6 from; | 96 | struct sockaddr_in6 from; |
@@ -107,7 +109,8 @@ static void ping(const char *host) | |||
107 | break; | 109 | break; |
108 | } | 110 | } |
109 | } | 111 | } |
110 | if (ENABLE_FEATURE_CLEAN_UP) close(pingsock); | 112 | if (ENABLE_FEATURE_CLEAN_UP) |
113 | close(pingsock); | ||
111 | printf("%s is alive!\n", h->h_name); | 114 | printf("%s is alive!\n", h->h_name); |
112 | } | 115 | } |
113 | 116 | ||
@@ -141,7 +144,8 @@ static int myid; | |||
141 | static unsigned long tmin = ULONG_MAX, tmax, tsum; | 144 | static unsigned long tmin = ULONG_MAX, tmax, tsum; |
142 | static char rcvd_tbl[MAX_DUP_CHK / 8]; | 145 | static char rcvd_tbl[MAX_DUP_CHK / 8]; |
143 | 146 | ||
144 | static struct hostent *hostent; | 147 | //static struct hostent *hostent; |
148 | char *hostname; | ||
145 | 149 | ||
146 | static void sendping(int); | 150 | static void sendping(int); |
147 | static void pingstats(int); | 151 | static void pingstats(int); |
@@ -161,7 +165,7 @@ static void pingstats(int junk) | |||
161 | 165 | ||
162 | signal(SIGINT, SIG_IGN); | 166 | signal(SIGINT, SIG_IGN); |
163 | 167 | ||
164 | printf("\n--- %s ping statistics ---\n", hostent->h_name); | 168 | printf("\n--- %s ping statistics ---\n", hostname); |
165 | printf("%lu packets transmitted, ", ntransmitted); | 169 | printf("%lu packets transmitted, ", ntransmitted); |
166 | printf("%lu packets received, ", nreceived); | 170 | printf("%lu packets received, ", nreceived); |
167 | if (nrepeats) | 171 | if (nrepeats) |
@@ -314,6 +318,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit | |||
314 | extern int BUG_bad_offsetof_icmp6_cksum(void); | 318 | extern int BUG_bad_offsetof_icmp6_cksum(void); |
315 | static void ping(const char *host) | 319 | static void ping(const char *host) |
316 | { | 320 | { |
321 | len_and_sockaddr *lsa;// | ||
317 | char packet[datalen + MAXIPLEN + MAXICMPLEN]; | 322 | char packet[datalen + MAXIPLEN + MAXICMPLEN]; |
318 | char buf[INET6_ADDRSTRLEN]; | 323 | char buf[INET6_ADDRSTRLEN]; |
319 | int sockopt; | 324 | int sockopt; |
@@ -324,14 +329,15 @@ static void ping(const char *host) | |||
324 | 329 | ||
325 | pingsock = create_icmp6_socket(); | 330 | pingsock = create_icmp6_socket(); |
326 | 331 | ||
327 | memset(&pingaddr, 0, sizeof(pingaddr)); | 332 | //memset(&pingaddr, 0, sizeof(pingaddr)); |
328 | 333 | //pingaddr.sin6_family = AF_INET6; | |
329 | pingaddr.sin6_family = AF_INET6; | 334 | //hostent = xgethostbyname2(host, AF_INET6); |
330 | hostent = xgethostbyname2(host, AF_INET6); | 335 | //if (hostent->h_addrtype != AF_INET6) |
331 | if (hostent->h_addrtype != AF_INET6) | 336 | // bb_error_msg_and_die("unknown address type; only AF_INET6 is currently supported"); |
332 | bb_error_msg_and_die("unknown address type; only AF_INET6 is currently supported"); | 337 | //memcpy(&pingaddr.sin6_addr, hostent->h_addr, sizeof(pingaddr.sin6_addr)); |
333 | 338 | lsa = host_and_af2sockaddr(host, 0, AF_INET6); | |
334 | memcpy(&pingaddr.sin6_addr, hostent->h_addr, sizeof(pingaddr.sin6_addr)); | 339 | hostname = xmalloc_sockaddr2host_noport(&lsa->sa, lsa->len); |
340 | pingaddr = lsa->sin6; | ||
335 | 341 | ||
336 | #ifdef ICMP6_FILTER | 342 | #ifdef ICMP6_FILTER |
337 | { | 343 | { |
@@ -367,7 +373,7 @@ static void ping(const char *host) | |||
367 | pingaddr.sin6_scope_id = if_index; | 373 | pingaddr.sin6_scope_id = if_index; |
368 | 374 | ||
369 | printf("PING %s (%s): %d data bytes\n", | 375 | printf("PING %s (%s): %d data bytes\n", |
370 | hostent->h_name, | 376 | hostname, |
371 | inet_ntop(AF_INET6, &pingaddr.sin6_addr, | 377 | inet_ntop(AF_INET6, &pingaddr.sin6_addr, |
372 | buf, sizeof(buf)), | 378 | buf, sizeof(buf)), |
373 | datalen); | 379 | datalen); |