nc: show help text on bad parameters
[oweals/busybox.git] / networking / traceroute.c
index 18a8c25d43db7365d12611f1a45973ef62ed0d97..c18fba8d016dd4e2c3be0b831ad069158f4a0df3 100644 (file)
@@ -364,7 +364,7 @@ wait_for_reply(len_and_sockaddr *from_lsa, struct sockaddr *to)
                read_len = recv_from_to(rcvsock,
                                recv_pkt, sizeof(recv_pkt),
                                /*flags:*/ 0,
-                               &from_lsa->u.sa, to, from_lsa->len);
+                               &from_lsa->u.sa, to, from_lsa->len);
        }
 
        return read_len;
@@ -472,16 +472,14 @@ send_probe(int seq, int ttl)
        } else
 #endif
        {
-#if defined(IP_TTL)
-               if (setsockopt(sndsock, IPPROTO_IP, IP_TTL,
-                               (char *)&ttl, sizeof(ttl)) < 0) {
+#if defined IP_TTL
+               res = setsockopt(sndsock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
+               if (res < 0)
                        bb_perror_msg_and_die("setsockopt ttl %d", ttl);
-               }
 #endif
+               out = outicmp;
                len = packlen - sizeof(*outip);
-               if (option_mask32 & OPT_USE_ICMP)
-                       out = outicmp;
-               else {
+               if (!(option_mask32 & OPT_USE_ICMP)) {
                        out = outdata;
                        len -= sizeof(*outudp);
                        set_nport(dest_lsa, htons(port + seq));
@@ -489,9 +487,8 @@ send_probe(int seq, int ttl)
        }
 
        res = xsendto(sndsock, out, len, &dest_lsa->u.sa, dest_lsa->len);
-       if (res != len) {
+       if (res != len)
                bb_info_msg("sent %d octets, ret=%d", len, res);
-       }
 }
 
 #if ENABLE_FEATURE_TRACEROUTE_VERBOSE
@@ -669,7 +666,6 @@ packet_ok(int read_len, len_and_sockaddr *from_lsa,
                                return (type == ICMP6_TIME_EXCEEDED ? -1 : (code<<8)+1);
                        }
                }
-
        }
 
 # if ENABLE_FEATURE_TRACEROUTE_VERBOSE
@@ -706,9 +702,10 @@ packet_ok(int read_len, len_and_sockaddr *from_lsa,
 }
 #else /* !ENABLE_TRACEROUTE6 */
 static ALWAYS_INLINE int
-packet_ok(int read_len, len_and_sockaddr *from_lsa,
-                       struct sockaddr *to UNUSED_PARAM,
-                       int seq)
+packet_ok(int read_len,
+               len_and_sockaddr *from_lsa IF_NOT_FEATURE_TRACEROUTE_VERBOSE(UNUSED_PARAM),
+               struct sockaddr *to UNUSED_PARAM,
+               int seq)
 {
        return packet4_ok(read_len, &from_lsa->u.sin, seq);
 }
@@ -797,7 +794,7 @@ common_traceroute_main(int op, char **argv)
        int lsrr = 0;
 #endif
 #if ENABLE_TRACEROUTE6
-       sa_family_t af = AF_UNSPEC;
+       sa_family_t af;
 #else
        enum { af = AF_INET };
 #endif
@@ -838,7 +835,7 @@ common_traceroute_main(int op, char **argv)
                 * probe (e.g., on a multi-homed host).
                 */
                if (getuid() != 0)
-                       bb_error_msg_and_die("you must be root to use -s");
+                       bb_error_msg_and_die(bb_msg_you_must_be_root);
        }
        if (op & OPT_WAITTIME)
                waittime = xatou_range(waittime_str, 1, 24 * 60 * 60);
@@ -863,31 +860,26 @@ common_traceroute_main(int op, char **argv)
        }
 #endif
 
+       /* Process destination and optional packet size */
+       minpacket = sizeof(*outip) + SIZEOF_ICMP_HDR + sizeof(*outdata) + optlen;
+       if (!(op & OPT_USE_ICMP))
+               minpacket += sizeof(*outudp) - SIZEOF_ICMP_HDR;
 #if ENABLE_TRACEROUTE6
+       af = AF_UNSPEC;
        if (op & OPT_IPV4)
                af = AF_INET;
-       if (op & OPT_IPV6) {
+       if (op & OPT_IPV6)
                af = AF_INET6;
-               minpacket = sizeof(struct outdata6_t);
-       } else
-#endif
-       {
-               minpacket = sizeof(*outip) + SIZEOF_ICMP_HDR
-                            + sizeof(*outdata) + optlen;
-               if (!(op & OPT_USE_ICMP))
-                       minpacket += sizeof(*outudp) - SIZEOF_ICMP_HDR;
-       }
-       packlen = minpacket;
-
-       /* Process destination and optional packet size */
-       if (argv[1])
-               packlen = xatoul_range(argv[1], minpacket, 32 * 1024);
-#if ENABLE_TRACEROUTE6
        dest_lsa = xhost_and_af2sockaddr(argv[0], port, af);
        af = dest_lsa->u.sa.sa_family;
+       if (af == AF_INET6)
+               minpacket = sizeof(struct outdata6_t);
 #else
        dest_lsa = xhost2sockaddr(argv[0], port);
 #endif
+       packlen = minpacket;
+       if (argv[1])
+               packlen = xatoul_range(argv[1], minpacket, 32 * 1024);
 
        /* Ensure the socket fds won't be 0, 1 or 2 */
        bb_sanitize_stdio();
@@ -1028,6 +1020,7 @@ common_traceroute_main(int op, char **argv)
                set_nport(dest_lsa, htons(1025));
                /* dummy connect. makes kernel pick source IP (and port) */
                xconnect(probe_fd, &dest_lsa->u.sa, dest_lsa->len);
+               set_nport(dest_lsa, htons(port));
 
                /* read IP and port */
                source_lsa = get_sock_lsa(probe_fd);