X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fmatch.c;h=6a331419422b8a06134206e7c46d4f3d6b4af35a;hb=6a9cf7f890226aa085842cd3d94b13e78ea31637;hp=ec769b3a98b0d2968ded1ca8fdd0587c616ee284;hpb=824ac9569a44ae411785f7ba2014d243e85b992d;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/match.c b/src/src/match.c index ec769b3a9..6a3314194 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -104,9 +104,7 @@ uschar *filename = NULL; uschar *keyquery, *result, *semicolon; 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 +134,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,9 +155,9 @@ 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; /* "value" gets the pattern */ + if (valueptr) *valueptr = pattern - 1; /* "value" gets the (original) pattern */ return OK; } @@ -185,7 +182,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 +235,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,16 +265,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 -XXX could add setting of *valueptr to all the OK returns; seems doable here, the Q - is: what effect would it have at config-file level. domain_data & local_part_data - would get filled in... might anyone be checking it for emptiness? I think the docs - do not say "will be empty otherwise", so that seems ok. -XXX WORRY: we get new caching of named-list match results. Is that cache checked - for the key being matched? -*/ } /* Otherwise we have a lookup item. The lookup type, including partial, etc. is @@ -297,22 +284,7 @@ if (!cb->use_partial) partial = -1; /* Set the parameters for the three different kinds of lookup. */ -keyquery = semicolon + 1; -Uskip_whitespace(&keyquery); - -if (mac_islookup(search_type, lookup_absfilequery)) - { - filename = keyquery; - while (*keyquery && !isspace(*keyquery)) keyquery++; - filename = string_copyn(filename, keyquery - filename); - Uskip_whitespace(&keyquery); - } - -else if (!mac_islookup(search_type, lookup_querystyle)) - { - filename = keyquery; - keyquery = s; - } +keyquery = search_args(search_type, s, semicolon+1, &filename, opts); /* Now do the actual lookup; throw away the data returned unless it was asked for; partial matching is all handled inside search_find(). Note that there is @@ -361,7 +333,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; @@ -698,7 +670,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) nb->cache_data = p; if (*valueptr) DEBUG(D_lists) debug_printf("data from lookup saved for " - "cache for %s: %s\n", ss, *valueptr); + "cache for %s: key '%s' value '%s'\n", ss, p->key, *valueptr); } } } @@ -710,7 +682,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) else { DEBUG(D_lists) debug_printf("cached %s match for %s\n", - ((bits & (-bits)) == bits)? "yes" : "no", ss); + (bits & (-bits)) == bits ? "yes" : "no", ss); cached = US" - cached"; if (valueptr) @@ -814,7 +786,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) if (listname[0] == 0) listname = string_sprintf("\"%s\"", *listptr); log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", - string_open_failed(errno, "%s when checking %s", sss, listname)); + string_open_failed("%s when checking %s", sss, listname)); } /* Trailing comments are introduced by #, but in an address list or local @@ -972,12 +944,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); } @@ -1025,8 +1002,6 @@ uschar *subject = cb->address; const uschar *s; uschar *pdomain, *sdomain; -error = error; /* Keep clever compilers from complaining */ - DEBUG(D_lists) debug_printf("address match test: subject=%s pattern=%s\n", subject, pattern);