[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: