summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/doc-txt/ChangeLog7
-rw-r--r--doc/doc-txt/NewStuff6
-rw-r--r--src/src/deliver.c25
-rw-r--r--src/src/transports/appendfile.c13
-rw-r--r--test/confs/053450
-rw-r--r--test/log/04112
-rw-r--r--test/log/05349
-rw-r--r--test/mail/0411.afolder9
-rw-r--r--test/mail/0534.mbox12
-rw-r--r--test/mail/0534.mbox212
-rwxr-xr-xtest/runtest4
-rw-r--r--test/scripts/0000-Basic/04112
-rw-r--r--test/scripts/0000-Basic/053410
13 files changed, 135 insertions, 26 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index f51f97071..8fb90d750 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.343 2006/04/20 10:57:46 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.344 2006/04/20 14:11:29 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -28,6 +28,11 @@ PH/04 Change PH/19 for 4.61 was too wide. It should not be applied to host
errors. Otherwise a message that provokes a temporary error (when other
messages do not) can cause a whole host to time out.
+PH/05 Batch deliveries by appendfile and pipe transports did not work when the
+ addresses were routed directly to files or pipes from a redirect router.
+ File deliveries just didn't batch; pipe deliveries might have suffered
+ odd errors.
+
Exim version 4.61
-----------------
diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index 38c20991b..dc03699f3 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.100 2006/04/18 11:13:19 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.101 2006/04/20 14:11:29 ph10 Exp $
New Features in Exim
--------------------
@@ -25,6 +25,10 @@ Version 4.62
a connection has been made, the behaviour is as for ${readsocket with a Unix
domain socket.
+2. If a redirect router sets up file or pipe deliveries for more than one
+ incoming address, and the relevant transport has batch_max set greater than
+ one, a batch delivery now occurs.
+
Version 4.61
------------
diff --git a/src/src/deliver.c b/src/src/deliver.c
index 0cb0132c4..a80d97842 100644
--- a/src/src/deliver.c
+++ b/src/src/deliver.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/deliver.c,v 1.30 2006/03/01 16:07:16 ph10 Exp $ */
+/* $Cambridge: exim/src/src/deliver.c,v 1.31 2006/04/20 14:11:29 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -228,11 +228,18 @@ if (addr->next == NULL)
}
/* For multiple addresses, don't set local part, and leave the domain and
-self_hostname set only if it is the same for all of them. */
+self_hostname set only if it is the same for all of them. It is possible to
+have multiple pipe and file addresses, but only when all addresses have routed
+to the same pipe or file. */
else
{
address_item *addr2;
+ if (testflag(addr, af_pfr))
+ {
+ if (testflag(addr, af_file)) address_file = addr->local_part;
+ else if (addr->local_part[0] == '|') address_pipe = addr->local_part;
+ }
for (addr2 = addr->next; addr2 != NULL; addr2 = addr2->next)
{
if (deliver_domain != NULL &&
@@ -2119,15 +2126,17 @@ while (addr_local != NULL)
disable_logging = tp->disable_logging;
- /* Check for batched addresses and possible amalgamation. File deliveries can
- never be batched. Skip all the work if either batch_max <= 1 or there aren't
- any other addresses for local delivery. */
+ /* Check for batched addresses and possible amalgamation. Skip all the work
+ if either batch_max <= 1 or there aren't any other addresses for local
+ delivery. */
- if (!testflag(addr, af_file) && tp->batch_max > 1 && addr_local != NULL)
+ if (tp->batch_max > 1 && addr_local != NULL)
{
int batch_count = 1;
BOOL uses_dom = readconf_depends((driver_instance *)tp, US"domain");
- BOOL uses_lp = readconf_depends((driver_instance *)tp, US"local_part");
+ BOOL uses_lp = (testflag(addr, af_pfr) &&
+ (testflag(addr, af_file) || addr->local_part[0] == '|')) ||
+ readconf_depends((driver_instance *)tp, US"local_part");
uschar *batch_id = NULL;
address_item **anchor = &addr_local;
address_item *last = addr;
@@ -2156,6 +2165,7 @@ while (addr_local != NULL)
same transport
not previously delivered (see comment about 50 lines above)
same local part if the transport's configuration contains $local_part
+ or if this is a file or pipe delivery from a redirection
same domain if the transport's configuration contains $domain
same errors address
same additional headers
@@ -2169,6 +2179,7 @@ while (addr_local != NULL)
BOOL ok =
tp == next->transport &&
!previously_transported(next, TRUE) &&
+ (addr->flags & (af_pfr|af_file)) == (next->flags & (af_pfr|af_file)) &&
(!uses_lp || Ustrcmp(next->local_part, addr->local_part) == 0) &&
(!uses_dom || Ustrcmp(next->domain, addr->domain) == 0) &&
same_strings(next->p.errors_address, addr->p.errors_address) &&
diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c
index 7a415de7a..090951969 100644
--- a/src/src/transports/appendfile.c
+++ b/src/src/transports/appendfile.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/appendfile.c,v 1.14 2006/03/01 11:24:04 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/appendfile.c,v 1.15 2006/04/20 14:11:29 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -1333,10 +1333,15 @@ if (path[0] != '/')
return FALSE;
}
-/* For a file delivery, make sure the local part in the address is updated to
-the true local part. */
+/* For a file delivery, make sure the local part in the address(es) is updated
+to the true local part. */
-if (testflag(addr, af_file)) addr->local_part = string_copy(path);
+if (testflag(addr, af_file))
+ {
+ address_item *addr2;
+ for (addr2 = addr; addr2 != NULL; addr2 = addr2->next)
+ addr2->local_part = string_copy(path);
+ }
/* The available mailbox formats depend on whether it is a directory or a file
delivery. */
diff --git a/test/confs/0534 b/test/confs/0534
new file mode 100644
index 000000000..5e83476fb
--- /dev/null
+++ b/test/confs/0534
@@ -0,0 +1,50 @@
+# Exim test configuration 0534
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+
+
+# ----- Routers -----
+
+begin routers
+
+r1:
+ driver = redirect
+ local_part_prefix = file-
+ local_part_suffix = =*
+ data = DIR/test-mail/${substr_1:$local_part_suffix}
+ file_transport = t1
+
+r2:
+ driver = redirect
+ local_part_prefix = pipe-
+ local_part_suffix = =*
+ data = |${substr_1:$local_part_suffix}
+ pipe_transport = t2
+
+
+# ----- Transports -----
+
+begin transports
+
+t1:
+ driver = appendfile
+ envelope_to_add
+ user = CALLER
+ batch_max = 10
+
+t2:
+ driver = pipe
+ user = CALLER
+ batch_max = 10
+
+# End
diff --git a/test/log/0411 b/test/log/0411
index 70c8c8838..8cf2f6097 100644
--- a/test/log/0411
+++ b/test/log/0411
@@ -3,7 +3,7 @@
1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmaY-0005vi-00 => TESTSUITE/test-mail/afolder <t12@test.ex> R=r1 T=t1
-1999-03-02 09:44:33 10HmaY-0005vi-00 => TESTSUITE/test-mail/afolder <t11@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaY-0005vi-00 -> TESTSUITE/test-mail/afolder <t11@test.ex> R=r1 T=t1
1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmaZ-0005vi-00 == save bfolder <t2@test.ex> R=r2 T=t2 defer (-21): appendfile: file or directory name "bfolder" is not absolute
diff --git a/test/log/0534 b/test/log/0534
new file mode 100644
index 000000000..c59e48e5c
--- /dev/null
+++ b/test/log/0534
@@ -0,0 +1,9 @@
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaX-0005vi-00 => |TESTSUITE/bin/../bin/iefbr14 <pipe-userz=TESTSUITE/bin/../bin/iefbr14@test.ex> R=r2 T=t2
+1999-03-02 09:44:33 10HmaX-0005vi-00 => |TESTSUITE/bin/iefbr14 <pipe-usery=TESTSUITE/bin/iefbr14@test.ex> R=r2 T=t2
+1999-03-02 09:44:33 10HmaX-0005vi-00 -> |TESTSUITE/bin/iefbr14 <pipe-userx=TESTSUITE/bin/iefbr14@test.ex> R=r2 T=t2
+1999-03-02 09:44:33 10HmaX-0005vi-00 => TESTSUITE/test-mail/mbox2 <file-usera=mbox2@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-0005vi-00 -> TESTSUITE/test-mail/mbox2 <file-userz=mbox2@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-0005vi-00 => TESTSUITE/test-mail/mbox <file-usery=mbox@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-0005vi-00 -> TESTSUITE/test-mail/mbox <file-userx=mbox@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
diff --git a/test/mail/0411.afolder b/test/mail/0411.afolder
index 3810e1196..96b94a189 100644
--- a/test/mail/0411.afolder
+++ b/test/mail/0411.afolder
@@ -17,12 +17,3 @@ From: CALLER_NAME <CALLER@test.ex>
Date: Tue, 2 Mar 1999 09:44:33 +0000
-From CALLER@test.ex Tue Mar 02 09:44:33 1999
-Received: from CALLER by mail.test.ex with local (Exim x.yz)
- (envelope-from <CALLER@test.ex>)
- id 10HmaY-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
-Message-Id: <E10HmaY-0005vi-00@mail.test.ex>
-From: CALLER_NAME <CALLER@test.ex>
-Date: Tue, 2 Mar 1999 09:44:33 +0000
-
-
diff --git a/test/mail/0534.mbox b/test/mail/0534.mbox
new file mode 100644
index 000000000..26716f507
--- /dev/null
+++ b/test/mail/0534.mbox
@@ -0,0 +1,12 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Envelope-to: file-usery=mbox@test.ex,
+ file-userx=mbox@test.ex
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+ (envelope-from <CALLER@myhost.test.ex>)
+ id 10HmaX-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+A test message.
+
diff --git a/test/mail/0534.mbox2 b/test/mail/0534.mbox2
new file mode 100644
index 000000000..4d2c7548b
--- /dev/null
+++ b/test/mail/0534.mbox2
@@ -0,0 +1,12 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Envelope-to: file-usera=mbox2@test.ex,
+ file-userz=mbox2@test.ex
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+ (envelope-from <CALLER@myhost.test.ex>)
+ id 10HmaX-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+A test message.
+
diff --git a/test/runtest b/test/runtest
index 76cc4b99b..2e0c72417 100755
--- a/test/runtest
+++ b/test/runtest
@@ -1,6 +1,6 @@
#! /usr/bin/perl -w
-# $Cambridge: exim/test/runtest,v 1.6 2006/03/17 16:51:45 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.7 2006/04/20 14:11:29 ph10 Exp $
###############################################################################
# This is the controlling script for the "new" test suite for Exim. It should #
@@ -23,7 +23,7 @@ use Socket;
# Start by initializing some global variables
-$testversion = "4.61 (06-Feb-06)";
+$testversion = "4.62 (20-Apr-06)";
$cf = "bin/cf";
$cr = "\r";
diff --git a/test/scripts/0000-Basic/0411 b/test/scripts/0000-Basic/0411
index 7bd1ff9d4..012d4e3e6 100644
--- a/test/scripts/0000-Basic/0411
+++ b/test/scripts/0000-Basic/0411
@@ -1,7 +1,7 @@
# use of file= in appendfile with filter setting the folder
exim -odi t1
****
-# Batched multiple deliveries (it doesn't batch)
+# Batched multiple deliveries (since 4.62 it does batch)
exim -odi t11 t12
****
# Error message for failure before full path is set
diff --git a/test/scripts/0000-Basic/0534 b/test/scripts/0000-Basic/0534
new file mode 100644
index 000000000..0e039601c
--- /dev/null
+++ b/test/scripts/0000-Basic/0534
@@ -0,0 +1,10 @@
+# Batch_max when redirecting to a mailbox or a pipe
+exim -odi file-userx=mbox@test.ex \
+ file-usery=mbox@test.ex \
+ file-userz=mbox2@test.ex \
+ file-usera=mbox2@test.ex \
+ pipe-userx=DIR/bin/iefbr14@test.ex \
+ pipe-usery=DIR/bin/iefbr14@test.ex \
+ pipe-userz=DIR/bin/../bin/iefbr14@test.ex
+A test message.
+****