Patch from Jakob Hirsch.
fixes bug 1042
logged, but are not included in the bounce message, which merely contains
&"local delivery failed"&.
logged, but are not included in the bounce message, which merely contains
&"local delivery failed"&.
+If the command exits on a signal and the &%freeze_signal%& option is set then
+the message will be frozen in the queue. If that option is not set, a bounce
+will be sent as normal.
+
If the return code is greater than 128 and the command being run is a shell
script, it normally means that the script was terminated by a signal whose
If the return code is greater than 128 and the command being run is a shell
script, it normally means that the script was terminated by a signal whose
-value is the return code minus 128.
+value is the return code minus 128. The &%freeze_signal%& option does not
+apply in this case.
If Exim is unable to run the command (that is, if &[execve()]& fails), the
return code is set to 127. This is the value that a shell returns if it is
If Exim is unable to run the command (that is, if &[execve()]& fails), the
return code is set to 127. This is the value that a shell returns if it is
frozen, whatever the setting of &%ignore_status%&.
frozen, whatever the setting of &%ignore_status%&.
+.new
+.otion freeze_signal pipe boolean false
+.cindex "signal exit"
+.cidenx "&(pipe)& transport", "signal exit"
+Normally if the process run by a command in a pipe transport exits on a signal,
+a bounce message is sent. If &%freeze_signal%& is set, the message will be
+frozen in Exim's queue instead.
+.wen
+
+
.option ignore_status pipe boolean false
If this option is true, the status returned by the subprocess that is set up to
run the command is ignored, and Exim behaves as if zero had been returned.
.option ignore_status pipe boolean false
If this option is true, the status returned by the subprocess that is set up to
run the command is ignored, and Exim behaves as if zero had been returned.
PP/05 Bugzilla 1083: when lookup expansion defers, escape the output which
is logged, to avoid truncation. Patch from John Horne.
PP/05 Bugzilla 1083: when lookup expansion defers, escape the output which
is logged, to avoid truncation. Patch from John Horne.
+PP/06 Bugzilla 1042: implement freeze_signal on pipe transports.
+ Patch from Jakob Hirsch.
+
Exim version 4.74
-----------------
Exim version 4.74
-----------------
this: ldap_ca_cert_dir, ldap_ca_cert_file, ldap_cert_file, ldap_cert_key,
ldap_cipher_suite, ldap_require_cert, ldap_start_tls.
this: ldap_ca_cert_dir, ldap_ca_cert_file, ldap_cert_file, ldap_cert_key,
ldap_cipher_suite, ldap_require_cert, ldap_start_tls.
+ 2. The pipe transport now takes a boolean option, "freeze_signal", default
+ false. When true, if the external delivery command exits on a signal then
+ Exim will freeze the message in the queue, instead of generating a bounce.
+
Version 4.74
------------
Version 4.74
------------
(void *)offsetof(pipe_transport_options_block, escape_string) },
{ "freeze_exec_fail", opt_bool,
(void *)offsetof(pipe_transport_options_block, freeze_exec_fail) },
(void *)offsetof(pipe_transport_options_block, escape_string) },
{ "freeze_exec_fail", opt_bool,
(void *)offsetof(pipe_transport_options_block, freeze_exec_fail) },
+ { "freeze_signal", opt_bool,
+ (void *)offsetof(pipe_transport_options_block, freeze_signal) },
{ "ignore_status", opt_bool,
(void *)offsetof(pipe_transport_options_block, ignore_status) },
{ "log_defer_output", opt_bool | opt_public,
{ "ignore_status", opt_bool,
(void *)offsetof(pipe_transport_options_block, ignore_status) },
{ "log_defer_output", opt_bool | opt_public,
60*60, /* timeout */
0, /* options */
FALSE, /* freeze_exec_fail */
60*60, /* timeout */
0, /* options */
FALSE, /* freeze_exec_fail */
+ FALSE, /* freeze_signal */
FALSE, /* ignore_status */
FALSE, /* permit_coredump */
FALSE, /* restrict_to_path */
FALSE, /* ignore_status */
FALSE, /* permit_coredump */
FALSE, /* restrict_to_path */
/* Either the process completed, but yielded a non-zero (necessarily
positive) status, or the process was terminated by a signal (rc will contain
the negation of the signal number). Treat killing by signal as failure unless
/* Either the process completed, but yielded a non-zero (necessarily
positive) status, or the process was terminated by a signal (rc will contain
the negation of the signal number). Treat killing by signal as failure unless
- status is being ignored. */
+ status is being ignored. By default, the message is bounced back, unless
+ freeze_signal is set, in which case it is frozen instead. */
- if (!ob->ignore_status)
+ if (ob->freeze_signal)
+ {
+ addr->transport_return = DEFER;
+ addr->special_action = SPECIAL_FREEZE;
+ addr->message = string_sprintf("Child process of %s transport (running "
+ "command \"%s\") was terminated by signal %d (%s)%s", tblock->name, cmd,
+ -rc, os_strsignal(-rc), tmsg);
+ }
+ else if (!ob->ignore_status)
{
addr->transport_return = FAIL;
addr->message = string_sprintf("Child process of %s transport (running "
{
addr->transport_return = FAIL;
addr->message = string_sprintf("Child process of %s transport (running "
int timeout;
int options;
BOOL freeze_exec_fail;
int timeout;
int options;
BOOL freeze_exec_fail;
BOOL ignore_status;
BOOL permit_coredump;
BOOL restrict_to_path;
BOOL ignore_status;
BOOL permit_coredump;
BOOL restrict_to_path;