X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Ftraceroute.c;h=628b13492b30ba3c429301204f60fd0d6078ed8c;hb=27421a1878847389391c1a43420baaccf57057a7;hp=e05a50fbc528b3cbe7ea62b98a67431c891851aa;hpb=ad79c0b629e123685cbb33d6b393225343fadedf;p=oweals%2Fbusybox.git diff --git a/networking/traceroute.c b/networking/traceroute.c index e05a50fbc..628b13492 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -14,11 +14,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -79,97 +75,6 @@ #include #include - - /* 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 -}; - -#define ICMP_MINLEN 8 /* abs minimum */ -#define ICMP_UNREACH 3 /* dest unreachable, codes: */ -#define ICMP_TIMXCEED 11 /* time exceeded, code: */ -#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ -#define ICMP_UNREACH_NET 0 /* bad net */ -#define ICMP_UNREACH_HOST 1 /* bad host */ -#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ -#define ICMP_UNREACH_PORT 3 /* bad port */ -#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ -#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ -#endif - #define MAXPACKET 65535 /* max ip packet size */ #ifndef MAXHOSTNAMELEN @@ -196,7 +101,8 @@ struct opacket { #include "busybox.h" -static u_char packet[512]; /* last inbound (icmp) packet */ + /* last inbound (icmp) packet */ +static u_char packet[512] __attribute__ ((aligned)); static struct opacket *outpacket; /* last output (udp) packet */ static int s; /* receive (icmp) socket file descriptor */ @@ -424,12 +330,10 @@ send_probe(int seq, int ttl) int #ifndef CONFIG_TRACEROUTE -main(argc, argv) +main(int argc, char *argv[]) #else -traceroute_main(argc, argv) +traceroute_main(int argc, char *argv[]) #endif - int argc; - char *argv[]; { extern char *optarg; extern int optind; @@ -454,7 +358,7 @@ traceroute_main(argc, argv) case 'm': max_ttl = atoi(optarg); if (max_ttl <= 1) - error_msg_and_die("max ttl must be >1."); + bb_error_msg_and_die("max ttl must be >1."); break; case 'n': nflag++; @@ -462,12 +366,12 @@ traceroute_main(argc, argv) case 'p': port = atoi(optarg); if (port < 1) - error_msg_and_die("port must be >0."); + bb_error_msg_and_die("port must be >0."); break; case 'q': nprobes = atoi(optarg); if (nprobes < 1) - error_msg_and_die("nprobes must be >0."); + bb_error_msg_and_die("nprobes must be >0."); break; case 'r': options |= SO_DONTROUTE; @@ -482,7 +386,7 @@ traceroute_main(argc, argv) case 't': tos = atoi(optarg); if (tos < 0 || tos > 255) - error_msg_and_die("tos must be 0 to 255."); + bb_error_msg_and_die("tos must be 0 to 255."); break; case 'v': #ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE @@ -492,16 +396,16 @@ traceroute_main(argc, argv) case 'w': waittime = atoi(optarg); if (waittime <= 1) - error_msg_and_die("wait must be >1 sec."); + bb_error_msg_and_die("wait must be >1 sec."); break; default: - show_usage(); + bb_show_usage(); } argc -= optind; argv += optind; if (argc < 1) - show_usage(); + bb_show_usage(); setlinebuf (stdout); @@ -513,8 +417,8 @@ traceroute_main(argc, argv) if (*++argv) datalen = atoi(*argv); if (datalen < 0 || datalen >= MAXPACKET - sizeof(struct opacket)) - error_msg_and_die("packet size must be 0 <= s < %d.", - MAXPACKET - sizeof(struct opacket)); + bb_error_msg_and_die("packet size must be 0 <= s < %d.", + (int)(MAXPACKET - sizeof(struct opacket))); datalen += sizeof(struct opacket); outpacket = (struct opacket *)xmalloc((unsigned)datalen); memset(outpacket, 0, datalen); @@ -526,7 +430,7 @@ traceroute_main(argc, argv) ident = (getpid() & 0xffff) | 0x8000; if ((sndsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) - perror_msg_and_die(can_not_create_raw_socket); + bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket); s = create_icmp_socket(); @@ -541,12 +445,12 @@ traceroute_main(argc, argv) #ifdef SO_SNDBUF if (setsockopt(sndsock, SOL_SOCKET, SO_SNDBUF, (char *)&datalen, sizeof(datalen)) < 0) - perror_msg_and_die("SO_SNDBUF"); + bb_perror_msg_and_die("SO_SNDBUF"); #endif #ifdef IP_HDRINCL if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof(on)) < 0) - perror_msg_and_die("IP_HDRINCL"); + bb_perror_msg_and_die("IP_HDRINCL"); #endif #ifdef CONFIG_FEATURE_TRACEROUTE_SO_DEBUG if (options & SO_DEBUG) @@ -562,11 +466,11 @@ traceroute_main(argc, argv) from.sin_family = AF_INET; from.sin_addr.s_addr = inet_addr(source); if (from.sin_addr.s_addr == -1) - error_msg_and_die("unknown host %s", source); + bb_error_msg_and_die("unknown host %s", source); outpacket->ip.ip_src = from.sin_addr; #ifndef IP_HDRINCL if (bind(sndsock, (struct sockaddr *)&from, sizeof(from)) < 0) - perror_msg_and_die("bind"); + bb_perror_msg_and_die("bind"); #endif }