summaryrefslogtreecommitdiff
path: root/src/parseaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parseaddr.c')
-rw-r--r--src/parseaddr.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/parseaddr.c b/src/parseaddr.c
index 4c787204d734d..1b4e198b891b8 100644
--- a/src/parseaddr.c
+++ b/src/parseaddr.c
@@ -2362,6 +2362,10 @@ sameaddr(a, b)
if (strcmp(a->q_user, b->q_user) != 0)
return false;
+ /* do the required flags match? */
+ if (!ADDR_FLAGS_MATCH(a, b))
+ return false;
+
/* if we have good uids for both but they differ, these are different */
if (a->q_mailer == ProgMailer)
{
@@ -2409,6 +2413,7 @@ struct qflags
unsigned long qf_bit;
};
+/* :'a,.s;^#define \(Q[A-Z]*\) .*; { "\1", \1 },; */
static struct qflags AddressFlags[] =
{
{ "QGOODUID", QGOODUID },
@@ -2426,6 +2431,12 @@ static struct qflags AddressFlags[] =
{ "QDELIVERED", QDELIVERED },
{ "QDELAYED", QDELAYED },
{ "QTHISPASS", QTHISPASS },
+ { "QALIAS", QALIAS },
+ { "QBYTRACE", QBYTRACE },
+ { "QBYNDELAY", QBYNDELAY },
+ { "QBYNRELAY", QBYNRELAY },
+ { "QINTBCC", QINTBCC },
+ { "QDYNMAILER", QDYNMAILER },
{ "QRCPTOK", QRCPTOK },
{ NULL, 0 }
};
@@ -2789,7 +2800,7 @@ remotename(name, m, flags, pstat, e)
{
sm_dprintf("remotename => `");
xputs(sm_debug_file(), buf);
- sm_dprintf("'\n");
+ sm_dprintf("', stat=%d\n", *pstat);
}
return buf;
}
@@ -3060,6 +3071,8 @@ dequote_map(map, name, av, statp)
** logid -- id for sm_syslog.
** addr -- if not NULL and ruleset returns $#error:
** store mailer triple here.
+** addrstr -- if not NULL and ruleset does not return $#:
+** address string
**
** Returns:
** EX_OK -- if the rwset doesn't resolve to $#error
@@ -3067,7 +3080,7 @@ dequote_map(map, name, av, statp)
*/
int
-rscheck(rwset, p1, p2, e, flags, logl, host, logid, addr)
+rscheck(rwset, p1, p2, e, flags, logl, host, logid, addr, addrstr)
char *rwset;
char *p1;
char *p2;
@@ -3077,6 +3090,7 @@ rscheck(rwset, p1, p2, e, flags, logl, host, logid, addr)
char *host;
char *logid;
ADDRESS *addr;
+ char **addrstr;
{
char *volatile buf;
size_t bufsize;
@@ -3150,6 +3164,16 @@ rscheck(rwset, p1, p2, e, flags, logl, host, logid, addr)
(void) REWRITE(pvp, rsno, e);
if (bitset(RSF_UNSTRUCTURED, flags))
SuprErrs = saveSuprErrs;
+
+
+ if (pvp[0] != NULL && (pvp[0][0] & 0377) != CANONNET &&
+ bitset(RSF_ADDR, flags) && addrstr != NULL)
+ {
+ cataddr(&(pvp[0]), NULL, ubuf, sizeof(ubuf), ' ', true);
+ *addrstr = sm_rpool_strdup_x(e->e_rpool, ubuf);
+ goto finis;
+ }
+
if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET ||
pvp[1] == NULL || (strcmp(pvp[1], "error") != 0 &&
strcmp(pvp[1], "discard") != 0))