X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/d5c0d8c9374623620844d539d4810da63e9abca1..66387a737208e277990b0cbfe58db3db419f34b2:/src/src/routers/dnslookup.c diff --git a/src/src/routers/dnslookup.c b/src/src/routers/dnslookup.c index e4f7a2539..6ab08d7ba 100644 --- a/src/src/routers/dnslookup.c +++ b/src/src/routers/dnslookup.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2015 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ #include "../exim.h" @@ -20,6 +20,10 @@ optionlist dnslookup_router_options[] = { (void *)(offsetof(dnslookup_router_options_block, check_srv)) }, { "fail_defer_domains", opt_stringptr, (void *)(offsetof(dnslookup_router_options_block, fail_defer_domains)) }, + { "ipv4_only", opt_stringptr, + (void *)(offsetof(dnslookup_router_options_block, ipv4_only)) }, + { "ipv4_prefer", opt_stringptr, + (void *)(offsetof(dnslookup_router_options_block, ipv4_prefer)) }, { "mx_domains", opt_stringptr, (void *)(offsetof(dnslookup_router_options_block, mx_domains)) }, { "mx_fail_domains", opt_stringptr, @@ -44,19 +48,37 @@ address can appear in the tables drtables.c. */ int dnslookup_router_options_count = sizeof(dnslookup_router_options)/sizeof(optionlist); + +#ifdef MACRO_PREDEF + +/* Dummy entries */ +dnslookup_router_options_block dnslookup_router_option_defaults = {0}; +void dnslookup_router_init(router_instance *rblock) {} +int dnslookup_router_entry(router_instance *rblock, address_item *addr, + struct passwd *pw, int verify, address_item **addr_local, + address_item **addr_remote, address_item **addr_new, + address_item **addr_succeed) {return 0;} + +#else /*!MACRO_PREDEF*/ + + + + /* Default private options block for the dnslookup router. */ dnslookup_router_options_block dnslookup_router_option_defaults = { - FALSE, /* check_secondary_mx */ - TRUE, /* qualify_single */ - FALSE, /* search_parents */ - TRUE, /* rewrite_headers */ - NULL, /* widen_domains */ - NULL, /* mx_domains */ - NULL, /* mx_fail_domains */ - NULL, /* srv_fail_domains */ - NULL, /* check_srv */ - NULL /* fail_defer_domains */ + .check_secondary_mx = FALSE, + .qualify_single = TRUE, + .search_parents = FALSE, + .rewrite_headers = TRUE, + .widen_domains = NULL, + .mx_domains = NULL, + .mx_fail_domains = NULL, + .srv_fail_domains = NULL, + .check_srv = NULL, + .fail_defer_domains = NULL, + .ipv4_only = NULL, + .ipv4_prefer = NULL, }; @@ -138,7 +160,7 @@ dnslookup_router_entry( host_item h; int rc; int widen_sep = 0; -int whichrrs = HOST_FIND_BY_MX | HOST_FIND_BY_A; +int whichrrs = HOST_FIND_BY_MX | HOST_FIND_BY_A | HOST_FIND_BY_AAAA; dnslookup_router_options_block *ob = (dnslookup_router_options_block *)(rblock->options_block); uschar *srv_service = NULL; @@ -239,6 +261,19 @@ for (;;) } else return DECLINE; + /* Check if we must request only. or prefer, ipv4 */ + + if ( ob->ipv4_only + && expand_check_condition(ob->ipv4_only, rblock->name, US"router")) + flags = flags & ~HOST_FIND_BY_AAAA | HOST_FIND_IPV4_ONLY; + else if (search_find_defer) + return DEFER; + if ( ob->ipv4_prefer + && expand_check_condition(ob->ipv4_prefer, rblock->name, US"router")) + flags |= HOST_FIND_IPV4_FIRST; + else if (search_find_defer) + return DEFER; + /* Set up the rest of the initial host item. Others may get chained on if there is more than one IP address. We set it up here instead of outside the loop so as to re-initialize if a previous try succeeded but was rejected @@ -254,7 +289,7 @@ for (;;) /* Unfortunately, we cannot set the mx_only option in advance, because the DNS lookup may extend an unqualified name. Therefore, we must do the test - subsequently. We use the same logic as that for widen_domains above to avoid + stoubsequently. We use the same logic as that for widen_domains above to avoid requesting a header rewrite that cannot work. */ if (verify != v_sender || !ob->rewrite_headers || addr->parent) @@ -263,8 +298,8 @@ for (;;) if (ob->search_parents) flags |= HOST_FIND_SEARCH_PARENTS; } - rc = host_find_bydns(&h, CUS rblock->ignore_target_hosts, flags, srv_service, - ob->srv_fail_domains, ob->mx_fail_domains, + rc = host_find_bydns(&h, CUS rblock->ignore_target_hosts, flags, + srv_service, ob->srv_fail_domains, ob->mx_fail_domains, &rblock->dnssec, &fully_qualified_name, &removed); if (removed) setflag(addr, af_local_host_removed); @@ -446,6 +481,7 @@ return rf_queue_add(addr, addr_local, addr_remote, rblock, pw)? OK : DEFER; } +#endif /*!MACRO_PREDEF*/ /* End of routers/dnslookup.c */ /* vi: aw ai sw=2 */