-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.131 2005/05/03 10:02:27 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.132 2005/05/03 14:20:00 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
being worked on, but at least Exim now implements the latest version to
play with."
+PH/45 In a pipe transport, although a timeout while waiting for the pipe
+ process to complete was treated as a delivery failure, a timeout while
+ writing the message to the pipe was logged, but erroneously treated as a
+ successful delivery. Such timeouts include transport filter timeouts. For
+ consistency with the overall process timeout, these timeouts are now
+ treated as errors, giving rise to delivery failures by default. However,
+ there is now a new Boolean option for the pipe transport called
+ timeout_defer, which, if set TRUE, converts the failures into defers for
+ both kinds of timeout. A transport filter timeout is now identified in
+ the log output.
+
A note about Exim versions 4.44 and 4.50
----------------------------------------
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.38 2005/04/28 13:29:27 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.39 2005/05/03 14:20:00 ph10 Exp $
New Features in Exim
--------------------
PH/11 In a ${run expansion, the variable $value (which contains the standard
output) is now also usable in the "else" string.
+PH/12 In a pipe transport, although a timeout while waiting for the pipe
+ process to complete was treated as a delivery failure, a timeout while
+ writing the message to the pipe was logged, but erroneously treated as a
+ successful delivery. Such timeouts include transport filter timeouts. For
+ consistency with the overall process timeout, these timeouts are now
+ treated as errors, giving rise to delivery failures by default. However,
+ there is now a new Boolean option for the pipe transport called
+ timeout_defer, which, if set TRUE, converts the failures into defers for
+ both kinds of timeout. A transport filter timeout is now identified in
+ the log output.
+
Version 4.50
------------
-$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.7 2005/04/04 10:33:49 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.8 2005/05/03 14:20:00 ph10 Exp $
LISTS OF EXIM OPTIONS
---------------------
4. Those that can appear in the build time configuration for the Exim monitor
(Local/eximon.conf).
-This file was last updated for Exim release 4.50.
+This file was last updated for Exim release 4.51.
1. RUN TIME OPTIONS
1h pipe
1h queryprogram 4.00
5s iplookup 4.00
+timeout_defer boolean false pipe 4.51
timeout_frozen_after time 0s main 3.20
timezone string + main 3.15
tls_advertise_hosts host list * main 3.20
-/* $Cambridge: exim/src/src/exim.c,v 1.18 2005/04/06 10:06:14 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.19 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
close_unwanted(); /* Close unwanted file descriptors and TLS */
exim_nullstd(); /* Ensure std{in,out,err} exist */
+ /* Occasionally in the test harness we don't have synchronous delivery
+ set (can happen with bounces). In that case, let the old process finish
+ before continuing, to keep the debug output the same. */
+
+ if (running_in_test_harness && !synchronous_delivery) millisleep(100);
+
/* Re-exec Exim if we need to regain privilege (note: in mua_wrapper
mode, deliver_drop_privilege is forced TRUE). */
-/* $Cambridge: exim/src/src/globals.c,v 1.22 2005/04/07 10:54:54 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.23 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
int transport_count;
uschar **transport_filter_argv = NULL;
int transport_filter_timeout;
+BOOL transport_filter_timed_out = FALSE;
int transport_write_timeout= 0;
tree_node *tree_dns_fails = NULL;
-/* $Cambridge: exim/src/src/globals.h,v 1.14 2005/04/04 10:33:49 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.15 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
extern int transport_count; /* Count of bytes transported */
extern uschar **transport_filter_argv; /* For on-the-fly filtering */
extern int transport_filter_timeout; /* Timeout for same */
+extern BOOL transport_filter_timed_out; /* True if it did */
extern transport_info transports_available[]; /* Vector of available transports */
extern transport_instance *transports; /* Chain of instantiated transports */
-/* $Cambridge: exim/src/src/tls-openssl.c,v 1.4 2005/03/29 14:53:09 ph10 Exp $ */
+/* $Cambridge: exim/src/src/tls-openssl.c,v 1.5 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
tls_peerdn = txt;
}
-
-debug_printf("+++verify_callback_called=%d\n", verify_callback_called);
-
if (!verify_callback_called) tls_certificate_verified = TRUE;
verify_callback_called = TRUE;
-/* $Cambridge: exim/src/src/transport.c,v 1.7 2005/03/22 16:44:04 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transport.c,v 1.8 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
int pfd[2];
pid_t filter_pid, write_pid;
+transport_filter_timed_out = FALSE;
+
/* If there is no filter command set up, call the internal function that does
the actual work, passing it the incoming fd, and return its result. */
if (sigalrm_seen)
{
errno = ETIMEDOUT;
+ transport_filter_timed_out = TRUE;
goto TIDY_UP;
}
-/* $Cambridge: exim/src/src/transports/pipe.c,v 1.4 2005/02/17 11:58:27 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/pipe.c,v 1.5 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
(void *)offsetof(pipe_transport_options_block, temp_errors) },
{ "timeout", opt_time,
(void *)offsetof(pipe_transport_options_block, timeout) },
+ { "timeout_defer", opt_bool,
+ (void *)offsetof(pipe_transport_options_block, timeout_defer) },
{ "umask", opt_octint,
(void *)offsetof(pipe_transport_options_block, umask) },
{ "use_bsmtp", opt_bool,
FALSE, /* freeze_exec_fail */
FALSE, /* ignore_status */
FALSE, /* restrict_to_path */
+ FALSE, /* timeout_defer */
FALSE, /* use_shell */
FALSE, /* use_bsmtp */
FALSE /* use_crlf */
without reading all of it, we expect an EPIPE error, which should be ignored.
We used also to ignore WRITEINCOMPLETE but the writing function is now cleverer
at handling OS where the death of a pipe doesn't give EPIPE immediately. See
-comments therein. This change made 04-Sep-98. Clean up this code in a year or
-so. */
+comments therein. */
if (!written_ok)
{
if (errno == ETIMEDOUT)
+ {
+ addr->message = string_sprintf("%stimeout while writing to pipe",
+ transport_filter_timed_out? "transport filter " : "");
+ addr->transport_return = ob->timeout_defer? DEFER : FAIL;
timeout = 1;
- else if (errno == EPIPE /* || errno == ERRNO_WRITEINCOMPLETE */ )
+ }
+ else if (errno == EPIPE)
{
- debug_printf("transport error %s ignored\n",
- (errno == EPIPE)? "EPIPE" : "WRITEINCOMPLETE");
+ debug_printf("transport error EPIPE ignored\n");
}
else
{
{
killpg(pid, SIGKILL);
kill(outpid, SIGKILL);
- addr->transport_return = FAIL;
+ addr->transport_return = ob->timeout_defer? DEFER : FAIL;
addr->message = string_sprintf("pipe delivery process timed out");
}
-/* $Cambridge: exim/src/src/transports/pipe.h,v 1.2 2005/01/04 10:00:45 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/pipe.h,v 1.3 2005/05/03 14:20:01 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
BOOL freeze_exec_fail;
BOOL ignore_status;
BOOL restrict_to_path;
+ BOOL timeout_defer;
BOOL use_shell;
BOOL use_bsmtp;
BOOL use_crlf;