/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
(void *)offsetof(pipe_transport_options_block, temp_errors) },
{ "timeout", opt_time,
(void *)offsetof(pipe_transport_options_block, timeout) },
(void *)offsetof(pipe_transport_options_block, temp_errors) },
{ "timeout", opt_time,
(void *)offsetof(pipe_transport_options_block, timeout) },
FALSE, /* freeze_exec_fail */
FALSE, /* ignore_status */
FALSE, /* restrict_to_path */
FALSE, /* freeze_exec_fail */
FALSE, /* ignore_status */
FALSE, /* restrict_to_path */
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
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
/* The process did not complete in time; kill its process group and fail
the delivery. It appears to be necessary to kill the output process too, as
otherwise it hangs on for some time if the actual pipe process is sleeping.
/* The process did not complete in time; kill its process group and fail
the delivery. It appears to be necessary to kill the output process too, as
otherwise it hangs on for some time if the actual pipe process is sleeping.
- addr->transport_return = FAIL;
- addr->message = string_sprintf("pipe delivery process timed out");
+ addr->transport_return = ob->timeout_defer? DEFER : FAIL;
+ addr->message = string_sprintf("pipe delivery process timed out%s", tmsg);
{
addr->transport_return = PANIC;
addr->message = string_sprintf("Wait() failed for child process of %s "
{
addr->transport_return = PANIC;
addr->message = string_sprintf("Wait() failed for child process of %s "
- "transport: %s", tblock->name, strerror(errno));
+ "transport: %s%s", tblock->name, strerror(errno), tmsg);
{
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 "
- "command \"%s\") was terminated by signal %d (%s)", tblock->name, cmd,
- -rc, os_strsignal(-rc));
+ "command \"%s\") was terminated by signal %d (%s)%s", tblock->name, cmd,
+ -rc, os_strsignal(-rc), tmsg);
if (quote)
addr->message = string_cat(addr->message, &size, &ptr, US"\"", 1);
}
if (quote)
addr->message = string_cat(addr->message, &size, &ptr, US"\"", 1);
}
+
+ /* Add previous filter timeout message, if present. */
+
+ if (*tmsg != 0)
+ addr->message = string_cat(addr->message, &size, &ptr, tmsg,
+ Ustrlen(tmsg));
+