-/* $Cambridge: exim/src/src/match.c,v 1.6 2005/06/22 10:17:23 ph10 Exp $ */
+/* $Cambridge: exim/src/src/match.c,v 1.10 2005/09/12 14:03:42 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
int slen = Ustrlen(s);
if (s[0] != '[' && s[slen-1] != ']') return FAIL;
for (ip = host_find_interfaces(); ip != NULL; ip = ip->next)
- if (Ustrncmp(ip->address, s+1, slen - 2) == 0) return OK;
+ if (Ustrncmp(ip->address, s+1, slen - 2) == 0
+ && ip->address[slen - 2] == 0)
+ return OK;
return FAIL;
}
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;
{
HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot,
include_unknown? "yes":"no", error);
- if (!include_unknown) return FAIL;
+ if (!include_unknown)
+ {
+ if ((log_extra_selector & LX_unknown_in_list) != 0)
+ log_write(0, LOG_MAIN, "list matching forced to fail: %s", error);
+ return FAIL;
+ }
log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error);
return OK;
}
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);
- if (!include_unknown) return FAIL;
+ (void)fclose(f);
+ if (!include_unknown)
+ {
+ if ((log_extra_selector & LX_unknown_in_list) != 0)
+ log_write(0, LOG_MAIN, "list matching forced to fail: %s", error);
+ 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 */