diff -ur mtr-0.67/mtr.c mtr-0.67.acid/mtr.c
--- mtr-0.67/mtr.c	2004-12-09 17:11:40.000000000 +0100
+++ mtr-0.67.acid/mtr.c	2005-03-21 02:36:47.846950927 +0100
@@ -307,6 +307,12 @@
   struct hostent *  host                = NULL;
   int               net_preopen_result;
 
+  if (Hostname == NULL) Hostname = "localhost";
+
+  if (gethostname(LocalHostname, sizeof(LocalHostname))) {
+	strcpy(LocalHostname, "UNKNOWNHOST");
+  }
+
   /*  Get the raw sockets first thing, so we can drop to user euid immediately  */
 
   net_preopen_result = net_preopen ();
@@ -350,12 +356,6 @@
     exit(0);
   }
 
-  if (Hostname == NULL) Hostname = "localhost";
-
-  if (gethostname(LocalHostname, sizeof(LocalHostname))) {
-	strcpy(LocalHostname, "UNKNOWNHOST");
-  }
-
   if (net_preopen_result != 0) {
     fprintf(stderr, "mtr: Unable to get raw socket.  (Executable not suid?)\n");
     exit(1);
diff -ur mtr-0.67/net.c mtr-0.67.acid/net.c
--- mtr-0.67/net.c	2004-08-26 09:56:53.000000000 +0200
+++ mtr-0.67.acid/net.c	2005-03-21 02:49:29.934199851 +0100
@@ -30,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #include <memory.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -39,6 +40,7 @@
 
 #include "net.h"
 #include "display.h"
+#include "dns.h"
 
 
 /*  We can't rely on header files to provide this information, because
@@ -143,7 +145,7 @@
 extern int packetsize;		/* packet size used by ping */
 extern int bitpattern;		/* packet bit pattern used by ping */
 extern int tos;			/* type of service set in ping packet*/
-
+extern char LocalHostname[128];
 
 
 /* return the number of microseconds to wait before sending the next
@@ -608,6 +610,15 @@
   if (sendsock < 0)
     return -1;
 
+  sourceaddress.sin_family = AF_INET;
+  sourceaddress.sin_port = 0;
+  sourceaddress.sin_addr.s_addr = dns_forward(LocalHostname);
+
+  if(bind(sendsock, (struct sockaddr*)&sourceaddress, sizeof(sourceaddress)) == -1) {
+    perror("mtr: failed to bind to interface");
+    exit(1);
+  }
+
 #ifdef IP_HDRINCL
   /*  FreeBSD wants this to avoid sending out packets with protocol type RAW
       to the network.  */
@@ -636,7 +647,7 @@
   remoteaddress.sin_addr.s_addr = addr;
 
   len = sizeof (name); 
-  getsockname (recvsock, (struct sockaddr *)&name, &len);
+  getsockname (sendsock, (struct sockaddr *)&name, &len);
   localaddr = name.sin_addr;
 #if 0
   printf ("got localaddr: %x\n", *(int *)&localaddr); 
Only in mtr-0.67.acid: net.c~
