* Tue Dec 20 03:50:13 PST 1988
*/
-#undef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#define TRACEROUTE_SO_DEBUG 0
+
+/* TODO: undefs were uncommented - ??! we have config system for that! */
+/* probably ok to remove altogether */
+//#undef CONFIG_FEATURE_TRACEROUTE_VERBOSE
//#define CONFIG_FEATURE_TRACEROUTE_VERBOSE
-#undef CONFIG_FEATURE_TRACEROUTE_SO_DEBUG /* not in documentation man */
-#undef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+//#undef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
//#define CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
-#undef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+//#undef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
//#define CONFIG_FEATURE_TRACEROUTE_USE_ICMP
#include "inet_common.h"
static const char route[] = "/proc/net/route";
/* last inbound (icmp) packet */
-static unsigned char packet[512] ATTRIBUTE_ALIGNED(32);
+static unsigned char packet[512] ATTRIBUTE_ALIGNED(32);
static struct ip *outip; /* last output (udp) packet */
static struct udphdr *outudp; /* last output (udp) packet */
static struct outdata *outdata; /* last output (udp) packet */
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
static struct icmp *outicmp; /* last output (icmp) packet */
#endif
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
/* Maximum number of gateways (include room for one noop) */
#define NGATEWAYS ((int)((MAX_IPOPTLEN - IPOPT_MINOFF - 1) / sizeof(u_int32_t)))
/* loose source route gateway list (including room for final destination) */
static int nflag; /* print addresses numerically */
static int doipcksum = 1; /* calculate ip checksums by default */
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
static int optlen; /* length of ip options */
#else
#define optlen 0
#endif
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
static int useicmp; /* use icmp echo instead of udp packets */
#endif
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
static int verbose;
#endif
++al;
++nipaddr;
}
- if(nipaddr == 0)
- bb_error_msg_and_die ("Can't find any network interfaces");
+ if (nipaddr == 0)
+ bb_error_msg_and_die ("can't find any network interfaces");
(void)close(fd);
*ipaddrp = st_ifaddrlist;
fclose(f);
if (device[0] == '\0')
- bb_error_msg_and_die ("Can't find interface");
+ bb_error_msg_and_die ("can't find interface");
/* Get the interface address list */
n = ifaddrlist(&al);
if (strcmp(device, al->device) == 0)
break;
if (i <= 0)
- bb_error_msg_and_die("Can't find interface %s", device);
+ bb_error_msg_and_die("can't find interface %s", device);
setsin(from, al->addr);
}
*/
-/* String to value with optional min and max. Handles decimal and hex. */
-static int
-str2val(const char *str, const char *what, int mi, int ma)
-{
- const char *cp;
- int val;
- char *ep;
-
- if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
- cp = str + 2;
- val = (int)strtol(cp, &ep, 16);
- } else
- val = (int)strtol(str, &ep, 10);
- if (*ep != '\0') {
- bb_error_msg_and_die("\"%s\" bad value for %s", str, what);
- }
- if (val < mi && mi >= 0) {
- if (mi == 0)
- bb_error_msg_and_die("%s must be >= %d", what, mi);
- else
- bb_error_msg_and_die("%s must be > %d", what, mi - 1);
- }
- if (val > ma && ma >= 0)
- bb_error_msg_and_die("%s must be <= %d", what, ma);
- return val;
-}
-
-
/*
* Subtract 2 timeval structs: out = out - in.
* Out is assumed to be >= in.
outdata->ttl = ttl;
memcpy(&outdata->tv, tp, sizeof(outdata->tv));
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp)
outicmp->icmp_seq = htons(seq);
else
#endif
outudp->dest = htons(port + seq);
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp) {
/* Always calculate checksum for icmp packets */
outicmp->icmp_cksum = 0;
*outip = tip;
}
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
/* XXX undocumented debugging hack */
if (verbose > 1) {
const u_short *sp;
if (cc < 0)
bb_perror_msg_and_die("sendto");
printf("%s: wrote %s %d chars, ret=%d\n",
- bb_applet_name, hostname, packlen, cc);
+ applet_name, hostname, packlen, cc);
(void)fflush(stdout);
}
}
return dt;
}
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
/*
* Convert an ICMP "type" field to a printable string.
*/
ip = (struct ip *) buf;
hlen = ip->ip_hl << 2;
if (cc < hlen + ICMP_MINLEN) {
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
if (verbose)
printf("packet too short (%d bytes) from %s\n", cc,
inet_ntoa(from->sin_addr));
hip = &icp->icmp_ip;
hlen = hip->ip_hl << 2;
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp) {
struct icmp *hicmp;
return (type == ICMP_TIMXCEED ? -1 : code + 1);
}
}
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
if (verbose) {
int i;
u_int32_t *lp = (u_int32_t *)&icp->icmp_ip;
char name[257];
if (!nflag && from->sin_addr.s_addr != INADDR_ANY) {
- if(INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0)
+ if (INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0)
n = name;
}
ina = inet_ntoa(from->sin_addr);
cc -= hlen;
inetname(from);
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
if (verbose)
printf(" %d bytes to %s", cc, inet_ntoa (ip->ip_dst));
#endif
free((char *)hi);
}
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
static void
getaddr(u_int32_t *ap, const char *host)
{
char *source = NULL;
unsigned long op;
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
int lsrr = 0;
#endif
u_short off = 0;
char *pausemsecs_str = NULL;
int first_ttl = 1;
char *first_ttl_str = NULL;
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
llist_t *sourse_route_list = NULL;
#endif
opterr = 0;
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
opt_complementary = "x-x:g::";
#else
opt_complementary = "x-x";
#define USAGE_OP_VERBOSE (1<<6) /* v */
#define USAGE_OP_IP_CHKSUM (1<<7) /* x */
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
"g:"
#endif
, &tos_str, &device, &max_ttl_str, &port_str, &nprobes_str,
&source, &waittime_str, &pausemsecs_str, &first_ttl_str
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
, &sourse_route_list
#endif
);
- if(op & USAGE_OP_DONT_FRAGMNT)
+ if (op & USAGE_OP_DONT_FRAGMNT)
off = IP_DF;
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
useicmp = op & USAGE_OP_USE_ICMP;
#endif
nflag = op & USAGE_OP_ADDR_NUM;
-#ifdef CONFIG_FEATURE_TRACEROUTE_VERBOSE
+#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
verbose = op & USAGE_OP_VERBOSE;
#endif
- if(op & USAGE_OP_IP_CHKSUM) {
+ if (op & USAGE_OP_IP_CHKSUM) {
doipcksum = 0;
- bb_error_msg("Warning: ip checksums disabled");
+ bb_error_msg("warning: ip checksums disabled");
}
if (tos_str)
- tos = str2val(tos_str, "tos", 0, 255);
- if(max_ttl_str)
- max_ttl = str2val(max_ttl_str, "max ttl", 1, 255);
- if(port_str)
- port = (u_short)str2val(port_str, "port", 1, (1 << 16) - 1);
- if(nprobes_str)
- nprobes = str2val(nprobes_str, "nprobes", 1, -1);
- if(source) {
+ tos = xatoul_range(tos_str, 0, 255);
+ if (max_ttl_str)
+ max_ttl = xatoul_range(max_ttl_str, 1, 255);
+ if (port_str)
+ port = xatou16(port_str);
+ if (nprobes_str)
+ nprobes = xatoul_range(nprobes_str, 1, INT_MAX);
+ if (source) {
/*
* set the ip source address of the outbound
* probe (e.g., on a multi-homed host).
*/
if (getuid()) bb_error_msg_and_die("-s %s: permission denied", source);
}
- if(waittime_str)
- waittime = str2val(waittime_str, "wait time", 2, 24 * 60 * 60);
- if(pausemsecs_str)
- pausemsecs = str2val(pausemsecs_str, "pause msecs", 0, 60 * 60 * 1000);
- if(first_ttl_str)
- first_ttl = str2val(first_ttl_str, "first ttl", 1, 255);
-
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
- if(sourse_route_list) {
+ if (waittime_str)
+ waittime = xatoul_range(waittime_str, 2, 24 * 60 * 60);
+ if (pausemsecs_str)
+ pausemsecs = xatoul_range(pausemsecs_str, 0, 60 * 60 * 1000);
+ if (first_ttl_str)
+ first_ttl = xatoul_range(first_ttl_str, 1, 255);
+
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
+ if (sourse_route_list) {
llist_t *l_sr;
for(l_sr = sourse_route_list; l_sr; ) {
minpacket = sizeof(*outip) + sizeof(*outdata) + optlen;
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp)
minpacket += 8; /* XXX magic number */
else
switch (argc - optind) {
case 2:
- packlen = str2val(argv[optind + 1],
- "packet length", minpacket, maxpacket);
+ packlen = xatoul_range(argv[optind + 1], minpacket, maxpacket);
/* Fall through */
case 1:
hi = gethostinfo(hostname);
setsin(to, hi->addrs[0]);
if (hi->n > 1)
- bb_error_msg(
- "Warning: %s has multiple addresses; using %s",
+ bb_error_msg("warning: %s has multiple addresses; using %s",
hostname, inet_ntoa(to->sin_addr));
hostname = hi->name;
hi->name = NULL;
s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
-#ifdef CONFIG_FEATURE_TRACEROUTE_SO_DEBUG
+#if TRACEROUTE_SO_DEBUG
if (op & USAGE_OP_DEBUG)
(void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&on,
sizeof(on));
sndsock = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW);
-#ifdef CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
#if defined(IP_OPTIONS)
if (lsrr > 0) {
unsigned char optlist[MAX_IPOPTLEN];
}
#endif
#endif
-#ifdef CONFIG_FEATURE_TRACEROUTE_SO_DEBUG
+#if TRACEROUTE_SO_DEBUG
if (op & USAGE_OP_DEBUG)
(void)setsockopt(sndsock, SOL_SOCKET, SO_DEBUG, (char *)&on,
sizeof(on));
outip->ip_hl = (outp - (unsigned char *)outip) >> 2;
ident = (getpid() & 0xffff) | 0x8000;
-#ifdef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp) {
outip->ip_p = IPPROTO_ICMP;
if (strcmp(device, al->device) == 0)
break;
if (i <= 0) {
- bb_error_msg_and_die("Can't find interface %s", device);
+ bb_error_msg_and_die("can't find interface %s", device);
}
}