implemented /no_check for quota = and quota_file_count = transport options
authorHeiko Schlittermann (I24) <hs@schlittermann.de>
Fri, 01 Apr 2011 16:08:28 +0200
changeset 18 cacfba0189d0
parent 17 b0076c5c7eec
child 19 e86d83f17b1c
implemented /no_check for quota = and quota_file_count = transport options
build.Makefile
dbg.maildirsize
doc.maildir_tag
series
src.bail-out-on-BOM
src.fixed_ensure_maildirsize
src.lock_maildirsize
src.maildir_use_size_file
src.quota-ignore
--- a/build.Makefile	Tue Mar 08 11:11:21 2011 +0100
+++ b/build.Makefile	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent 5c737d4329e1327fbc2aa16a5227d5ae5bc7ee03
+# Parent 000bec5641ad0bb85fec4120a5a609ea15b6fdd6
 
-diff -r 5c737d4329e1 Makefile
---- a/Makefile	Fri Feb 18 18:22:42 2011 +0100
-+++ b/Makefile	Fri Feb 18 21:40:42 2011 +0100
+diff -r 000bec5641ad Makefile
+--- a/Makefile	Fri Apr 01 14:06:49 2011 +0200
++++ b/Makefile	Fri Apr 01 14:06:50 2011 +0200
 @@ -68,7 +68,8 @@
  # The installation commands are kept in a separate script, which expects
  # to be run from inside the build directory.
@@ -14,9 +14,9 @@
  		build=$(build) $(SHELL) ../scripts/exim_install $(INSTALL_ARG)
  
  # Tidy-up targets
-diff -r 5c737d4329e1 OS/Makefile-Base
---- a/OS/Makefile-Base	Fri Feb 18 18:22:42 2011 +0100
-+++ b/OS/Makefile-Base	Fri Feb 18 21:40:42 2011 +0100
+diff -r 000bec5641ad OS/Makefile-Base
+--- a/OS/Makefile-Base	Fri Apr 01 14:06:49 2011 +0200
++++ b/OS/Makefile-Base	Fri Apr 01 14:06:50 2011 +0200
 @@ -640,43 +640,43 @@
  # The lookups library.
  
--- a/dbg.maildirsize	Tue Mar 08 11:11:21 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-# HG changeset patch
-# Parent 74c82038542f0fe3e9d80b15ecffc5e2598ef52a
-
-diff -r 74c82038542f src/exim.c
---- a/src/exim.c	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/exim.c	Sat Feb 19 13:38:06 2011 +0100
-@@ -2206,7 +2206,9 @@
-     else
-       {
-       unsigned int selector = D_default;
-+      unsigned int extra_selector = 0;
-       debug_selector = 0;
-+      debug_extra_selector = 0;
-       debug_file = NULL;
-       if (*argrest == 'd')
-         {
-@@ -2214,9 +2216,10 @@
-         argrest++;
-         }
-       if (*argrest != 0)
--        decode_bits(&selector, NULL, D_memory, 0, argrest, debug_options,
-+        decode_bits(&selector, &extra_selector, D_memory, 0, argrest, debug_options,
-           debug_options_count, US"debug", 0);
-       debug_selector = selector;
-+      debug_extra_selector = extra_selector;
-       }
-     break;
- 
-@@ -3184,7 +3187,7 @@
- child processes. It should, of course, be 2 for stderr. Also, force the daemon
- to run in the foreground. */
- 
--if (debug_selector != 0)
-+if (debug_selector|debug_extra_selector != 0)
-   {
-   debug_file = stderr;
-   debug_fd = fileno(debug_file);
-diff -r 74c82038542f src/globals.c
---- a/src/globals.c	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/globals.c	Sat Feb 19 13:38:06 2011 +0100
-@@ -449,6 +449,7 @@
-   { US"load",           D_load },
-   { US"local_scan",     D_local_scan },
-   { US"lookup",         D_lookup },
-+  { US"maildirsize",	DX_maildirsize },
-   { US"memory",         D_memory },
-   { US"pid",            D_pid },
-   { US"process_info",   D_process_info },
-@@ -466,6 +467,7 @@
- };
- int     debug_options_count    = sizeof(debug_options)/sizeof(bit_table);
- unsigned int debug_selector    = 0;
-+unsigned int debug_extra_selector = 0;
- int     delay_warning[DELAY_WARNING_SIZE] = { DELAY_WARNING_SIZE, 1, 24*60*60 };
- uschar *delay_warning_condition=
-   US"${if or {"
-diff -r 74c82038542f src/local_scan.h
---- a/src/local_scan.h	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/local_scan.h	Sat Feb 19 13:38:06 2011 +0100
-@@ -139,6 +139,7 @@
- /* Global variables that are documented as visible in the function. */
- 
- extern unsigned int debug_selector;    /* Debugging bits */
-+extern unsigned int debug_extra_selector;    /* Debugging bits */
- 
- extern int     body_linecount;         /* Line count in body */
- extern int     body_zerocount;         /* Binary zero count in body */
-diff -r 74c82038542f src/log.c
---- a/src/log.c	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/log.c	Sat Feb 19 13:38:06 2011 +0100
-@@ -1303,7 +1303,7 @@
- debug_selector = D_default;
- if (opts)
-   {
--  decode_bits(&debug_selector, NULL, D_memory, 0, opts,
-+  decode_bits(&debug_selector, &debug_extra_selector, D_memory, 0, opts,
-       debug_options, debug_options_count, US"debug", DEBUG_FROM_CONFIG);
-   }
- 
-diff -r 74c82038542f src/macros.h
---- a/src/macros.h	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/macros.h	Sat Feb 19 13:38:06 2011 +0100
-@@ -100,7 +100,9 @@
- 
- /* Debugging control */
- 
--#define DEBUG(x)      if ((debug_selector & (x)) != 0)
-+//#define DEBUG(x)      if (((debug_selector & (x)) || (debug_extra_selector & (x))) != 0)
-+#define DEBUG(x)      if(x & 0x80000000 ? (debug_extra_selector & ((x) & 0x0fffffff)) : 
-+
- #define HDEBUG(x)     if (host_checking || (debug_selector & (x)) != 0)
- 
- /* The default From: text for DSNs */
-@@ -327,6 +329,8 @@
- #define D_uid                        0x20000000
- #define D_verify                     0x40000000
- 
-+#define DX_maildirsize               0x80000001
-+
- /* The D_all value must always have all bits set, as it is recognized specially
- by the function that decodes debug and log selectors. This is to enable it to
- set all the bits in a multi-word selector. Debug doesn't use this yet, but we
-diff -r 74c82038542f src/transports/tf_maildir.c
---- a/src/transports/tf_maildir.c	Sat Feb 19 13:30:33 2011 +0100
-+++ b/src/transports/tf_maildir.c	Sat Feb 19 13:38:06 2011 +0100
-@@ -215,7 +215,7 @@
- len = Ustrlen(buffer);
- (void)lseek(fd, 0, SEEK_END);
- (void)write(fd, buffer, len);
--DEBUG(D_transport)
-+DEBUG(D_transport|DX_maildirsize)
-   debug_printf("added '%.*s' to maildirsize file\n", len-1, buffer);
- }
- 
-@@ -292,7 +292,7 @@
- 
-   if (Ustat(buffer, &statbuf) < 0)
-     {
--    DEBUG(D_transport)
-+    DEBUG(D_transport|DX_maildirsize)
-       debug_printf("maildir_compute_size: stat error %d for %s: %s\n", errno,
-         buffer, strerror(errno));
-     continue;
-@@ -300,7 +300,7 @@
- 
-   if ((statbuf.st_mode & S_IFMT) != S_IFDIR)
-     {
--    DEBUG(D_transport)
-+    DEBUG(D_transport|DX_maildirsize)
-       debug_printf("skipping %s/%s: not a directory\n", path, name);
-     continue;
-     }
-@@ -327,7 +327,7 @@
-   }
- 
- closedir(dir);
--DEBUG(D_transport)
-+DEBUG(D_transport|DX_maildirsize)
-   {
-   if (timestamp_only)
-     debug_printf("maildir_compute_size (timestamp_only): %ld\n",
-@@ -391,7 +391,7 @@
- 
- filename = string_sprintf("%s/maildirsize", path);
- 
--DEBUG(D_transport) debug_printf("looking for maildirsize in %s\n", path);
-+DEBUG(D_transport|DX_maildirsize) debug_printf("looking for maildirsize in %s\n", path);
- fd = Uopen(filename, O_CREAT|O_RDWR|O_APPEND, ob->mode ? ob->mode : 0600);
- if (fd < 0) return -1;
- 
-@@ -420,7 +420,7 @@
- count = read(fd, buffer, sizeof(buffer));
- if (count >= sizeof(buffer))
-   {
--  DEBUG(D_transport)
-+  DEBUG(D_transport|DX_maildirsize)
-     debug_printf("maildirsize file too big (%d): recalculating\n", count);
-   goto RECALCULATE;
-   }
-@@ -428,7 +428,7 @@
- 
- /* Read the quota parameters from the first line of the data. */
- 
--DEBUG(D_transport)
-+DEBUG(D_transport|DX_maildirsize)
-   debug_printf("reading quota parameters from maildirsize data\n");
- 
- for (;;)
-@@ -443,7 +443,7 @@
-     else if (*endptr == 'C') cached_quota_filecount = (int)n;
-   if (!isalpha(*endptr++))
-     {
--    DEBUG(D_transport)
-+    DEBUG(D_transport|DX_maildirsize)
-       debug_printf("quota parameter number not followed by letter in "
-         "\"%.*s\": recalculating maildirsize\n", (int)(endptr - buffer),
-         buffer);
-@@ -452,7 +452,7 @@
-   if (*endptr == '\n' || *endptr == 0) break;
-   if (*endptr++ != ',')
-     {
--    DEBUG(D_transport)
-+    DEBUG(D_transport|DX_maildirsize)
-       debug_printf("quota parameter not followed by comma in "
-         "\"%.*s\": recalculating maildirsize\n", (int)(endptr - buffer),
-         buffer);
-@@ -466,7 +466,7 @@
- if (cached_quota != ob->quota_value ||
-     cached_quota_filecount != ob->quota_filecount_value)
-   {
--  DEBUG(D_transport)
-+  DEBUG(D_transport|DX_maildirsize)
-     debug_printf("cached quota is out of date: recalculating\n"
-       "  quota=" OFF_T_FMT " cached_quota=" OFF_T_FMT " filecount_quota=%d "
-       "cached_quota_filecount=%d\n", ob->quota_value,
-@@ -477,7 +477,7 @@
- /* Quota values agree; parse the rest of the data to get the sizes. At this
- stage, *endptr points either to 0 or to '\n'.  */
- 
--DEBUG(D_transport)
-+DEBUG(D_transport|DX_maildirsize)
-   debug_printf("computing maildir size from maildirsize data\n");
- 
- while (*endptr++ == '\n')
-@@ -502,7 +502,7 @@
-   {
-   if (size < 0 || filecount < 0)
-     {
--    DEBUG(D_transport) debug_printf("negative value in maildirsize "
-+    DEBUG(D_transport|DX_maildirsize) debug_printf("negative value in maildirsize "
-       "(size=" OFF_T_FMT " count=%d): recalculating\n", size, filecount);
-     goto RECALCULATE;
-     }
-@@ -517,7 +517,7 @@
-     struct stat statbuf;
-     if (linecount > 1)
-       {
--      DEBUG(D_transport) debug_printf("over quota and maildirsize has "
-+      DEBUG(D_transport|DX_maildirsize) debug_printf("over quota and maildirsize has "
-         "more than 1 entry: recalculating\n");
-       goto RECALCULATE;
-       }
-@@ -526,7 +526,7 @@
- 
-     if (time(NULL) - statbuf.st_mtime > 15*60)
-       {
--      DEBUG(D_transport) debug_printf("over quota and maildirsize is older "
-+      DEBUG(D_transport|DX_maildirsize) debug_printf("over quota and maildirsize is older "
-         "than 15 minutes: recalculating\n");
-       goto RECALCULATE;
-       }
-@@ -543,7 +543,7 @@
-   uschar *tempname;
-   struct timeval tv;
- 
--  DEBUG(D_transport)
-+  DEBUG(D_transport|DX_maildirsize)
-     {
-     uschar *p = endptr;
-     while (p > buffer && p[-1] != '\n') p--;
-@@ -587,12 +587,12 @@
-   /* If any of the directories have been modified since the last timestamp we
-   saw, we have to junk this maildirsize file. */
- 
--  DEBUG(D_transport) debug_printf("checking subdirectory timestamps\n");
-+  DEBUG(D_transport|DX_maildirsize) debug_printf("checking subdirectory timestamps\n");
-   new_latest = 0;
-   (void)maildir_compute_size(path, NULL, &new_latest , NULL, dir_regex, TRUE);
-   if (new_latest > old_latest)
-     {
--    DEBUG(D_transport) debug_printf("abandoning maildirsize because of "
-+    DEBUG(D_transport|DX_maildirsize) debug_printf("abandoning maildirsize because of "
-       "a later subdirectory modification\n");
-     (void)Uunlink(filename);
-     (void)close(fd);
-@@ -604,7 +604,7 @@
- lock.l_type = F_UNLCK;
- if (fd > 0) fcntl(fd, F_SETLKW, &lock);
- 
--DEBUG(D_transport) debug_printf("returning maildir size=" OFF_T_FMT
-+DEBUG(D_transport|DX_maildirsize) debug_printf("returning maildir size=" OFF_T_FMT
-   " filecount=%d\n", size, filecount);
- *returned_size = size;
- *returned_filecount = filecount;
--- a/doc.maildir_tag	Tue Mar 08 11:11:21 2011 +0100
+++ b/doc.maildir_tag	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent 4acd755ecda3351741f615164fd0e3c972d9578f
+# Parent 2d381cd1efafa5ef9eeafb57be6b6b170ba3dd78
 
-diff --git a/doc/spec.txt b/doc/spec.txt
---- a/doc/spec.txt
-+++ b/doc/spec.txt
+diff -r 2d381cd1efaf doc/spec.txt
+--- a/doc/spec.txt	Fri Apr 01 12:04:37 2011 +0200
++++ b/doc/spec.txt	Fri Apr 01 14:06:49 2011 +0200
 @@ -18409,6 +18409,8 @@
  file name (even though maildir_tag puts it there) because maildir MUAs
  sometimes add other information onto the ends of message file names.
--- a/series	Tue Mar 08 11:11:21 2011 +0100
+++ b/series	Fri Apr 01 16:08:28 2011 +0200
@@ -4,5 +4,4 @@
 src.maildir_use_size_file #+4.74
 src.fixed_ensure_maildirsize #+4.74
 src.lock_maildirsize #+4.74
-dbg.maildirsize #+test
 src.quota-ignore #+test
--- a/src.bail-out-on-BOM	Tue Mar 08 11:11:21 2011 +0100
+++ b/src.bail-out-on-BOM	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent fbf873801b0238076818528063f142b791a9b0cb
+# Parent 7913ffa1e4db075588a06853221ab36e9d186006
 
-diff -r fbf873801b02 src/readconf.c
---- a/src/readconf.c	Sun Feb 13 12:15:23 2011 +0100
-+++ b/src/readconf.c	Sun Feb 13 14:05:44 2011 +0100
+diff -r 7913ffa1e4db src/readconf.c
+--- a/src/readconf.c	Fri Apr 01 14:06:50 2011 +0200
++++ b/src/readconf.c	Fri Apr 01 14:06:50 2011 +0200
 @@ -2906,6 +2906,11 @@
  
  while ((s = get_config_line()) != NULL)
--- a/src.fixed_ensure_maildirsize	Tue Mar 08 11:11:21 2011 +0100
+++ b/src.fixed_ensure_maildirsize	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent e46329bd93b89ef7f880988f37d6ad1b7fbe11c3
+# Parent ecfe290806fda71edb54f4280f4e831e8c2cec7a
 
-diff -r e46329bd93b8 src/transports/tf_maildir.c
---- a/src/transports/tf_maildir.c	Thu Feb 24 17:19:04 2011 +0100
-+++ b/src/transports/tf_maildir.c	Thu Feb 24 20:12:03 2011 +0100
+diff -r ecfe290806fd src/transports/tf_maildir.c
+--- a/src/transports/tf_maildir.c	Fri Apr 01 14:06:51 2011 +0200
++++ b/src/transports/tf_maildir.c	Fri Apr 01 14:06:51 2011 +0200
 @@ -584,7 +584,7 @@
        "a later subdirectory modification\n");
      (void)Uunlink(filename);
--- a/src.lock_maildirsize	Tue Mar 08 11:11:21 2011 +0100
+++ b/src.lock_maildirsize	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent 64ab3b6277037986519edb924069a75ba339de2a
+# Parent 3cbad740cf65b90cb75768c7784ac22a8ee7622d
 
-diff -r 64ab3b627703 src/transports/appendfile.c
---- a/src/transports/appendfile.c	Thu Feb 24 20:29:56 2011 +0100
-+++ b/src/transports/appendfile.c	Sun Feb 27 21:51:22 2011 +0100
+diff -r 3cbad740cf65 src/transports/appendfile.c
+--- a/src/transports/appendfile.c	Fri Apr 01 14:06:51 2011 +0200
++++ b/src/transports/appendfile.c	Fri Apr 01 14:06:51 2011 +0200
 @@ -13,6 +13,7 @@
  
  #ifdef SUPPORT_MAILDIR
@@ -127,9 +127,9 @@
  
  #ifdef SUPPORT_MBX
  if (mbx_lockfd >= 0)
-diff -r 64ab3b627703 src/transports/appendfile.h
---- a/src/transports/appendfile.h	Thu Feb 24 20:29:56 2011 +0100
-+++ b/src/transports/appendfile.h	Sun Feb 27 21:51:22 2011 +0100
+diff -r 3cbad740cf65 src/transports/appendfile.h
+--- a/src/transports/appendfile.h	Fri Apr 01 14:06:51 2011 +0200
++++ b/src/transports/appendfile.h	Fri Apr 01 14:06:51 2011 +0200
 @@ -95,5 +95,8 @@
  /* Function that is shared with tf_maildir.c */
  
@@ -139,9 +139,9 @@
 +
  
  /* End of transports/appendfile.h */
-diff -r 64ab3b627703 src/transports/tf_maildir.c
---- a/src/transports/tf_maildir.c	Thu Feb 24 20:29:56 2011 +0100
-+++ b/src/transports/tf_maildir.c	Sun Feb 27 21:51:22 2011 +0100
+diff -r 3cbad740cf65 src/transports/tf_maildir.c
+--- a/src/transports/tf_maildir.c	Fri Apr 01 14:06:51 2011 +0200
++++ b/src/transports/tf_maildir.c	Fri Apr 01 14:06:51 2011 +0200
 @@ -367,13 +367,16 @@
  
  Returns:           >=0  a file descriptor for an open maildirsize file
@@ -248,9 +248,9 @@
  DEBUG(D_transport) debug_printf("returning maildir size=" OFF_T_FMT
    " filecount=%d\n", size, filecount);
  *returned_size = size;
-diff -r 64ab3b627703 src/transports/tf_maildir.h
---- a/src/transports/tf_maildir.h	Thu Feb 24 20:29:56 2011 +0100
-+++ b/src/transports/tf_maildir.h	Sun Feb 27 21:51:22 2011 +0100
+diff -r 3cbad740cf65 src/transports/tf_maildir.h
+--- a/src/transports/tf_maildir.h	Fri Apr 01 14:06:51 2011 +0200
++++ b/src/transports/tf_maildir.h	Fri Apr 01 14:06:51 2011 +0200
 @@ -16,7 +16,7 @@
                  uschar *);
  extern int    maildir_ensure_sizefile(uschar *,
--- a/src.maildir_use_size_file	Tue Mar 08 11:11:21 2011 +0100
+++ b/src.maildir_use_size_file	Fri Apr 01 16:08:28 2011 +0200
@@ -1,9 +1,9 @@
 # HG changeset patch
-# Parent 3feef89a1d78d3e67eef48fb1c3bd9949e919166
+# Parent 552ee33e550b77bb1567594e9e816087a79f0c7e
 
-diff -r 3feef89a1d78 doc/spec.txt
---- a/doc/spec.txt	Sat Feb 12 14:34:41 2011 +0100
-+++ b/doc/spec.txt	Sat Feb 12 14:44:47 2011 +0100
+diff -r 552ee33e550b doc/spec.txt
+--- a/doc/spec.txt	Fri Apr 01 14:06:50 2011 +0200
++++ b/doc/spec.txt	Fri Apr 01 14:06:51 2011 +0200
 @@ -18179,11 +18179,12 @@
  This option applies only to deliveries in maildir format, and is described in
  section 26.5 below.
@@ -22,9 +22,9 @@
  maildirsize file in a maildir if one does not exist, taking the quota from the
  quota option of the transport. If quota is unset, the value is zero. See
  maildir_quota_directory_regex above and section 26.5 below for further details.
-diff -r 3feef89a1d78 src/transports/appendfile.c
---- a/src/transports/appendfile.c	Sat Feb 12 14:34:41 2011 +0100
-+++ b/src/transports/appendfile.c	Sat Feb 12 14:44:47 2011 +0100
+diff -r 552ee33e550b src/transports/appendfile.c
+--- a/src/transports/appendfile.c	Fri Apr 01 14:06:50 2011 +0200
++++ b/src/transports/appendfile.c	Fri Apr 01 14:06:51 2011 +0200
 @@ -38,6 +38,10 @@
  opt_public flag. */
  
@@ -64,9 +64,9 @@
  /* Loop for quota, quota_filecount, quota_warn_threshold, mailbox_size,
  mailbox_filecount */
  
-diff -r 3feef89a1d78 src/transports/appendfile.h
---- a/src/transports/appendfile.h	Sat Feb 12 14:34:41 2011 +0100
-+++ b/src/transports/appendfile.h	Sat Feb 12 14:44:47 2011 +0100
+diff -r 552ee33e550b src/transports/appendfile.h
+--- a/src/transports/appendfile.h	Fri Apr 01 14:06:50 2011 +0200
++++ b/src/transports/appendfile.h	Fri Apr 01 14:06:51 2011 +0200
 @@ -23,6 +23,7 @@
    uschar *quota_warn_threshold;
    uschar *mailbox_size_string;
--- a/src.quota-ignore	Tue Mar 08 11:11:21 2011 +0100
+++ b/src.quota-ignore	Fri Apr 01 16:08:28 2011 +0200
@@ -1,19 +1,33 @@
 # HG changeset patch
-# Parent 717fd3d2296015e18687e4b3ecb259f7ded5e15f
+# Parent 525ee4a1a637802b655f286de8cd9c737025ed37
 
-diff -r 717fd3d22960 src/transports/appendfile.c
---- a/src/transports/appendfile.c	Sun Feb 13 14:05:44 2011 +0100
-+++ b/src/transports/appendfile.c	Tue Feb 15 11:18:53 2011 +0100
-@@ -31,6 +31,8 @@
- #define THRESHOLD_CHECK  (ob->quota_warn_threshold_value > 0 && \
-   (!ob->quota_warn_threshold_is_percent || ob->quota_value > 0))
+diff -r 525ee4a1a637 doc/spec.txt
+--- a/doc/spec.txt	Fri Apr 01 14:06:59 2011 +0200
++++ b/doc/spec.txt	Fri Apr 01 16:08:04 2011 +0200
+@@ -18340,6 +18340,9 @@
+ large file support (Linux and FreeBSD have this), mailboxes larger than 2G can
+ be handled.
+ 
++If there is "/no_check" appended, then all processing is done as usual, but the
++over quota condition is not checked.
++
+ Note: A value of zero is interpreted as "no quota".
  
-+#define QUOTA_CHECK      (ob->quota_value > 0 && !ob->quota_no_check)
-+
+ The expansion happens while Exim is running as root, before it changes uid for
+@@ -18378,6 +18381,9 @@
+ failure causes delivery to be deferred. A value of zero is interpreted as "no
+ quota".
  
- /* Options specific to the appendfile transport. They must be in alphabetic
- order (note that "_" comes before the lower case letters). Some of them are
-@@ -236,7 +238,9 @@
++if there is "/no_check" appended, then all processing is done as usual, but
++the over quota condition is not checked.
++
+ +--------------------------------------------------------------+
+ |quota_is_inclusive|Use: appendfile|Type: boolean|Default: true|
+ +--------------------------------------------------------------+
+diff -r 525ee4a1a637 src/transports/appendfile.c
+--- a/src/transports/appendfile.c	Fri Apr 01 14:06:59 2011 +0200
++++ b/src/transports/appendfile.c	Fri Apr 01 16:08:04 2011 +0200
+@@ -237,7 +237,9 @@
    FALSE,          /* mailstore_format */
    FALSE,          /* mbx_format */
    FALSE,          /* quota_warn_threshold_is_percent */
@@ -23,16 +37,16 @@
 +  FALSE           /* quota_filecount_no_check */
  };
  
+ void hs12_lock(int fd, int type, const char* msg)
+@@ -312,6 +314,7 @@
+ for (i = 0; i < 5; i++)
+   {
+   double d;
++  int no_check = 0;
+   uschar *which = NULL;
  
-@@ -270,6 +274,7 @@
-   (appendfile_transport_options_block *)(tblock->options_block);
- uschar *q = ob->quota;
- double default_value = 0.0;
-+int no_check = 0;
- int i;
- 
- addrlist = addrlist;    /* Keep picky compilers happy */
-@@ -323,6 +328,15 @@
+   if (q == NULL) d = default_value; else
+@@ -348,12 +351,21 @@
        rest++;
        }
  
@@ -42,13 +56,20 @@
 +    if (i < 2 && Ustrstr(rest, "/no_check") == rest)
 +      {
 +	 no_check = 1;
-+	 rest += strlen("/no_check");
++	 rest += sizeof("/no_check") - 1;
 +      }
 +
      while (isspace(*rest)) rest++;
  
      if (*rest != 0)
-@@ -340,12 +354,14 @@
+       {
+       *errmsg = string_sprintf("Malformed value \"%s\" (expansion of \"%s\") "
+-        "in %s transport", s, q, tblock->name);
++        "in %s transport [%s]", s, q, tblock->name);
+       return FAIL;
+       }
+     }
+@@ -365,12 +377,14 @@
      case 0:
      if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4) which = US"quota";
      ob->quota_value = (off_t)d;
@@ -63,7 +84,7 @@
      q = ob->quota_warn_threshold;
      break;
  
-@@ -1382,10 +1398,12 @@
+@@ -1406,10 +1420,12 @@
  DEBUG(D_transport)
    {
    debug_printf("appendfile: mode=%o notify_comsat=%d quota=" OFF_T_FMT
@@ -72,22 +93,41 @@
      "  %s=%s format=%s\n  message_prefix=%s\n  message_suffix=%s\n  "
      "maildir_use_size_file=%s\n",
      mode, ob->notify_comsat, ob->quota_value,
-+    ob->quota_no_check? " (no_check)" : ""
++    ob->quota_no_check? " (no_check)" : "",
      ob->quota_warn_threshold_value,
      ob->quota_warn_threshold_is_percent? "%" : "",
      isdirectory? "directory" : "file",
-@@ -2274,7 +2292,7 @@
-   create the file. When maildir support is not compiled,
-   ob->maildir_use_size_file is always FALSE. */
- 
--  if (ob->quota_value > 0 || THRESHOLD_CHECK || ob->maildir_use_size_file)
-+  if (QUOTA_CHECK || THRESHOLD_CHECK || ob->maildir_use_size_file)
+@@ -2771,15 +2787,23 @@
+     debug_printf("  file count quota = %d count = %d\n",
+       ob->quota_filecount_value, mailbox_filecount);
+     }
+-  if (mailbox_size + (ob->quota_is_inclusive? message_size:0) > ob->quota_value)
++  DEBUG(D_transport) {
++	if (ob->quota_no_check) 
++		debug_printf("not checking quota (/no_check seen)\n");
++	if (ob->quota_filecount_no_check) 
++		debug_printf("not checking quota filecount (/no_check seen)\n");
++  }
++  if (!ob->quota_no_check 
++      && mailbox_size + (ob->quota_is_inclusive? message_size:0) > ob->quota_value)
      {
-     const uschar *error;
-     int offset;
-diff -r 717fd3d22960 src/transports/appendfile.h
---- a/src/transports/appendfile.h	Sun Feb 13 14:05:44 2011 +0100
-+++ b/src/transports/appendfile.h	Tue Feb 15 11:18:53 2011 +0100
+     DEBUG(D_transport) debug_printf("mailbox quota exceeded\n");
+     yield = DEFER;
+     errno = ERRNO_EXIMQUOTA;
+     }
+-  else if (ob->quota_filecount_value > 0 &&
+-           mailbox_filecount + (ob->quota_is_inclusive ? 1:0) >
+-             ob->quota_filecount_value)
++  else if (!ob->quota_filecount_no_check 
++           && ob->quota_filecount_value > 0
++           && mailbox_filecount + (ob->quota_is_inclusive ? 1:0) >
++              ob->quota_filecount_value)
+     {
+     DEBUG(D_transport) debug_printf("mailbox file count quota exceeded\n");
+     yield = DEFER;
+diff -r 525ee4a1a637 src/transports/appendfile.h
+--- a/src/transports/appendfile.h	Fri Apr 01 14:06:59 2011 +0200
++++ b/src/transports/appendfile.h	Fri Apr 01 16:08:04 2011 +0200
 @@ -72,6 +72,8 @@
    BOOL  mbx_format;
    BOOL  quota_warn_threshold_is_percent;