ph10 2006/04/27 09:53:25 BST
Modified files:
exim-doc/doc-txt ChangeLog NewStuff OptionLists.txt
exim-src/src/transports appendfile.c appendfile.h tf_maildir.c
tf_maildir.h
exim-test/confs 5009
exim-test/scripts/5000-maildir 5009
Log:
Add maildirfolder_create_regex to appendfile.
Revision Changes Path
1.349 +2 -0 exim/exim-doc/doc-txt/ChangeLog
1.102 +5 -0 exim/exim-doc/doc-txt/NewStuff
1.20 +2 -1 exim/exim-doc/doc-txt/OptionLists.txt
1.18 +8 -2 exim/exim-src/src/transports/appendfile.c
1.5 +1 -0 exim/exim-src/src/transports/appendfile.h
1.9 +55 -4 exim/exim-src/src/transports/tf_maildir.c
1.5 +2 -1 exim/exim-src/src/transports/tf_maildir.h
1.2 +1 -0 exim/exim-test/confs/5009
1.2 +4 -4 exim/exim-test/scripts/5000-maildir/5009
Index: ChangeLog
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
retrieving revision 1.348
retrieving revision 1.349
diff -u -r1.348 -r1.349
--- ChangeLog 25 Apr 2006 14:02:29 -0000 1.348
+++ ChangeLog 27 Apr 2006 08:53:24 -0000 1.349
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.348 2006/04/25 14:02:29 ph10 Exp $
+$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.349 2006/04/27 08:53:24 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -49,6 +49,8 @@
was calculated. There was no check that a delivery was happening into an
excluded directory. This bug has been fixed by ignoring all quota
processing for deliveries into excluded directories.
+
+PH/10 Added the maildirfolder_create_regex option to appendfile.
Exim version 4.61
Index: NewStuff
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/NewStuff,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -r1.101 -r1.102
--- NewStuff 20 Apr 2006 14:11:29 -0000 1.101
+++ NewStuff 27 Apr 2006 08:53:24 -0000 1.102
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.101 2006/04/20 14:11:29 ph10 Exp $
+$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.102 2006/04/27 08:53:24 ph10 Exp $
New Features in Exim
--------------------
@@ -28,6 +28,11 @@
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.
+
+3. The appendfile transport has a new option called maildirfolder_create_regex.
+ Its value is a regular expression. For a maildir delivery, this is matched
+ against the maildir directory; if it matches, Exim ensures that a
+ maildirfolder file is created alongside the new, cur, and tmp directories.
Version 4.61
Index: OptionLists.txt
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/OptionLists.txt,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- OptionLists.txt 28 Feb 2006 12:42:47 -0000 1.19
+++ OptionLists.txt 27 Apr 2006 08:53:24 -0000 1.20
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/OptionLists.txt,v 1.19 2006/02/28 12:42:47 ph10 Exp $
+$Cambridge: exim/exim-doc/doc-txt/OptionLists.txt,v 1.20 2006/04/27 08:53:24 ph10 Exp $
LISTS OF EXIM OPTIONS
---------------------
@@ -11,7 +11,7 @@
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.61.
+This file was last updated for Exim release 4.62.
1. RUN TIME OPTIONS
@@ -314,6 +314,7 @@
maildir_retries integer 10 appendfile 1.70
maildir_tag string* unset appendfile 1.92
maildir_use_size_file boolean false appendfile 4.30
+maildirfolder_create_regex string unset appendfile 4.62
mailstore_format boolean false appendfile 2.00
mailstore_prefix string* unset appendfile 2.00
mailstore_suffix string* unset appendfile 2.00
Index: appendfile.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/transports/appendfile.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- appendfile.c 25 Apr 2006 14:02:30 -0000 1.17
+++ appendfile.c 27 Apr 2006 08:53:24 -0000 1.18
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/transports/appendfile.c,v 1.17 2006/04/25 14:02:30 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/transports/appendfile.c,v 1.18 2006/04/27 08:53:24 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -107,6 +107,8 @@
(void *)offsetof(appendfile_transport_options_block, maildir_tag) },
{ "maildir_use_size_file", opt_bool,
(void *)offsetof(appendfile_transport_options_block, maildir_use_size_file ) } ,
+ { "maildirfolder_create_regex", opt_stringptr,
+ (void *)offsetof(appendfile_transport_options_block, maildirfolder_create_regex ) },
#endif /* SUPPORT_MAILDIR */
#ifdef SUPPORT_MAILSTORE
{ "mailstore_format", opt_bool,
@@ -184,6 +186,7 @@
NULL, /* mailbox_filecount_string */
US"^(?:cur|new|\\..*)$", /* maildir_dir_regex */
NULL, /* maildir_tag */
+ NULL, /* maildirfolder_create_regex */
NULL, /* mailstore_prefix */
NULL, /* mailstore_suffix */
NULL, /* check_string (default changed for non-bsmtp file)*/
@@ -2152,10 +2155,11 @@
}
#ifdef SUPPORT_MAILDIR
- /* For a maildir delivery, ensure that all the relevant directories exist */
+ /* For a maildir delivery, ensure that all the relevant directories exist,
+ and a maildirfolder file if necessary. */
if (mbformat == mbf_maildir && !maildir_ensure_directories(path, addr,
- ob->create_directory, ob->dirmode))
+ ob->create_directory, ob->dirmode, ob->maildirfolder_create_regex))
return FALSE;
#endif /* SUPPORT_MAILDIR */
@@ -2236,6 +2240,8 @@
{
*slash = 0;
check_path = new_check_path;
+ DEBUG(D_transport) debug_printf("maildirfolder file exists: "
+ "quota check directory changed to %s\n", check_path);
}
}
}
Index: appendfile.h
===================================================================
RCS file: /home/cvs/exim/exim-src/src/transports/appendfile.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- appendfile.h 7 Feb 2006 11:19:03 -0000 1.4
+++ appendfile.h 27 Apr 2006 08:53:24 -0000 1.5
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/transports/appendfile.h,v 1.4 2006/02/07 11:19:03 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/transports/appendfile.h,v 1.5 2006/04/27 08:53:24 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -25,6 +25,7 @@
uschar *mailbox_filecount_string;
uschar *maildir_dir_regex;
uschar *maildir_tag;
+ uschar *maildirfolder_create_regex;
uschar *mailstore_prefix;
uschar *mailstore_suffix;
uschar *check_string;
Index: tf_maildir.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/transports/tf_maildir.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- tf_maildir.c 7 Feb 2006 11:19:03 -0000 1.8
+++ tf_maildir.c 27 Apr 2006 08:53:24 -0000 1.9
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/transports/tf_maildir.c,v 1.8 2006/02/07 11:19:03 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/transports/tf_maildir.c,v 1.9 2006/04/27 08:53:24 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -29,19 +29,22 @@
*************************************************/
/* This function is called at the start of a maildir delivery, to ensure that
-all the relevant directories exist.
+all the relevant directories exist. It also creates a maildirfolder file if the
+base directory matches a given pattern.
Argument:
path the base directory name
addr the address item (for setting an error message)
create_directory true if we are allowed to create missing directories
dirmode the mode for created directories
+ maildirfolder_create_regex
+ the pattern to match for maildirfolder creation
Returns: TRUE on success; FALSE on failure
*/
BOOL maildir_ensure_directories(uschar *path, address_item *addr,
- BOOL create_directory, int dirmode)
+ BOOL create_directory, int dirmode, uschar *maildirfolder_create_regex)
{
int i;
struct stat statbuf;
@@ -52,7 +55,7 @@
/* First ensure that the path we have is a directory; if it does not exist,
create it. Then make sure the tmp, new & cur subdirs of the maildir are
-there. If not, fail which aborts the delivery (even though the cur subdir is
+there. If not, fail. This aborts the delivery (even though the cur subdir is
not actually needed for delivery). Handle all 4 directory tests/creates in a
loop so that code can be shared. */
@@ -135,7 +138,55 @@
}
}
-return TRUE; /* All directories exist */
+/* If the basic path matches maildirfolder_create_regex, we are dealing with
+a subfolder, and should ensure that a maildirfolder file exists. */
+
+if (maildirfolder_create_regex != NULL)
+ {
+ const uschar *error;
+ int offset;
+ const pcre *regex;
+
+ DEBUG(D_transport) debug_printf("checking for maildirfolder requirement\n");
+
+ regex = pcre_compile(CS maildirfolder_create_regex, PCRE_COPT,
+ (const char **)&error, &offset, NULL);
+
+ if (regex == NULL)
+ {
+ addr->message = string_sprintf("appendfile: regular expression "
+ "error: %s at offset %d while compiling %s", error, offset,
+ maildirfolder_create_regex);
+ return FALSE;
+ }
+
+ if (pcre_exec(regex, NULL, CS path, Ustrlen(path), 0, 0, NULL, 0) >= 0)
+ {
+ uschar *fname = string_sprintf("%s/maildirfolder", path);
+ if (Ustat(fname, &statbuf) == 0)
+ {
+ DEBUG(D_transport) debug_printf("maildirfolder already exists\n");
+ }
+ else
+ {
+ int fd = Uopen(fname, O_WRONLY|O_APPEND|O_CREAT, 0);
+ if (fd < 0)
+ {
+ addr->message = string_sprintf("appendfile: failed to create "
+ "maildirfolder file in %s directory: %s", path, strerror(errno));
+ return FALSE;
+ }
+ (void)close(fd);
+ DEBUG(D_transport) debug_printf("created maildirfolder file\n");
+ }
+ }
+ else
+ {
+ DEBUG(D_transport) debug_printf("maildirfolder file not required\n");
+ }
+ }
+
+return TRUE; /* Everything exists that should exist */
}
Index: tf_maildir.h
===================================================================
RCS file: /home/cvs/exim/exim-src/src/transports/tf_maildir.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- tf_maildir.h 7 Feb 2006 11:19:03 -0000 1.4
+++ tf_maildir.h 27 Apr 2006 08:53:24 -0000 1.5
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/transports/tf_maildir.h,v 1.4 2006/02/07 11:19:03 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/transports/tf_maildir.h,v 1.5 2006/04/27 08:53:24 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -12,7 +12,8 @@
extern off_t maildir_compute_size(uschar *, int *, time_t *, const pcre *,
const pcre *, BOOL);
-extern BOOL maildir_ensure_directories(uschar *, address_item *, BOOL, int);
+extern BOOL maildir_ensure_directories(uschar *, address_item *, BOOL, int,
+ uschar *);
extern int maildir_ensure_sizefile(uschar *,
appendfile_transport_options_block *, const pcre *,
const pcre *, off_t *, int *);
Index: 5009
===================================================================
RCS file: /home/cvs/exim/exim-test/confs/5009,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- 5009 25 Apr 2006 14:02:30 -0000 1.1
+++ 5009 27 Apr 2006 08:53:24 -0000 1.2
@@ -36,6 +36,7 @@
maildir_format
maildir_use_size_file
maildir_quota_directory_regex = ^(?:cur|new|\.(?!Trash).*)$
+ maildirfolder_create_regex = /\.[^/]+$
quota = 1M
Index: 5009
===================================================================
RCS file: /home/cvs/exim/exim-test/scripts/5000-maildir/5009,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- 5009 25 Apr 2006 14:02:30 -0000 1.1
+++ 5009 27 Apr 2006 08:53:25 -0000 1.2
@@ -4,14 +4,14 @@
Test message
****
cat DIR/test-mail/maildirsize >>test-stdout
-mkdir test-mail/.Sub
-touch test-mail/.Sub/maildirfolder
+#mkdir test-mail/.Sub
+#touch test-mail/.Sub/maildirfolder
exim -DSUB=.Sub -odi userx@???
Test message
****
cat DIR/test-mail/maildirsize >>test-stdout
-mkdir test-mail/.Trash
-touch test-mail/.Trash/maildirfolder
+#mkdir test-mail/.Trash
+#touch test-mail/.Trash/maildirfolder
exim -DSUB=.Trash -odi userx@???
Test message
****