--- qmail-1.03/qmail-remote.c	Mon Jun 15 12:53:16 1998
+++ qmail-1.03-zzz/qmail-remote.c	Sun Oct 12 12:37:13 2003
@@ -42,4 +42,6 @@
 stralloc routes = {0};
 struct constmap maproutes;
+stralloc routesfrom = {0};
+struct constmap maproutesfrom;
 stralloc host = {0};
 stralloc sender = {0};
@@ -325,4 +327,12 @@
       if (!constmap_init(&maproutes,routes.s,routes.len,1)) temp_nomem(); break;
   }
+  switch(control_readfile(&routesfrom,"control/smtproutesfrom",0)) {
+    case -1:
+      temp_control();
+    case 0:
+      if (!constmap_init(&maproutesfrom,"",0,1)) temp_nomem(); break;
+    case 1:
+      if (!constmap_init(&maproutesfrom,routesfrom.s,routesfrom.len,1)) temp_nomem(); break;
+  }
 }
 
@@ -339,4 +349,5 @@
   int flagalias;
   char *relayhost;
+  char *relayhostfrom;
  
   sig_pipeignore();
@@ -366,4 +377,22 @@
 
   addrmangle(&sender,argv[2],&flagalias,0);
+
+  relayhostfrom = 0;
+  for (i = 0;i <= sender.len;++i)
+    if ((i == 0) || (i == sender.len) || (sender.s[i] == '.') || (sender.s[i - 1] == '@'))
+      if (relayhostfrom = constmap(&maproutesfrom,sender.s + i,sender.len - i))
+        break;
+  if (relayhostfrom && !*relayhostfrom) relayhostfrom = 0;
+
+  if (relayhostfrom) {
+    relayhost = relayhostfrom;
+    i = str_chr(relayhost,':');
+    if (relayhost[i]) {
+      scan_ulong(relayhost + i + 1,&port);
+      relayhost[i] = 0;
+    }
+    if (!stralloc_copys(&host,relayhost)) temp_nomem();
+  }
+
  
   if (!saa_readyplus(&reciplist,0)) temp_nomem();
@@ -375,5 +404,5 @@
     if (!saa_readyplus(&reciplist,1)) temp_nomem();
     reciplist.sa[reciplist.len] = sauninit;
-    addrmangle(reciplist.sa + reciplist.len,*recips,&flagalias,!relayhost);
+    addrmangle(reciplist.sa + reciplist.len,*recips,&flagalias,0);
     if (!flagalias) flagallaliases = 0;
     ++reciplist.len;
