X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/ea49d0e16fbc6f56fc5b8519d266f88d09139187..715ab37671cc2b25fe70463a940f2245af73615b:/src/src/deliver.c diff --git a/src/src/deliver.c b/src/src/deliver.c index dbec42e0e..0cb0132c4 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/deliver.c,v 1.27 2006/02/08 14:28:51 ph10 Exp $ */ +/* $Cambridge: exim/src/src/deliver.c,v 1.30 2006/03/01 16:07:16 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1490,6 +1490,44 @@ return FALSE; +/****************************************************** +* Check for a given header in a header string * +******************************************************/ + +/* This function is used when generating quota warnings. The configuration may +specify any header lines it likes in quota_warn_message. If certain of them are +missing, defaults are inserted, so we need to be able to test for the presence +of a given header. + +Arguments: + hdr the required header name + hstring the header string + +Returns: TRUE the header is in the string + FALSE the header is not in the string +*/ + +static BOOL +contains_header(uschar *hdr, uschar *hstring) +{ +int len = Ustrlen(hdr); +uschar *p = hstring; +while (*p != 0) + { + if (strncmpic(p, hdr, len) == 0) + { + p += len; + while (*p == ' ' || *p == '\t') p++; + if (*p == ':') return TRUE; + } + while (*p != 0 && *p != '\n') p++; + if (*p == '\n') p++; + } +return FALSE; +} + + + /************************************************* * Perform a local delivery * @@ -1705,7 +1743,7 @@ if ((pid = fork()) == 0) if (addr->transport->setup != NULL) { - switch((addr->transport->setup)(addr->transport, addr, NULL, + switch((addr->transport->setup)(addr->transport, addr, NULL, uid, gid, &(addr->message))) { case DEFER: @@ -1991,12 +2029,13 @@ if (addr->special_action == SPECIAL_WARN && if (pid > 0) { FILE *f = fdopen(fd, "wb"); - - if (errors_reply_to != NULL) + if (errors_reply_to != NULL && + !contains_header(US"Reply-To", warn_message)) fprintf(f, "Reply-To: %s\n", errors_reply_to); fprintf(f, "Auto-Submitted: auto-replied\n"); - fprintf(f, "From: Mail Delivery System \n", - qualify_domain_sender); + if (!contains_header(US"From", warn_message)) + fprintf(f, "From: Mail Delivery System \n", + qualify_domain_sender); fprintf(f, "%s", CS warn_message); /* Close and wait for child process to complete, without a timeout. */ @@ -3578,12 +3617,25 @@ for (delivery_count = 0; addr_remote != NULL; delivery_count++) else return_path = new_return_path; } + /* Find the uid, gid, and use_initgroups setting for this transport. Failure + logs and sets up error messages, so we just post-process and continue with + the next address. */ + + if (!findugid(addr, tp, &uid, &gid, &use_initgroups)) + { + remote_post_process(addr, LOG_MAIN|LOG_PANIC, NULL, fallback); + continue; + } + /* If this transport has a setup function, call it now so that it gets run in this process and not in any subprocess. That way, the results of - any setup that are retained by the transport can be reusable. */ + any setup that are retained by the transport can be reusable. One of the + things the setup does is to set the fallback host lists in the addresses. + That is why it is called at this point, before the continue delivery + processing, because that might use the fallback hosts. */ if (tp->setup != NULL) - (void)((tp->setup)(addr->transport, addr, NULL, NULL)); + (void)((tp->setup)(addr->transport, addr, NULL, uid, gid, NULL)); /* If this is a run to continue delivery down an already-established channel, check that this set of addresses matches the transport and @@ -3659,16 +3711,6 @@ for (delivery_count = 0; addr_remote != NULL; delivery_count++) transport_filter_argv = NULL; - /* Find the uid, gid, and use_initgroups setting for this transport. Failure - logs and sets up error messages, so we just post-process and continue with - the next address. */ - - if (!findugid(addr, tp, &uid, &gid, &use_initgroups)) - { - remote_post_process(addr, LOG_MAIN|LOG_PANIC, NULL, fallback); - continue; - } - /* Create the pipe for inter-process communication. If pipe creation fails, it is probably because the value of remote_max_parallel is so large that too many file descriptors for pipes have been created. Arrange @@ -4257,15 +4299,15 @@ introducing newlines. All lines are indented by 4; the initial printing position must be set before calling. This function used always to print the error. Nowadays we want to restrict it -to cases such as SMTP errors from a remote host, and errors from :fail: and -filter "fail". We no longer pass other information willy-nilly in bounce and -warning messages. Text in user_message is always output; text in message only -if the af_pass_message flag is set. +to cases such as LMTP/SMTP errors from a remote host, and errors from :fail: +and filter "fail". We no longer pass other information willy-nilly in bounce +and warning messages. Text in user_message is always output; text in message +only if the af_pass_message flag is set. Arguments: addr the address f the FILE to print on - s some leading text + t some leading text Returns: nothing */ @@ -4274,14 +4316,11 @@ static void print_address_error(address_item *addr, FILE *f, uschar *t) { int count = Ustrlen(t); -uschar *s = (addr->user_message != NULL)? addr->user_message : addr->message; +uschar *s = testflag(addr, af_pass_message)? addr->message : NULL; -if (addr->user_message != NULL) - s = addr->user_message; -else +if (s == NULL) { - if (!testflag(addr, af_pass_message) || addr->message == NULL) return; - s = addr->message; + if (addr->user_message != NULL) s = addr->user_message; else return; } fprintf(f, "\n %s", t);