X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sink.c;h=5d92556f01d5435ef1d9e1d847521a4b50d6b350;hb=91644ff0b2e6eb3b26c5544a4a769ca4aaf08a14;hp=a7a2820e8af74cc5391fe39c776b78768e4c7ff9;hpb=a02ccfaeb28ac0cd1d8f2020b238c4861e068666;p=~andy%2Ffetchmail diff --git a/sink.c b/sink.c index a7a2820e..5d92556f 100644 --- a/sink.c +++ b/sink.c @@ -114,7 +114,7 @@ int smtp_setup(struct query *ctl) */ struct idlist *idp; const char *id_me = run.invisible ? ctl->server.truename : fetchmailhost; - int oldphase = phase; + int oldphase; char *parsed_host = NULL; errno = 0; @@ -131,7 +131,7 @@ int smtp_setup(struct query *ctl) 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]=='/') @@ -262,12 +262,13 @@ char *rcpt_address(struct query *ctl, const char *id, } 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@"; @@ -440,8 +441,6 @@ static int handle_smtp_report(struct query *ctl, struct msgblk *msg) { int smtperr = atoi(smtp_response); char *responses[1]; - struct idlist *walk; - int found = 0; responses[0] = xstrdup(smtp_response); @@ -465,15 +464,7 @@ static int handle_smtp_report(struct query *ctl, struct msgblk *msg) * 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 @@ -648,6 +639,9 @@ int stuffline(struct query *ctl, char *buf) 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". */ @@ -1129,9 +1123,9 @@ static int open_mda_sink(struct query *ctl, struct msgblk *msg, */ 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' */ @@ -1235,7 +1229,10 @@ static int open_mda_sink(struct query *ctl, struct msgblk *msg, * 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"); @@ -1244,7 +1241,10 @@ static int open_mda_sink(struct query *ctl, struct msgblk *msg, #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) @@ -1269,6 +1269,8 @@ int open_sink(struct query *ctl, struct msgblk *msg, { *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)); /* @@ -1348,6 +1350,8 @@ int close_sink(struct query *ctl, struct msgblk *msg, flag forward) { int smtp_err; + if (want_progress() && outlevel >= O_VERBOSE && !ctl->mda && !ctl->bsmtp) puts(""); + if (ctl->bsmtp && sinkfp) { int error, oerrno; @@ -1385,8 +1389,6 @@ int close_sink(struct query *ctl, struct msgblk *msg, flag forward) e = errno; sinkfp = (FILE *)NULL; } - else - rc = e = 0; deal_with_sigchld(); /* Restore SIGCHLD handling to reap zombies */