In the 2 mails I just sent, I swapped old and new files in the diff files.
This is again the 2 patchs.


--- qmail-send.c.orig	Wed Feb  5 08:50:46 2003
+++ qmail-send.c	Thu Feb 20 18:44:28 2003
@@ -50,6 +50,8 @@
 struct constmap maplocals;
 stralloc vdoms = {0};
 struct constmap mapvdoms;
+stralloc aliasdoms = {0};
+struct constmap mapaliasdoms;
 stralloc envnoathost = {0};
 stralloc bouncefrom = {0};
 stralloc bouncehost = {0};
@@ -121,6 +123,7 @@
   int j;
   char *x;
   static stralloc addr = {0};
+  static stralloc addr2 = {0};
   int at;
 
   if (!stralloc_copys(&rwline,"T")) return 0;
@@ -141,25 +144,40 @@
   }
 
   at = byte_rchr(addr.s,addr.len,'@');
+  
+  if (!stralloc_copyb(&addr2, addr.s, at+1)) return 0;
+
+  for (i=at+1; i <=addr.len; ++i) {
+    if ((i == at + 1) || (i == addr.len) || (addr.s[i] == '.')) {
+      if (x = constmap(&mapaliasdoms, addr.s+i, addr.len-i)) {
+	if (!stralloc_cats(&addr2, x)) return 0;
+	i=0;
+	break;
+      }
+    }
+  }
+  if (i) 
+    if (!stralloc_copy(&addr2, &addr)) return 0;
 
-  if (constmap(&maplocals,addr.s + at + 1,addr.len - at - 1)) {
-    if (!stralloc_cat(&rwline,&addr)) return 0;
+
+  if (constmap(&maplocals,addr2.s + at + 1,addr2.len - at - 1)) {
+    if (!stralloc_cat(&rwline,&addr2)) return 0;
     if (!stralloc_0(&rwline)) return 0;
     return 1;
   }
 
-  for (i = 0;i <= addr.len;++i)
-    if (!i || (i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.')))
-      if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) {
+  for (i = 0;i <= addr2.len;++i)
+    if (!i || (i == at + 1) || (i == addr2.len) || ((i > at) && (addr2.s[i] == '.')))
+      if (x = constmap(&mapvdoms,addr2.s + i,addr2.len - i)) {
         if (!*x) break;
         if (!stralloc_cats(&rwline,x)) return 0;
         if (!stralloc_cats(&rwline,"-")) return 0;
-        if (!stralloc_cat(&rwline,&addr)) return 0;
+        if (!stralloc_cat(&rwline,&addr2)) return 0;
         if (!stralloc_0(&rwline)) return 0;
         return 1;
       }
  
-  if (!stralloc_cat(&rwline,&addr)) return 0;
+  if (!stralloc_cat(&rwline,&addr2)) return 0;
   if (!stralloc_0(&rwline)) return 0;
   return 2;
 }
@@ -1637,6 +1655,14 @@
    case 0: if (!constmap_init(&mappercenthack,"",0,0)) return 0; break;
    case 1: if (!constmap_init(&mappercenthack,percenthack.s,percenthack.len,0)) return 0; break;
   }
+
+ switch(control_readfile(&aliasdoms,"control/aliasdomains",0))
+  {
+   case -1: return 0;
+   case 0: if (!constmap_init(&mapaliasdoms,"",0,1)) return 0; break;
+   case 1: if (!constmap_init(&mapaliasdoms,aliasdoms.s,aliasdoms.len,1)) return 0; break;
+  }
+
  switch(control_readfile(&vdoms,"control/virtualdomains",0))
   {
    case -1: return 0;
@@ -1647,11 +1673,12 @@
 
 stralloc newlocals = {0};
 stralloc newvdoms = {0};
+stralloc newaliasdoms = {0};
 stralloc newcbtext = {0};
 
 void regetcontrols()
 {
- int r;
+ int r,s;
 
  if (control_readint(&bouncemaxbytes,"control/bouncemaxbytes") == -1)
   { log1("alert: unable to reread control/bouncemaxbytes\n"); return; }
@@ -1667,9 +1694,13 @@
  r = control_readfile(&newvdoms,"control/virtualdomains",0);
  if (r == -1)
   { log1("alert: unable to reread control/virtualdomains\n"); return; }
+ s = control_readfile(&newaliasdoms,"control/aliasdomains",0);
+ if (s == -1)
+  { log1("alert: unable to reread control/aliasdomains\n"); return; }
 
  constmap_free(&maplocals);
  constmap_free(&mapvdoms);
+ constmap_free(&mapaliasdoms);
 
  while (!stralloc_copy(&locals,&newlocals)) nomem();
  while (!constmap_init(&maplocals,locals.s,locals.len,0)) nomem();
@@ -1681,6 +1712,15 @@
   }
  else
    while (!constmap_init(&mapvdoms,"",0,1)) nomem();
+
+ if (s)
+  {
+   while (!stralloc_copy(&aliasdoms,&newaliasdoms)) nomem();
+   while (!constmap_init(&mapaliasdoms,aliasdoms.s,aliasdoms.len,1)) nomem();
+  }
+ else
+   while (!constmap_init(&mapaliasdoms,"",0,1)) nomem();
+
 }
 
 void reread()
--- qmail-todo.c.orig	Thu Feb 20 21:38:20 2003
+++ qmail-todo.c	Thu Feb 20 21:44:31 2003
@@ -37,6 +37,8 @@
 struct constmap maplocals;
 stralloc vdoms = {0};
 struct constmap mapvdoms;
+stralloc aliasdoms = {0};
+struct constmap mapaliasdoms;
 stralloc envnoathost = {0};
 
 char strnum[FMT_ULONG];
@@ -100,6 +102,7 @@
   int j;
   char *x;
   static stralloc addr = {0};
+  static stralloc addr2 = {0};
   int at;
 
   if (!stralloc_copys(&rwline,"T")) return 0;
@@ -121,24 +124,40 @@
 
   at = byte_rchr(addr.s,addr.len,'@');
 
-  if (constmap(&maplocals,addr.s + at + 1,addr.len - at - 1)) {
-    if (!stralloc_cat(&rwline,&addr)) return 0;
+  
+  if (!stralloc_copyb(&addr2, addr.s, at+1)) return 0;
+
+  for (i=at+1; i <=addr.len; ++i) {
+    if ((i == at + 1) || (i == addr.len) || (addr.s[i] == '.')) {
+      if (x = constmap(&mapaliasdoms, addr.s+i, addr.len-i)) {
+	if (!stralloc_cats(&addr2, x)) return 0;
+	i=0;
+	break;
+      }
+    }
+  }
+  if (i) 
+    if (!stralloc_copy(&addr2, &addr)) return 0;
+
+
+  if (constmap(&maplocals,addr2.s + at + 1,addr2.len - at - 1)) {
+    if (!stralloc_cat(&rwline,&addr2)) return 0;
     if (!stralloc_0(&rwline)) return 0;
     return 1;
   }
 
-  for (i = 0;i <= addr.len;++i)
-    if (!i || (i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.')))
-      if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) {
+  for (i = 0;i <= addr2.len;++i)
+    if (!i || (i == at + 1) || (i == addr2.len) || ((i > at) && (addr2.s[i] == '.')))
+      if (x = constmap(&mapvdoms,addr2.s + i,addr2.len - i)) {
         if (!*x) break;
         if (!stralloc_cats(&rwline,x)) return 0;
         if (!stralloc_cats(&rwline,"-")) return 0;
-        if (!stralloc_cat(&rwline,&addr)) return 0;
+        if (!stralloc_cat(&rwline,&addr2)) return 0;
         if (!stralloc_0(&rwline)) return 0;
         return 1;
       }
  
-  if (!stralloc_cat(&rwline,&addr)) return 0;
+  if (!stralloc_cat(&rwline,&addr2)) return 0;
   if (!stralloc_0(&rwline)) return 0;
   return 2;
 }
@@ -564,6 +583,12 @@
    case 0: if (!constmap_init(&mappercenthack,"",0,0)) return 0; break;
    case 1: if (!constmap_init(&mappercenthack,percenthack.s,percenthack.len,0)) return 0; break;
   }
+ switch(control_readfile(&aliasdoms,"control/aliasdomains",0))
+  {
+   case -1: return 0;
+   case 0: if (!constmap_init(&mapaliasdoms,"",0,1)) return 0; break;
+   case 1: if (!constmap_init(&mapaliasdoms,aliasdoms.s,aliasdoms.len,1)) return 0; break;
+  }
  switch(control_readfile(&vdoms,"control/virtualdomains",0))
   {
    case -1: return 0;
@@ -575,19 +600,24 @@
 
 stralloc newlocals = {0};
 stralloc newvdoms = {0};
+stralloc newaliasdoms = {0};
 
 void regetcontrols(void)
 {
- int r;
+ int r,s;
 
  if (control_readfile(&newlocals,"control/locals",1) != 1)
   { log1("alert: qmail-todo: unable to reread control/locals\n"); return; }
  r = control_readfile(&newvdoms,"control/virtualdomains",0);
  if (r == -1)
   { log1("alert: qmail-todo: unable to reread control/virtualdomains\n"); return; }
+ s = control_readfile(&newaliasdoms,"control/aliasdomains",0);
+ if (s == -1)
+   { log1("alert: unable to reread control/aliasdomains\n"); return; }
 
  constmap_free(&maplocals);
  constmap_free(&mapvdoms);
+ constmap_free(&mapaliasdoms);
 
  while (!stralloc_copy(&locals,&newlocals)) nomem();
  while (!constmap_init(&maplocals,locals.s,locals.len,0)) nomem();
@@ -599,6 +629,14 @@
   }
  else
    while (!constmap_init(&mapvdoms,"",0,1)) nomem();
+
+ if (s)
+  {
+   while (!stralloc_copy(&aliasdoms,&newaliasdoms)) nomem();
+   while (!constmap_init(&mapaliasdoms,aliasdoms.s,aliasdoms.len,1)) nomem();
+  }
+ else
+   while (!constmap_init(&mapaliasdoms,"",0,1)) nomem();
 }
 
 void reread(void)
--- qmail-remote.c.orig	Sat Feb 22 12:17:15 2003
+++ qmail-remote.c	Mon Feb 24 00:56:00 2003
@@ -65,6 +65,8 @@
 stralloc host = {0};
 stralloc sender = {0};
 
+struct sockaddr_in slocal;
+
 saa reciplist = {0};
 
 struct ip_address partner;
@@ -652,6 +654,9 @@
 
 void getcontrols()
 {
+  stralloc iplocalstr={0};
+  struct ip_address iplocal;
+
   if (control_init() == -1) temp_control();
   if (control_readint(&timeout,"control/timeoutremote") == -1) temp_control();
   if (control_readint(&timeoutconnect,"control/timeoutconnect") == -1)
@@ -666,6 +671,18 @@
     case 1:
       if (!constmap_init(&maproutes,routes.s,routes.len,1)) temp_nomem(); break;
   }
+  switch(control_readline(&iplocalstr,"control/smtplocalip")) {
+  case -1:
+    temp_control();
+  case 0:
+    slocal.sin_family = 0; break;
+  case 1:
+    if (!ip_scan(iplocalstr.s, &iplocal)) { slocal.sin_family=0; break; }
+    slocal.sin_family = AF_INET;
+    slocal.sin_port=0;
+    byte_copy(&iplocal,4,&slocal.sin_addr);
+    break;
+  }
 }
 
 void main(argc,argv)
@@ -690,7 +707,6 @@
   if (chdir(auto_qmail) == -1) temp_chdir();
   getcontrols();
  
- 
   if (!stralloc_copys(&host,argv[1])) temp_nomem();
  
   relayhost = 0;
@@ -759,6 +775,10 @@
  
     smtpfd = socket(AF_INET,SOCK_STREAM,0);
     if (smtpfd == -1) temp_oserr();
+
+    if (slocal.sin_family == AF_INET)
+      if (bind(smtpfd,(struct sockaddr *) &slocal,sizeof(slocal)) == -1) { temp_oserr(); }
+
 
     /* performace hack to send TCP ACK's without delay */
     setsockopt(smtpfd, IPPROTO_TCP, TCP_NODELAY, &tcpnodelay, sizeof(tcpnodelay));

Reply via email to