From d6629cdc9b1eb95d4c7b2f6c55a102bd0df38d31 Mon Sep 17 00:00:00 2001 From: Philip Hazel Date: Thu, 27 Apr 2006 08:53:24 +0000 Subject: [PATCH] Add maildirfolder_create_regex to appendfile. --- doc/doc-txt/ChangeLog | 4 ++- doc/doc-txt/NewStuff | 7 +++- doc/doc-txt/OptionLists.txt | 5 +-- src/src/transports/appendfile.c | 12 +++++-- src/src/transports/appendfile.h | 3 +- src/src/transports/tf_maildir.c | 61 ++++++++++++++++++++++++++++++--- src/src/transports/tf_maildir.h | 5 +-- test/confs/5009 | 1 + test/scripts/5000-maildir/5009 | 8 ++--- 9 files changed, 87 insertions(+), 19 deletions(-) diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 242334285..822c93491 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.348 2006/04/25 14:02:29 ph10 Exp $ +$Cambridge: 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 ------------------------------------------- @@ -50,6 +50,8 @@ PH/09 If maildir_quota_directory_regex was set to exclude (say) the .Trash 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 ----------------- diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff index dc03699f3..264501b01 100644 --- a/doc/doc-txt/NewStuff +++ b/doc/doc-txt/NewStuff @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/NewStuff,v 1.101 2006/04/20 14:11:29 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/NewStuff,v 1.102 2006/04/27 08:53:24 ph10 Exp $ New Features in Exim -------------------- @@ -29,6 +29,11 @@ Version 4.62 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 ------------ diff --git a/doc/doc-txt/OptionLists.txt b/doc/doc-txt/OptionLists.txt index d4c27305a..80be8a7b8 100644 --- a/doc/doc-txt/OptionLists.txt +++ b/doc/doc-txt/OptionLists.txt @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.19 2006/02/28 12:42:47 ph10 Exp $ +$Cambridge: 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 @@ This file contains complete lists of four kinds of Exim option: 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_format boolean false appendfile 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 diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c index d7f270544..76acded26 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.17 2006/04/25 14:02:30 ph10 Exp $ */ +/* $Cambridge: 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 @@ optionlist appendfile_transport_options[] = { (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 @@ appendfile_transport_options_block appendfile_transport_option_defaults = { 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 @@ else } #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 @@ else { *slash = 0; check_path = new_check_path; + DEBUG(D_transport) debug_printf("maildirfolder file exists: " + "quota check directory changed to %s\n", check_path); } } } diff --git a/src/src/transports/appendfile.h b/src/src/transports/appendfile.h index 90330d738..63a7c4f02 100644 --- a/src/src/transports/appendfile.h +++ b/src/src/transports/appendfile.h @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/transports/appendfile.h,v 1.4 2006/02/07 11:19:03 ph10 Exp $ */ +/* $Cambridge: 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 @@ typedef struct { uschar *mailbox_filecount_string; uschar *maildir_dir_regex; uschar *maildir_tag; + uschar *maildirfolder_create_regex; uschar *mailstore_prefix; uschar *mailstore_suffix; uschar *check_string; diff --git a/src/src/transports/tf_maildir.c b/src/src/transports/tf_maildir.c index 50a4c1864..2eaea4be0 100644 --- a/src/src/transports/tf_maildir.c +++ b/src/src/transports/tf_maildir.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/transports/tf_maildir.c,v 1.8 2006/02/07 11:19:03 ph10 Exp $ */ +/* $Cambridge: 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 @@ calculations are not hard wired in, but are supplied as a regex. */ *************************************************/ /* 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 @@ DEBUG(D_transport) /* 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 @@ for (i = 0; i < 4; i++) } } -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 */ } diff --git a/src/src/transports/tf_maildir.h b/src/src/transports/tf_maildir.h index 727abf459..e892618b8 100644 --- a/src/src/transports/tf_maildir.h +++ b/src/src/transports/tf_maildir.h @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/transports/tf_maildir.h,v 1.4 2006/02/07 11:19:03 ph10 Exp $ */ +/* $Cambridge: 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 @@ maildirsize files for quota handling in maildir directories. */ 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 *); diff --git a/test/confs/5009 b/test/confs/5009 index a2f673d9e..aa87fecd1 100644 --- a/test/confs/5009 +++ b/test/confs/5009 @@ -36,6 +36,7 @@ t1: maildir_format maildir_use_size_file maildir_quota_directory_regex = ^(?:cur|new|\.(?!Trash).*)$ + maildirfolder_create_regex = /\.[^/]+$ quota = 1M diff --git a/test/scripts/5000-maildir/5009 b/test/scripts/5000-maildir/5009 index 1a2e5fc3a..20d415789 100644 --- a/test/scripts/5000-maildir/5009 +++ b/test/scripts/5000-maildir/5009 @@ -4,14 +4,14 @@ exim -odi userx@test.ex 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.ex 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.ex Test message **** -- 2.25.1