X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/c988f1f4faa9f679f79beddf3c14676c5dcb8e28..13b685f963e9313409f8350f718bac411829a5e7:/src/src/match.c diff --git a/src/src/match.c b/src/src/match.c index 7c30e056c..100e4c0cb 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/match.c,v 1.3 2005/01/04 10:00:42 ph10 Exp $ */ +/* $Cambridge: exim/src/src/match.c,v 1.8 2005/08/01 13:20:28 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -266,12 +266,20 @@ up user@domain for sender rejection). There's a flag to disable it. */ if (!cb->use_partial) partial = -1; -/* Set the parameters for the two different kinds of lookup. */ +/* Set the parameters for the three different kinds of lookup. */ keyquery = semicolon + 1; while (isspace(*keyquery)) keyquery++; -if (!mac_islookup(search_type, lookup_querystyle)) +if (mac_islookup(search_type, lookup_absfilequery)) + { + filename = keyquery; + while (*keyquery != 0 && !isspace(*keyquery)) keyquery++; + filename = string_copyn(filename, keyquery - filename); + while (isspace(*keyquery)) keyquery++; + } + +else if (!mac_islookup(search_type, lookup_querystyle)) { filename = keyquery; keyquery = s; @@ -630,9 +638,11 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) store_pool = POOL_PERM; p = store_get(sizeof(namedlist_cacheblock)); p->key = string_copy(get_check_key(arg, type)); + + + p->data = (*valueptr == NULL)? NULL : string_copy(*valueptr); store_pool = old_pool; - p->data = *valueptr; p->next = nb->cache_data; nb->cache_data = p; if (*valueptr != NULL) @@ -695,8 +705,9 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) case DEFER: goto DEFER_RETURN; - /* The ERROR return occurs only when checking hosts, when either a - forward or reverse lookup has failed. The error string gives details of + /* The ERROR return occurs when checking hosts, when either a forward + or reverse lookup has failed. It can also occur in a match_ip list if a + non-IP address item is encountered. The error string gives details of which it was. */ case ERROR: @@ -780,13 +791,13 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) switch ((func)(arg, ss, valueptr, &error)) { case OK: - fclose(f); + (void)fclose(f); HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot, (yield == OK)? "yes" : "no", sss, filename); return file_yield; case DEFER: - fclose(f); + (void)fclose(f); goto DEFER_RETURN; case ERROR: /* host name lookup failed - this can only */ @@ -799,7 +810,7 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) { HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot, include_unknown? "yes":"no", error); - fclose(f); + (void)fclose(f); if (!include_unknown) return FAIL; log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error); return OK; @@ -811,7 +822,7 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) for the file, in case this is the last item in the list. */ yield = file_yield; - fclose(f); + (void)fclose(f); } } /* Loop for the next item on the top-level list */ @@ -932,7 +943,7 @@ error = error; /* Keep clever compilers from complaining */ DEBUG(D_lists) debug_printf("address match: subject=%s pattern=%s\n", subject, pattern); -/* Handle a regular expression, which must match the entire incoming address. +/* Handle a regular expression, which must match the entire incoming address. This may be the empty address. */ if (*pattern == '^') @@ -947,7 +958,7 @@ for (s = pattern; isalnum(*s) || *s == '-'; s++); if (*s == '*') s++; if (*s == '@') s++; -/* If it is a straight lookup, do a lookup for the whole address. This may be +/* If it is a straight lookup, do a lookup for the whole address. This may be the empty address. Partial matching doesn't make sense here, so we ignore it, but write a panic log entry. However, *@ matching will be honoured. */ @@ -960,8 +971,8 @@ if (*s == ';') valueptr); } -/* For the remaining cases, an empty subject matches only an empty pattern, -because other patterns expect to have a local part and a domain to match +/* For the remaining cases, an empty subject matches only an empty pattern, +because other patterns expect to have a local part and a domain to match against. */ if (*subject == 0) return (*pattern == 0)? OK : FAIL;