diff options
author | Philip Hazel <ph10@hermes.cam.ac.uk> | 2006-04-27 08:53:24 +0000 |
---|---|---|
committer | Philip Hazel <ph10@hermes.cam.ac.uk> | 2006-04-27 08:53:24 +0000 |
commit | d6629cdc9b1eb95d4c7b2f6c55a102bd0df38d31 (patch) | |
tree | 5678e310253ff3d11f9746204f401213a0bad07f /src | |
parent | 01c490dfefc3562022ab7c695bb45c99fd898104 (diff) |
Add maildirfolder_create_regex to appendfile.
Diffstat (limited to 'src')
-rw-r--r-- | src/src/transports/appendfile.c | 12 | ||||
-rw-r--r-- | src/src/transports/appendfile.h | 3 | ||||
-rw-r--r-- | src/src/transports/tf_maildir.c | 61 | ||||
-rw-r--r-- | src/src/transports/tf_maildir.h | 5 |
4 files changed, 70 insertions, 11 deletions
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 *); |