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));