Numeric variable returns
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 6 May 2020 18:55:17 +0000 (19:55 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 6 May 2020 18:55:17 +0000 (19:55 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/match.c
test/confs/0624
test/log/0624
test/scripts/0000-Basic/0624
test/stdout/0002

index 33e07db..c55dff0 100644 (file)
@@ -8545,7 +8545,7 @@ In today's Internet, the use of domain literals is controversial;
 see the &%allow_domain_literals%& main option.
 
 .new
-The value for a match will be the &`@[]`& string.
+The value for a match will be the string &`@[]`&.
 .wen
 
 
@@ -8616,6 +8616,8 @@ list item such as &`*key.ex`& matches &'donkey.ex'& as well as
 
 .new
 The value for a match will be the list element string (starting with the asterisk).
+Additionally, &$0$& will be set to the matched string
+and &$1$& to the variable portion which the asterisk matched.
 .wen
 
 .next
@@ -8637,6 +8639,8 @@ expression by expansion, of course).
 
 .new
 The value for a match will be the list element string (starting with the circumflex).
+Additionally, &$0$& will be set to the string matching the regular expression,
+and &$1$& (onwards) to any submatches identified by parentheses.
 .wen
 
 
index 493244f..cf142af 100644 (file)
@@ -63,6 +63,11 @@ Version 4.94
 
 19. bounce_message_file and warn_message_file are now expanded before use.
 
+20. $domain_data and $localpart_data are now set by all list-match successes.
+    Previously only list items that performed lookups did so.
+    Also, matching list items that are tail-match or RE-match now set the
+    numeric variables $0 (etc) in the same way os other RE matches.
+
 
 
 Version 4.93
index f9b539d..65d4419 100644 (file)
@@ -106,7 +106,7 @@ void *handle;
 
 error = error;  /* Keep clever compilers from complaining */
 
-if (valueptr != NULL) *valueptr = NULL;  /* For non-lookup matches */
+if (valueptr) *valueptr = NULL;
 
 /* For regular expressions, use cb->origsubject rather than cb->subject so that
 it works if the pattern uses (?-i) to turn off case-independence, overriding
@@ -136,7 +136,6 @@ if (pattern[0] == '^')
       : !regex_match_and_setup(re, s, 0, expand_setup)
      )
     return FAIL;
-  /* assume the above wrote $0, $n... TODO: CHECK THAT !! */
   if (valueptr) *valueptr = pattern;   /* "value" gets the RE */
   return OK;
   }
@@ -158,7 +157,7 @@ if (pattern[0] == '*')
     {
     expand_nstring[++expand_setup] = s;                /* write a $n, the matched subject variable-part */
     expand_nlength[expand_setup] = slen - patlen;
-    expand_nmax = expand_setup;
+    expand_nmax = expand_setup;                        /* commit also $0, the matched subject */
     }
   if (valueptr) *valueptr = pattern - 1;       /* "value" gets the (original) pattern */
   return OK;
@@ -185,7 +184,7 @@ if (cb->at_is_special && pattern[0] == '@')
       if (Ustrncmp(ip->address, s+1, slen - 2) == 0
             && ip->address[slen - 2] == 0)
        {
-/* I see no reason not to return $0, the matchd IP.  if (expand_setup >= 0) expand_nmax = expand_setup; */
+       if (expand_setup >= 0) expand_nmax = expand_setup;      /* commit $0, the IP addr */
        if (valueptr) *valueptr = pattern;      /* "value" gets the pattern */
         return OK;
        }
@@ -238,11 +237,11 @@ if (cb->at_is_special && pattern[0] == '@')
       return DEFER;
       }
 
-    if (rc != HOST_FOUND_LOCAL || secy)
-      if (prim || !removed) return FAIL;
+    if ((rc != HOST_FOUND_LOCAL || secy) && (prim || !removed))
+      return FAIL;
 
-/* again, $0 getting the subject, the matched IP.  if (expand_setup >= 0) expand_nmax = expand_setup; */
-    if (valueptr) *valueptr = pattern; /* "vaulue" gets the patterm */
+    if (expand_setup >= 0) expand_nmax = expand_setup; /* commit $0, the matched subject */
+    if (valueptr) *valueptr = pattern; /* "value" gets the patterm */
     return OK;
 
     /*** The above line used to be the following line, but this is incorrect,
@@ -268,10 +267,6 @@ if ((semicolon = Ustrchr(pattern, ';')) == NULL)
   if (expand_setup >= 0) expand_nmax = expand_setup;   /* Original code!   $0 gets the matched subject */
   if (valueptr) *valueptr = pattern;   /* "value" gets the pattern */
   return OK;
-
-/*
-XXX  looks like $0 may be usable
-*/
   }
 
 /* Otherwise we have a lookup item. The lookup type, including partial, etc. is
@@ -355,7 +350,7 @@ match_check_string(const uschar *s, const uschar *pattern, int expand_setup,
 {
 check_string_block cb;
 cb.origsubject = s;
-cb.subject = caseless? string_copylc(s) : string_copy(s);
+cb.subject = caseless ? string_copylc(s) : string_copy(s);
 cb.expand_setup = expand_setup;
 cb.use_partial = use_partial;
 cb.caseless = caseless;
@@ -966,12 +961,17 @@ match_isinlist(const uschar *s, const uschar **listptr, int sep,
 unsigned int *local_cache_bits = cache_bits;
 check_string_block cb;
 cb.origsubject = s;
-cb.subject = caseless? string_copylc(s) : string_copy(s);
-cb.expand_setup = (sep > UCHAR_MAX)? 0 : -1;
+cb.subject = caseless ? string_copylc(s) : string_copy(s);
+cb.at_is_special = FALSE;
+switch (type & ~MCL_NOEXPAND)
+  {
+  case MCL_DOMAIN:     cb.at_is_special = TRUE;        /*FALLTHROUGH*/
+  case MCL_LOCALPART:  cb.expand_setup = 0;                            break;
+  default:             cb.expand_setup = sep > UCHAR_MAX ? 0 : -1;     break;
+  }
 cb.use_partial = TRUE;
 cb.caseless = caseless;
-cb.at_is_special = (type == MCL_DOMAIN || type == MCL_DOMAIN + MCL_NOEXPAND);
-if (valueptr != NULL) *valueptr = NULL;
+if (valueptr) *valueptr = NULL;
 return  match_check_list(listptr, sep, anchorptr, &local_cache_bits,
   check_string, &cb, type, s, valueptr);
 }
index d6f00b3..c8178d2 100644 (file)
@@ -18,6 +18,7 @@ begin acl
 chk_rcpt:
   accept       domains = OPT
                logwrite = domain $domain
-               logwrite = value $domain_data
+               logwrite = value  $domain_data
+               logwrite = \$0 '$0'  \$1 '$1'
 
 # End
index 3622b9f..bbfa98d 100644 (file)
@@ -1,13 +1,19 @@
 1999-03-02 09:44:33 U=CALLER F=<testclient@primaryhostname.ex> rejected RCPT <a@notmatched.ex>
 1999-03-02 09:44:33 domain plainstring.ex
-1999-03-02 09:44:33 value plainstring.ex
+1999-03-02 09:44:33 value  plainstring.ex
+1999-03-02 09:44:33 $0 'plainstring.ex'  $1 ''
 1999-03-02 09:44:33 domain headtail.ex
-1999-03-02 09:44:33 value *tail.ex
+1999-03-02 09:44:33 value  *tail.ex
+1999-03-02 09:44:33 $0 'headtail.ex'  $1 'head'
 1999-03-02 09:44:33 domain headregextail.ex
-1999-03-02 09:44:33 value ^.*regex
+1999-03-02 09:44:33 value  ^.*r(e.)ex
+1999-03-02 09:44:33 $0 'headregextail.ex'  $1 'eg'
 1999-03-02 09:44:33 domain primaryhostname.ex
-1999-03-02 09:44:33 value primaryhostname.ex
+1999-03-02 09:44:33 value  primaryhostname.ex
+1999-03-02 09:44:33 $0 'primaryhostname.ex'  $1 ''
 1999-03-02 09:44:33 domain [127.0.0.1]
-1999-03-02 09:44:33 value @[]
+1999-03-02 09:44:33 value  @[]
+1999-03-02 09:44:33 $0 '[127.0.0.1]'  $1 ''
 1999-03-02 09:44:33 domain mx46.test.ex
-1999-03-02 09:44:33 value @mx_any/ignore=1.1.1.1
+1999-03-02 09:44:33 value  @mx_any/ignore=1.1.1.1
+1999-03-02 09:44:33 $0 '46.test.ex'  $1 ''
index d4e5acb..3715b12 100644 (file)
@@ -21,7 +21,7 @@ RCPT TO:<a@headtail.ex>
 QUIT
 ****
 #
-exim -bs '-DOPT=notthis : ^.*regex : nothiseither'
+exim -bs '-DOPT=notthis : ^.*r(e.)ex : nothiseither'
 HELO test
 MAIL FROM:<testclient>
 RCPT TO:<a@headregextail.ex>
index 4345a09..ea918ae 100644 (file)
@@ -443,9 +443,9 @@ newline     tab\134backslash ~tilde\177DEL\200\201.
 > match_domain:    yes
 > match_domain:    no
 > 
->  >x@zz.aa.bb< [] >x@zz.aa.bb< 
+>  >x@zz.aa.bb< [zz] >x@zz.aa.bb< 
 > 
->  >x@xxxabc< [] >x@xxxabc< 
+>  >x@xxxabc< [abc] >x@xxxabc< 
 > 
 > match_address:   yes
 > match_address:   yes