From 3ee3b980a23b79479a650343a0fa876f68cad4bc Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 16 Aug 2017 16:35:48 +0200 Subject: Implement plus addressing for virtualdomains --- realrcptto.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'realrcptto.c') diff --git a/realrcptto.c b/realrcptto.c index 866bd57..e18a21f 100644 --- a/realrcptto.c +++ b/realrcptto.c @@ -165,6 +165,25 @@ static int userext() } } +static char *virtualext(stralloc *localpart, unsigned int at) +{ + static stralloc newaddr = {0}; + unsigned int i; + char *x; + + for (i = at; i > 0; --i) + if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break; + if (i == 0 || i == at - 1) return NULL; + + if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); + if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); + x = constmap(&mapvdoms, newaddr.s, newaddr.len); + if (!x) return NULL; + + localpart->s[i] = '-'; + return x; +} + // max lookups #define MAXRECURSION 5 @@ -286,7 +305,11 @@ int depth; unsigned int xlen,newlen; char *x; for (i = 0;;++i) { - if (i > localpart.len) return denyaddr(addr, depth); + if (i > localpart.len) { + x = virtualext(&localpart, at); + if (x) break; + return denyaddr(addr, depth); + } if (!i || (i == at + 1) || (i == localpart.len) || ((i > at) && (localpart.s[i] == '.'))) { x = constmap(&mapvdoms,localpart.s + i,localpart.len - i); -- cgit v1.2.3