Support "G" multiplier on integer configuration values
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 1 Sep 2016 18:20:11 +0000 (19:20 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 1 Sep 2016 20:19:40 +0000 (21:19 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/readconf.c
test/confs/0001
test/confs/0180

index 3ab63e5..dc2b6ac 100644 (file)
@@ -5136,7 +5136,11 @@ with the characters &"0x"&, in which case the remainder is interpreted as a
 hexadecimal number.
 
 If an integer value is followed by the letter K, it is multiplied by 1024; if
-it is followed by the letter M, it is multiplied by 1024x1024. When the values
+it is followed by the letter M, it is multiplied by 1024x1024;
+.new
+if by the letter G, 1024x1024x1024.
+.wen
+When the values
 of integer option settings are output, values which are an exact multiple of
 1024 or 1024x1024 are sometimes, but not always, printed using the letters K
 and M. The printing style is independent of the actual input format that was
index b9ed8a0..20af1a2 100644 (file)
@@ -41,6 +41,8 @@ Version 4.88
     and go on with some roughly recognisable name.  Use the "-bP macros"
     command-line option to see what is present.
 
+11. Integer values for options can take a "G" multiplier.
+
 
 Version 4.87
 ------------
index 6469324..fb9d47a 100644 (file)
@@ -1985,7 +1985,7 @@ switch (type)
   inttype = US"octal ";
 
   /*  Integer: a simple(ish) case; allow octal and hex formats, and
-  suffixes K and M. The different types affect output, not input. */
+  suffixes K, M and G. The different types affect output, not input. */
 
   case opt_mkint:
   case opt_int:
@@ -2001,7 +2001,6 @@ switch (type)
         inttype, name);
 
     if (errno != ERANGE)
-      {
       if (tolower(*endptr) == 'k')
         {
         if (lvalue > INT_MAX/1024 || lvalue < INT_MIN/1024) errno = ERANGE;
@@ -2015,7 +2014,13 @@ switch (type)
         else lvalue *= 1024*1024;
         endptr++;
         }
-      }
+      else if (tolower(*endptr) == 'g')
+        {
+        if (lvalue > INT_MAX/(1024*1024*1024) || lvalue < INT_MIN/(1024*1024*1024))
+          errno = ERANGE;
+        else lvalue *= 1024*1024*1024;
+        endptr++;
+        }
 
     if (errno == ERANGE || lvalue > INT_MAX || lvalue < INT_MIN)
       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
@@ -2034,8 +2039,8 @@ switch (type)
     *((int *)((uschar *)data_block + (long int)(ol->value))) = value;
   break;
 
-  /*  Integer held in K: again, allow octal and hex formats, and suffixes K and
-  M. */
+  /*  Integer held in K: again, allow octal and hex formats, and suffixes K, M
+  and G. */
   /*XXX consider moving to int_eximarith_t (but mind the overflow test 0415) */
 
   case opt_Kint:
@@ -2049,22 +2054,26 @@ switch (type)
         inttype, name);
 
     if (errno != ERANGE)
-      {
-      if (tolower(*endptr) == 'm')
+      if (tolower(*endptr) == 'g')
         {
-        if (value > INT_MAX/1024 || value < INT_MIN/1024) errno = ERANGE;
-          else value *= 1024;
+        if (value > INT_MAX/(1024*1024) || value < INT_MIN/(1024*1024))
+         errno = ERANGE;
+       else
+         value *= 1024*1024;
         endptr++;
         }
-      else if (tolower(*endptr) == 'k')
+      else if (tolower(*endptr) == 'm')
         {
+        if (value > INT_MAX/1024 || value < INT_MIN/1024)
+         errno = ERANGE;
+       else
+         value *= 1024;
         endptr++;
         }
+      else if (tolower(*endptr) == 'k')
+        endptr++;
       else
-        {
         value = (value + 512)/1024;
-        }
-      }
 
     if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
       "absolute value of integer \"%s\" is too large (overflow)", s);
index 0fd7efe..8d55b29 100644 (file)
@@ -530,7 +530,7 @@ appendfile:
   lockfile_timeout = 30m
   mailbox_size = 1000
   mailbox_filecount = 9999
-  message_size_limit = 1M
+  message_size_limit = 1G
   mode = 0600
   mode_fail_narrower
   no_notify_comsat
index b61722c..c4a0bd5 100644 (file)
@@ -1,7 +1,7 @@
 # Exim test configuration 0180
 
 # Require immense amount of disk space, expecting to fail.  Can unfortunately work on big filesystems.
-CSS=check_spool_space=400000000K
+CSS=check_spool_space=400G
 
 .include DIR/aux-var/std_conf_prefix