X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Froute.c;h=f50a86e9757af64a997307b985485dffc623ec51;hb=f9ba5e2255cf18092750fffacb6a9603571a2be5;hp=b289b0f3419aa4cf531aec6f40ebce71720c3d22;hpb=bfe645c1570343d3adca657ab67998e122ca8792;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/route.c b/src/src/route.c index b289b0f34..f50a86e97 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,9 +140,30 @@ 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 + +# include "macro_predef.h" + +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++) + { + spf(buf, sizeof(buf), US"_DRIVER_ROUTER_%T", ri->driver_name); + builtin_macro_create(buf); + options_from_list(ri->options, (unsigned)*ri->options_count, US"ROUTER", ri->driver_name); + } +} + +#else /*!MACRO_PREDEF*/ /************************************************* * Set router pointer from name * @@ -223,14 +244,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); @@ -271,14 +290,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 } } @@ -701,7 +722,7 @@ while ((check = string_nextinlist(&listptr, &sep, buffer, sizeof(buffer)))) pid = fork(); /* If fork() fails, reinstate the original error and behave as if - this block of code were not present. This is the same behavious as happens + this block of code were not present. This is the same behaviour as happens when Exim is not running as root at this point. */ if (pid < 0) @@ -752,7 +773,7 @@ while ((check = string_nextinlist(&listptr, &sep, buffer, sizeof(buffer)))) rc = -1; } - /* Handle error returns from stat() or route_check_access(). The EACESS error + /* Handle error returns from stat() or route_check_access(). The EACCES error is handled specially. At present, we can force it to be treated as non-existence. Write the code so that it will be easy to add forcing for existence if required later. */ @@ -953,7 +974,7 @@ if (r->router_home_directory) } /* Skip if the sender condition is not met. We leave this one till after the -local user check so that $home is set - enabling the possiblity of letting +local user check so that $home is set - enabling the possibility of letting individual recipients specify lists of acceptable/unacceptable senders. */ if ((rc = route_check_dls(r->name, US"senders", r->senders, NULL, @@ -979,7 +1000,7 @@ if ((rc = check_files(r->require_files, perror)) != OK) if (r->condition) { - DEBUG(D_route) debug_printf("checking \"condition\"\n"); + 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) @@ -1164,7 +1185,7 @@ NIS or NFS whatever cause an incorrect refusal. It's a pity that getgrnam() doesn't have some kind of indication as to why it has failed. Arguments: - s the group namd or textual form of the numerical gid + s the group name or textual form of the numerical gid return_gid return the gid via this address Returns: TRUE if the group was found; FALSE otherwise @@ -1344,7 +1365,7 @@ new->prop.errors_address = parent->prop.errors_address; /* Copy the propagated flags and address_data from the original. */ -copyflag(new, addr, af_propagate); +new->prop.ignore_error = addr->prop.ignore_error; new->prop.address_data = addr->prop.address_data; new->dsn_flags = addr->dsn_flags; new->dsn_orcpt = addr->dsn_orcpt; @@ -1470,7 +1491,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) by this router, even if it was different to the current address. Just in case someone does put it into a loop (possible with redirection - continally adding to an address, for example), put a long stop counter on + 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) @@ -1657,10 +1678,10 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr) set flag. */ if (r->dsn_lasthop && !(addr->dsn_flags & rf_dsnlasthop)) - { + { addr->dsn_flags |= rf_dsnlasthop; HDEBUG(D_route) debug_printf("DSN: last hop for %s\n", addr->address); - } + } HDEBUG(D_route) debug_printf("calling %s router\n", r->name); @@ -1897,21 +1918,8 @@ if (unseen && r->next) /* Unset the address expansions, and return the final result. */ ROUTE_EXIT: -if ( yield == DEFER - && addr->message - && ( Ustrstr(addr->message, "failed to expand") != NULL - || Ustrstr(addr->message, "expansion of ") != NULL - ) - && ( Ustrstr(addr->message, "mysql") != NULL - || Ustrstr(addr->message, "pgsql") != NULL - || Ustrstr(addr->message, "redis") != NULL - || Ustrstr(addr->message, "sqlite") != NULL - || Ustrstr(addr->message, "ldap:") != NULL - || Ustrstr(addr->message, "ldapdn:") != NULL - || Ustrstr(addr->message, "ldapm:") != NULL - ) - ) - addr->message = string_sprintf("Temporary internal error"); +if (yield == DEFER && addr->message) + addr->message = expand_hide_passwords(addr->message); deliver_set_expansions(NULL); router_name = NULL; @@ -1919,4 +1927,5 @@ disable_logging = FALSE; return yield; } +#endif /*!MACRO_PREDEF*/ /* End of route.c */