/* vi: set sw=4 ts=4: */
/*
- * $Id: ping.c,v 1.53 2003/01/12 06:08:33 andersen Exp $
+ * $Id: ping.c,v 1.56 2004/03/15 08:28:48 andersen Exp $
* Mini ping implementation for busybox
*
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
- *
+ *
* Original copyright notice is retained at the end of this file.
*/
#include "busybox.h"
-/* It turns out that libc5 doesn't have proper icmp support
- * built into it header files, so we have to supplement it */
-#if __GNU_LIBRARY__ < 5
-static const int ICMP_MINLEN = 8; /* abs minimum */
-
-struct icmp_ra_addr
-{
- u_int32_t ira_addr;
- u_int32_t ira_preference;
-};
-
-
-struct icmp
-{
- u_int8_t icmp_type; /* type of message, see below */
- u_int8_t icmp_code; /* type sub code */
- u_int16_t icmp_cksum; /* ones complement checksum of struct */
- union
- {
- u_char ih_pptr; /* ICMP_PARAMPROB */
- struct in_addr ih_gwaddr; /* gateway address */
- struct ih_idseq /* echo datagram */
- {
- u_int16_t icd_id;
- u_int16_t icd_seq;
- } ih_idseq;
- u_int32_t ih_void;
-
- /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
- struct ih_pmtu
- {
- u_int16_t ipm_void;
- u_int16_t ipm_nextmtu;
- } ih_pmtu;
-
- struct ih_rtradv
- {
- u_int8_t irt_num_addrs;
- u_int8_t irt_wpa;
- u_int16_t irt_lifetime;
- } ih_rtradv;
- } icmp_hun;
-#define icmp_pptr icmp_hun.ih_pptr
-#define icmp_gwaddr icmp_hun.ih_gwaddr
-#define icmp_id icmp_hun.ih_idseq.icd_id
-#define icmp_seq icmp_hun.ih_idseq.icd_seq
-#define icmp_void icmp_hun.ih_void
-#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
-#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
-#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
-#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
-#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
- union
- {
- struct
- {
- u_int32_t its_otime;
- u_int32_t its_rtime;
- u_int32_t its_ttime;
- } id_ts;
- struct
- {
- struct ip idi_ip;
- /* options and then 64 bits of data */
- } id_ip;
- struct icmp_ra_addr id_radv;
- u_int32_t id_mask;
- u_int8_t id_data[1];
- } icmp_dun;
-#define icmp_otime icmp_dun.id_ts.its_otime
-#define icmp_rtime icmp_dun.id_ts.its_rtime
-#define icmp_ttime icmp_dun.id_ts.its_ttime
-#define icmp_ip icmp_dun.id_ip.idi_ip
-#define icmp_radv icmp_dun.id_radv
-#define icmp_mask icmp_dun.id_mask
-#define icmp_data icmp_dun.id_data
-};
-#endif
-
static const int DEFDATALEN = 56;
static const int MAXIPLEN = 60;
static const int MAXICMPLEN = 76;
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (c < 0 || c != sizeof(packet))
- perror_msg_and_die("sendto");
+ bb_perror_msg_and_die("sendto");
signal(SIGALRM, noresp);
alarm(5); /* give the host 5000ms to respond */
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
- perror_msg("recvfrom");
+ bb_perror_msg("recvfrom");
continue;
}
if (c >= 76) { /* ip + icmp */
argc--;
argv++;
if (argc < 1)
- show_usage();
+ bb_show_usage();
ping(*argv);
return EXIT_SUCCESS;
}
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (i < 0)
- perror_msg_and_die("sendto");
+ bb_perror_msg_and_die("sendto");
else if ((size_t)i != sizeof(packet))
- error_msg_and_die("ping wrote %d chars; %d expected", i,
+ bb_error_msg_and_die("ping wrote %d chars; %d expected", i,
(int)sizeof(packet));
signal(SIGALRM, sendping);
if (dupflag)
printf(" (DUP!)");
printf("\n");
- } else
+ } else
if (icmppkt->icmp_type != ICMP_ECHO)
- error_msg("Warning: Got ICMP %d (%s)",
+ bb_error_msg("Warning: Got ICMP %d (%s)",
icmppkt->icmp_type, icmp_type_name (icmppkt->icmp_type));
}
pingaddr.sin_family = AF_INET;
hostent = xgethostbyname(host);
if (hostent->h_addrtype != AF_INET)
- error_msg_and_die("unknown address type; only AF_INET is currently supported.");
+ bb_error_msg_and_die("unknown address type; only AF_INET is currently supported.");
memcpy(&pingaddr.sin_addr, hostent->h_addr, sizeof(pingaddr.sin_addr));
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
- perror_msg("recvfrom");
+ bb_perror_msg("recvfrom");
continue;
}
unpack(packet, c, &from);
break;
case 'c':
if (--argc <= 0)
- show_usage();
+ bb_show_usage();
argv++;
pingcount = atoi(*argv);
break;
case 's':
if (--argc <= 0)
- show_usage();
+ bb_show_usage();
argv++;
datalen = atoi(*argv);
break;
default:
- show_usage();
+ bb_show_usage();
}
argc--;
argv++;
}
if (argc < 1)
- show_usage();
+ bb_show_usage();
myid = getpid() & 0xFFFF;
ping(*argv);
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
- * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
+ * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
*
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software