1) bb_opt_complementaly -> bb_opt_complementally
[oweals/busybox.git] / networking / traceroute.c
index e05a50fbc528b3cbe7ea62b98a67431c891851aa..628b13492b30ba3c429301204f60fd0d6078ed8c 100644 (file)
  * 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.
  *
 #include <netinet/ip.h>
 #include <netinet/ip_icmp.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
-};
-
-#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
        }