*/
#ifndef lint
-static char sccsid[] = "@(#)parseaddr.c 6.49 (Berkeley) %G%";
+static char sccsid[] = "@(#)parseaddr.c 6.50 (Berkeley) %G%";
#endif /* not lint */
#include "sendmail.h"
{
char savec = *delimptr;
- *delimptr = '\0';
+ if (savec != '\0')
+ *delimptr = '\0';
a->q_paddr = newstr(paddr);
- *delimptr = savec;
+ if (savec != '\0')
+ *delimptr = savec;
}
else
a->q_paddr = paddr;
char *tok;
int state;
int newstate;
+ char *saveto = CurEnv->e_to;
static char *av[MAXATOM+1];
/* make sure error messages don't have garbage on them */
state = ATM;
c = NOCHAR;
p = addr;
+ CurEnv->e_to = p;
if (tTd(22, 11))
{
printf("prescan: ");
usrerr("553 Address too long");
if (delimptr != NULL)
*delimptr = p;
+ CurEnv->e_to = saveto;
return (NULL);
}
usrerr("553 Unbalanced ')'");
if (delimptr != NULL)
*delimptr = p;
+ CurEnv->e_to = saveto;
return (NULL);
}
else
usrerr("553 Unbalanced '>'");
if (delimptr != NULL)
*delimptr = p;
+ CurEnv->e_to = saveto;
return (NULL);
}
anglecnt--;
syserr("553 prescan: too many tokens");
if (delimptr != NULL)
*delimptr = p;
+ CurEnv->e_to = saveto;
return (NULL);
}
*avp++ = tok;
printf("prescan==>");
printav(av);
}
+ CurEnv->e_to = saveto;
if (av[0] == NULL)
return (NULL);
return (av);
#ifndef lint
#ifdef SMTP
-static char sccsid[] = "@(#)srvrsmtp.c 6.51 (Berkeley) %G% (with SMTP)";
+static char sccsid[] = "@(#)srvrsmtp.c 6.52 (Berkeley) %G% (with SMTP)";
#else
-static char sccsid[] = "@(#)srvrsmtp.c 6.51 (Berkeley) %G% (without SMTP)";
+static char sccsid[] = "@(#)srvrsmtp.c 6.52 (Berkeley) %G% (without SMTP)";
#endif
#endif /* not lint */
define('r', protocol, e);
define('s', sendinghost, e);
initsys(e);
+ nrcpts = 0;
setproctitle("%s %s: %s", e->e_id, CurHostName, inp);
/* child -- go do the processing */
/* no errors during parsing, but might be a duplicate */
e->e_to = p;
if (!bitset(QBADADDR, a->q_flags))
+ {
message("250 Recipient ok");
+ nrcpts++;
+ }
else
{
/* punt -- should keep message in ADDRESS.... */
collect(TRUE, a != NULL, e);
e->e_flags &= ~EF_FATALERRS;
if (Errors != 0)
- break;
+ goto abortmessage;
/*
** Arrange to send to everyone.
*/
SmtpPhase = "delivery";
- if (e->e_nrcpts != 1)
+ if (nrcpts != 1 && a == NULL)
{
HoldErrs = TRUE;
e->e_errormode = EM_MAIL;
/* issue success if appropriate and reset */
if (Errors == 0 || HoldErrs)
message("250 %s Message accepted for delivery", id);
- if (bitset(EF_FATALERRS, e->e_flags))
+
+ if (bitset(EF_FATALERRS, e->e_flags) && !HoldErrs)
{
/* avoid sending back an extra message */
e->e_flags &= ~EF_FATALERRS;
+ e->e_flags |= EF_CLRQUEUE;
}
else
{
+ /* from now on, we have to operate silently */
+ HoldErrs = TRUE;
+ e->e_errormode = EM_MAIL;
+
/* if we just queued, poke it */
if (a != NULL && e->e_sendmode != SM_QUEUE)
{
if (!Verbose && e->e_sendmode != SM_QUEUE)
dowork(id, TRUE, e);
+ abortmessage:
/* if in a child, pop back to our parent */
if (InChild)
finis();