Bug#3318: traceroute doesn't work with 1.2.13
> Wouldn't it be easier to do something like I did with BIND -- detect
> the "protocol not available" (ENOPROTOOPT?) and don't use the feature,
> instead of calling it an error...
That was my thought. These patches should do it.
--- traceroute-4.4BSD/traceroute.c Sun Jan 28 22:47:27 1996
+++ traceroute.c Wed Jun 19 06:36:15 1996
@@ -310,6 +310,9 @@
struct protoent *pe;
struct sockaddr_in from, *to;
int ch, i, on, probe, seq, tos, ttl;
+#ifdef IP_HDRINCL
+ int hdrincl_works = 1;
+#endif
on = 1;
seq = tos = 0;
@@ -454,8 +457,12 @@
#ifdef IP_HDRINCL
if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on,
sizeof(on)) < 0) {
- perror("traceroute: IP_HDRINCL");
- exit(6);
+ if (errno == ENOPROTOOPT) {
+ hdrincl_works = 0;
+ } else {
+ perror("traceroute: IP_HDRINCL");
+ exit(6);
+ }
}
#endif IP_HDRINCL
if (options & SO_DEBUG)
@@ -475,7 +482,7 @@
}
outpacket->ip.ip_src = from.sin_addr;
#ifndef IP_HDRINCL
- if (bind(sndsock, (struct sockaddr *)&from, sizeof(from)) < 0) {
+ if (hdrincl_works && bind(sndsock, (struct sockaddr *)&from, sizeof(from)) < 0) {
perror ("traceroute: bind:");
exit (1);
}
--
Shields, CrossLink.
Reply to: