batchcount = 0;
}
-void smtp_rset(struct query *ctl)
+static void smtp_rset(struct query *ctl)
/* reset the mail transaction */
{
if (SMTP_rset(ctl->smtp_socket, ctl->smtphostmode) == SM_UNRECOVERABLE)
}
}
-int smtp_open(struct query *ctl)
+int smtp_setup(struct query *ctl)
/* try to open a socket to the appropriate SMTP server for this query */
{
/* maybe it's time to close the socket in order to force delivery */
*/
struct idlist *idp;
const char *id_me = run.invisible ? ctl->server.truename : fetchmailhost;
- int oldphase = phase;
+ int oldphase;
char *parsed_host = NULL;
errno = 0;
for (idp = ctl->smtphunt; idp; idp = idp->next)
{
char *cp;
- char *portnum = SMTP_PORT;
+ const char *portnum = SMTP_PORT;
ctl->smtphost = idp->id; /* remember last host tried. */
if (ctl->smtphost[0]=='/')
}
static int send_bouncemail(struct query *ctl, struct msgblk *msg,
- int userclass, char *message /* should have \r\n at the end */,
+ int userclass, const char *message /* should have \r\n at the end */,
int nerrors, char *errors[])
/* bounce back an error report a la RFC 1892 */
{
char daemon_name[15 + HOSTLEN] = "MAILER-DAEMON@";
- char boundary[BUFSIZ], *bounce_to;
+ char boundary[BUFSIZ];
+ const char *bounce_to;
int sock;
static char *fqdn_of_host = NULL;
const char *md1 = "MAILER-DAEMON", *md2 = "MAILER-DAEMON@";
{
int smtperr = atoi(smtp_response);
char *responses[1];
- struct idlist *walk;
- int found = 0;
responses[0] = xstrdup(smtp_response);
* messages, which are probably in English (none of the
* MTAs I know about are internationalized).
*/
- for( walk = ctl->antispam; walk; walk = walk->next )
- if ( walk->val.status.num == smtperr )
- {
- found=1;
- break;
- }
-
- /* if (str_find(&ctl->antispam, smtperr)) */
- if ( found )
+ if (str_find(&ctl->antispam, smtperr))
{
/*
* SMTP listener explicitly refuses to deliver mail
int n, oldphase;
char *last;
+ if (!buf)
+ return -1;
+
/* The line may contain NUL characters. Find the last char to use
* -- the real line termination is the sequence "\n\0".
*/
if (fflush(sinkfp) || ferror(sinkfp))
{
- report(stderr, GT_("BSMTP preamble write failed.\n"));
+ report(stderr, GT_("BSMTP preamble write failed: %s.\n"), strerror(errno));
return(PS_BSMTP);
}
*/
nameslen = 0;
for (idp = msg->recipients; idp; idp = idp->next)
- if ((idp->val.status.mark == XMIT_ACCEPT))
+ if (idp->val.status.mark == XMIT_ACCEPT)
nameslen += (strlen(idp->id) + 1); /* string + ' ' */
- if ((*good_addresses == 0))
+ if (*good_addresses == 0)
nameslen = strlen(run.postmaster);
names = (char *)xmalloc(nameslen + 1); /* account for '\0' */
* under all BSDs and Linux)
*/
orig_uid = getuid();
- seteuid(ctl->uid);
+ if (seteuid(ctl->uid)) {
+ report(stderr, GT_("Cannot switch effective user id to %ld: %s\n"), (long)ctl->uid, strerror(errno));
+ return PS_IOERR;
+ }
#endif /* HAVE_SETEUID */
sinkfp = popen(before, "w");
#ifdef HAVE_SETEUID
/* this will fail quietly if we didn't start as root */
- seteuid(orig_uid);
+ if (seteuid(orig_uid)) {
+ report(stderr, GT_("Cannot switch effective user id back to original %ld: %s\n"), (long)orig_uid, strerror(errno));
+ return PS_IOERR;
+ }
#endif /* HAVE_SETEUID */
if (!sinkfp)
{
*bad_addresses = *good_addresses = 0;
+ if (want_progress() && outlevel >= O_VERBOSE && !ctl->mda && !ctl->bsmtp) puts("");
+
if (ctl->bsmtp) /* dump to a BSMTP batch file */
return(open_bsmtp_sink(ctl, msg, good_addresses, bad_addresses));
/*
* open a socket fails, fall through to attempt delivery via
* local MDA.
*/
- else if (!ctl->mda && smtp_open(ctl) != -1)
+ else if (!ctl->mda && smtp_setup(ctl) != -1)
return(open_smtp_sink(ctl, msg, good_addresses, bad_addresses));
/*
/* perform end-of-message actions on the current output sink */
{
int smtp_err;
- if (ctl->mda)
- {
+
+ if (want_progress() && outlevel >= O_VERBOSE && !ctl->mda && !ctl->bsmtp) puts("");
+
+ if (ctl->bsmtp && sinkfp) {
+ int error, oerrno;
+
+ /* implicit disk-full check here... */
+ fputs(".\r\n", sinkfp);
+ error = ferror(sinkfp);
+ oerrno = errno;
+ if (strcmp(ctl->bsmtp, "-"))
+ {
+ if (fclose(sinkfp) == EOF) {
+ error = 1;
+ oerrno = errno;
+ }
+ sinkfp = (FILE *)NULL;
+ }
+ if (error)
+ {
+ report(stderr,
+ GT_("Message termination or close of BSMTP file failed: %s\n"), strerror(oerrno));
+ return(FALSE);
+ }
+ } else if (ctl->mda) {
int rc = 0, e = 0, e2 = 0, err = 0;
/* close the delivery pipe, we'll reopen before next message */
e = errno;
sinkfp = (FILE *)NULL;
}
- else
- rc = e = 0;
deal_with_sigchld(); /* Restore SIGCHLD handling to reap zombies */
return(FALSE);
}
}
- else if (ctl->bsmtp && sinkfp)
- {
- int error;
-
- /* implicit disk-full check here... */
- fputs(".\r\n", sinkfp);
- error = ferror(sinkfp);
- if (strcmp(ctl->bsmtp, "-"))
- {
- if (fclose(sinkfp) == EOF) error = 1;
- sinkfp = (FILE *)NULL;
- }
- if (error)
- {
- report(stderr,
- GT_("Message termination or close of BSMTP file failed\n"));
- return(FALSE);
- }
- }
else if (forward)
{
/* write message terminator */