X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/d5b80e59458182b2d557a929a18cb8c70cd56b68..56dbf856f209bbd6c6e211e691b8fd898e01dfe8:/src/src/route.c diff --git a/src/src/route.c b/src/src/route.c index bbaa5285d..ede153041 100644 --- a/src/src/route.c +++ b/src/src/route.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. */ /* Functions concerned with routing, and the list of generic router options. */ @@ -140,7 +140,7 @@ optionlist optionlist_routers[] = { (void *)offsetof(router_instance, verify_sender) } }; -int optionlist_routers_size = sizeof(optionlist_routers)/sizeof(optionlist); +int optionlist_routers_size = nelem(optionlist_routers); #ifdef MACRO_PREDEF @@ -150,12 +150,11 @@ int optionlist_routers_size = sizeof(optionlist_routers)/sizeof(optionlist); void options_routers(void) { -struct router_info * ri; uschar buf[64]; options_from_list(optionlist_routers, nelem(optionlist_routers), US"ROUTERS", NULL); -for (ri = routers_available; ri->driver_name[0]; ri++) +for (router_info * ri = routers_available; ri->driver_name[0]; ri++) { spf(buf, sizeof(buf), US"_DRIVER_ROUTER_%T", ri->driver_name); builtin_macro_create(buf); @@ -222,8 +221,6 @@ function. */ void route_init(void) { -router_instance *r; - readconf_driver_init(US"router", (driver_instance **)(&routers), /* chain anchor */ (driver_info *)routers_available, /* available drivers */ @@ -233,7 +230,7 @@ readconf_driver_init(US"router", optionlist_routers, /* generic options */ optionlist_routers_size); -for (r = routers; r; r = r->next) +for (router_instance * r = routers; r; r = r->next) { uschar *s = r->self; @@ -244,14 +241,12 @@ for (r = routers; r; r = r->next) /* Check for transport or no transport on certain routers */ - if ((r->info->ri_flags & ri_yestransport) != 0 && - r->transport_name == NULL && - !r->verify_only) + if ( (r->info->ri_flags & ri_yestransport) + && !r->transport_name && !r->verify_only) log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "%s router:\n " "a transport is required for this router", r->name); - if ((r->info->ri_flags & ri_notransport) != 0 && - r->transport_name != NULL) + if ((r->info->ri_flags & ri_notransport) && r->transport_name) log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "%s router:\n " "a transport must not be defined for this router", r->name); @@ -292,14 +287,16 @@ for (r = routers; r; r = r->next) /* Check redirect_router and pass_router are valid */ - if (r->redirect_router_name != NULL) + if (r->redirect_router_name) set_router(r, r->redirect_router_name, &(r->redirect_router), FALSE); - if (r->pass_router_name != NULL) + if (r->pass_router_name) set_router(r, r->pass_router_name, &(r->pass_router), TRUE); +#ifdef notdef DEBUG(D_route) debug_printf("DSN: %s %s\n", r->name, r->dsn_lasthop ? "lasthop set" : "propagating DSN"); +#endif } } @@ -317,8 +314,7 @@ is finished, via this function. */ void route_tidyup(void) { -router_instance *r; -for (r = routers; r; r = r->next) +for (router_instance * r = routers; r; r = r->next) if (r->info->tidyup) (r->info->tidyup)(r); } @@ -352,9 +348,8 @@ while ((prefix = string_nextinlist(&listptr, &sep, prebuf, sizeof(prebuf)))) int plen = Ustrlen(prefix); if (prefix[0] == '*') { - const uschar *p; prefix++; - for (p = local_part + Ustrlen(local_part) - (--plen); + for (const uschar * p = local_part + Ustrlen(local_part) - (--plen); p >= local_part; p--) if (strncmpic(prefix, p, plen) == 0) return plen + p - local_part; } @@ -396,9 +391,8 @@ while ((suffix = string_nextinlist(&listptr, &sep, sufbuf, sizeof(sufbuf)))) int slen = Ustrlen(suffix); if (suffix[slen-1] == '*') { - const uschar *p, *pend; - pend = local_part + alen - (--slen) + 1; - for (p = local_part; p < pend; p++) + const uschar *pend = local_part + alen - (--slen) + 1; + for (const uschar * p = local_part; p < pend; p++) if (strncmpic(suffix, p, slen) == 0) return alen - (p - local_part); } else @@ -606,7 +600,7 @@ while ((check = string_nextinlist(&listptr, &sep, buffer, sizeof(buffer)))) if (!ss) { - if (expand_string_forcedfail) continue; + if (f.expand_string_forcedfail) continue; *perror = string_sprintf("failed to expand \"%s\" for require_files: %s", check, expand_string_message); goto RETURN_DEFER; @@ -854,7 +848,7 @@ deliver_localpart_data = NULL; sender_data = NULL; local_user_gid = (gid_t)(-1); local_user_uid = (uid_t)(-1); -search_find_defer = FALSE; +f.search_find_defer = FALSE; /* Skip this router if not verifying and it has verify_only set */ @@ -866,7 +860,7 @@ if ((verify == v_none || verify == v_expn) && r->verify_only) /* Skip this router if testing an address (-bt) and address_test is not set */ -if (address_test_mode && !r->address_test) +if (f.address_test_mode && !r->address_test) { DEBUG(D_route) debug_printf("%s router skipped: address_test is unset\n", r->name); @@ -958,7 +952,7 @@ if (r->router_home_directory) uschar *router_home = expand_string(r->router_home_directory); if (!router_home) { - if (!expand_string_forcedfail) + if (!f.expand_string_forcedfail) { *perror = string_sprintf("failed to expand \"%s\" for " "router_home_directory: %s", r->router_home_directory, @@ -1003,7 +997,7 @@ if (r->condition) DEBUG(D_route) debug_printf("checking \"condition\" \"%.80s\"...\n", r->condition); if (!expand_check_condition(r->condition, r->name, US"router")) { - if (search_find_defer) + if (f.search_find_defer) { *perror = US"condition check lookup defer"; DEBUG(D_route) debug_printf("%s\n", *perror); @@ -1460,7 +1454,6 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) uschar *error; struct passwd *pw = NULL; struct passwd pwcopy; - address_item *parent; BOOL loop_detected = FALSE; BOOL more; int loopcount = 0; @@ -1474,7 +1467,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) /* There are some weird cases where logging is disabled */ - disable_logging = r->disable_logging; + f.disable_logging = r->disable_logging; /* Record the last router to handle the address, and set the default next router. */ @@ -1494,7 +1487,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) continually adding to an address, for example), put a long stop counter on the number of parents. */ - for (parent = addr->parent; parent; parent = parent->parent) + for (address_item * parent = addr->parent; parent; parent = parent->parent) { if (parent->router == r) { @@ -1620,7 +1613,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) deliver_address_data = expand_string(r->address_data); if (!deliver_address_data) { - if (expand_string_forcedfail) + if (f.expand_string_forcedfail) { DEBUG(D_route) debug_printf("forced failure in expansion of \"%s\" " "(address_data): decline action taken\n", r->address_data); @@ -1672,10 +1665,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) pw = &pwcopy; } - /* Run the router, and handle the consequences. */ - - /* ... but let us check on DSN before. If this should be the last hop for DSN - set flag. */ + /* If this should be the last hop for DSN flag the addr. */ if (r->dsn_lasthop && !(addr->dsn_flags & rf_dsnlasthop)) { @@ -1683,6 +1673,8 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) HDEBUG(D_route) debug_printf("DSN: last hop for %s\n", addr->address); } + /* Run the router, and handle the consequences. */ + HDEBUG(D_route) debug_printf("calling %s router\n", r->name); yield = (r->info->code)(r, addr, pw, verify, paddr_local, paddr_remote, @@ -1766,7 +1758,7 @@ if (!r) uschar *expmessage = expand_string(addr->router->cannot_route_message); if (!expmessage) { - if (!expand_string_forcedfail) + if (!f.expand_string_forcedfail) log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand " "cannot_route_message in %s router: %s", addr->router->name, expand_string_message); @@ -1821,8 +1813,7 @@ if (r->translate_ip_address) { int rc; int old_pool = store_pool; - host_item *h; - for (h = addr->host_list; h; h = h->next) + for (host_item * h = addr->host_list; h; h = h->next) { uschar *newaddress; uschar *oldaddress, *oldname; @@ -1835,7 +1826,7 @@ if (r->translate_ip_address) if (!newaddress) { - if (expand_string_forcedfail) continue; + if (f.expand_string_forcedfail) continue; addr->basic_errno = ERRNO_EXPANDFAIL; addr->message = string_sprintf("translate_ip_address expansion " "failed: %s", expand_string_message); @@ -1887,16 +1878,14 @@ HDEBUG(D_route) debug_printf("routed by %s router%s\n", r->name, DEBUG(D_route) { - host_item *h; - debug_printf(" envelope to: %s\n", addr->address); - debug_printf(" transport: %s\n", (addr->transport == NULL)? - US"" : addr->transport->name); + debug_printf(" transport: %s\n", addr->transport + ? addr->transport->name : US""); if (addr->prop.errors_address) debug_printf(" errors to %s\n", addr->prop.errors_address); - for (h = addr->host_list; h; h = h->next) + for (host_item * h = addr->host_list; h; h = h->next) { debug_printf(" host %s", h->name); if (h->address) debug_printf(" [%s]", h->address); @@ -1923,7 +1912,7 @@ if (yield == DEFER && addr->message) deliver_set_expansions(NULL); router_name = NULL; -disable_logging = FALSE; +f.disable_logging = FALSE; return yield; }