-/* $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 *
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;
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)
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:
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 */
{
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;
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 */
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 == '^')
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. */
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;