[exim-cvs] Numeric variable returns

Startseite
Nachricht löschen
Nachricht beantworten
Autor: Exim Git Commits Mailing List
Datum:  
To: exim-cvs
Betreff: [exim-cvs] Numeric variable returns
Gitweb: https://git.exim.org/exim.git/commitdiff/43ba45ce62100bc1dbc9b04b5d869f59026783f5
Commit:     43ba45ce62100bc1dbc9b04b5d869f59026783f5
Parent:     2a53e2464bfa1a831f544ed44d3690e5c22259a5
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Wed May 6 19:55:17 2020 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Wed May 6 19:55:17 2020 +0100


    Numeric variable returns
---
 doc/doc-docbook/spec.xfpt    |  6 +++++-
 doc/doc-txt/NewStuff         |  5 +++++
 src/src/match.c              | 34 +++++++++++++++++-----------------
 test/confs/0624              |  3 ++-
 test/log/0624                | 18 ++++++++++++------
 test/scripts/0000-Basic/0624 |  2 +-
 test/stdout/0002             |  4 ++--
 7 files changed, 44 insertions(+), 28 deletions(-)


diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 33e07db..c55dff0 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -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


diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index 493244f..cf142af 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -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
diff --git a/src/src/match.c b/src/src/match.c
index f9b539d..65d4419 100644
--- a/src/src/match.c
+++ b/src/src/match.c
@@ -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);
 }
diff --git a/test/confs/0624 b/test/confs/0624
index d6f00b3..c8178d2 100644
--- a/test/confs/0624
+++ b/test/confs/0624
@@ -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
diff --git a/test/log/0624 b/test/log/0624
index 3622b9f..bbfa98d 100644
--- a/test/log/0624
+++ b/test/log/0624
@@ -1,13 +1,19 @@
 1999-03-02 09:44:33 U=CALLER F=<testclient@???> rejected RCPT <a@???>
 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 ''
diff --git a/test/scripts/0000-Basic/0624 b/test/scripts/0000-Basic/0624
index d4e5acb..3715b12 100644
--- a/test/scripts/0000-Basic/0624
+++ b/test/scripts/0000-Basic/0624
@@ -21,7 +21,7 @@ RCPT TO:<a@???>
 QUIT
 ****
 #
-exim -bs '-DOPT=notthis : ^.*regex : nothiseither'
+exim -bs '-DOPT=notthis : ^.*r(e.)ex : nothiseither'
 HELO test
 MAIL FROM:<testclient>
 RCPT TO:<a@???>
diff --git a/test/stdout/0002 b/test/stdout/0002
index 4345a09..ea918ae 100644
--- a/test/stdout/0002
+++ b/test/stdout/0002
@@ -443,9 +443,9 @@ newline    tab\134backslash ~tilde\177DEL\200\201.

 > match_domain:    yes
 > match_domain:    no

>

-> >x@???< [] >x@???<
+> >x@???< [zz] >x@???<
>

-> >x@xxxabc< [] >x@xxxabc<
+> >x@xxxabc< [abc] >x@xxxabc<
>
> match_address: yes
> match_address: yes