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;
} 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));
}
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
return (type == ICMP6_TIME_EXCEEDED ? -1 : (code<<8)+1);
}
}
-
}
# if ENABLE_FEATURE_TRACEROUTE_VERBOSE
}
#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);
}
int lsrr = 0;
#endif
#if ENABLE_TRACEROUTE6
- sa_family_t af = AF_UNSPEC;
+ sa_family_t af;
#else
enum { af = AF_INET };
#endif
* 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);
}
#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();
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);