1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) University of Cambridge 1995 - 2009 */
6 /* Copyright (c) The Exim Maintainers 2021 */
7 /* See the file NOTICE for conditions of use and distribution. */
10 #include "rf_functions.h"
13 /*************************************************
14 * Get transport for a router *
15 *************************************************/
17 /* If transport_name contains $, it must be expanded each time and used as a
18 transport name. Otherwise, look up the transport only if the destination is not
21 Some routers (e.g. accept) insist that their transport option is set at
22 initialization time. However, for some (e.g. file_transport in redirect), there
23 is no such check, because the transport may not be required. Calls to this
24 function from the former type of router have require_name = NULL, because it
25 will never be used. NULL is also used in verify_only cases, where a transport
29 tpname the text of the transport name
30 tpptr where to put the transport
31 addr the address being processed
32 router_name for error messages
33 require_name used in the error message if transport is unset
35 Returns: TRUE if *tpptr is already set and tpname has no '$' in it;
36 TRUE if a transport has been placed in tpptr;
37 FALSE if there's a problem, in which case
38 addr->message contains a message, and addr->basic_errno has
39 ERRNO_BADTRANSPORT set in it.
43 rf_get_transport(uschar *tpname, transport_instance **tpptr, address_item *addr,
44 uschar *router_name, uschar *require_name)
51 if (!require_name) return TRUE;
52 addr->basic_errno = ERRNO_BADTRANSPORT;
53 addr->message = string_sprintf("%s unset in %s router", require_name,
58 expandable = Ustrchr(tpname, '$') != NULL;
59 if (*tpptr != NULL && !expandable) return TRUE;
63 if (!(ss = expand_string(tpname)))
65 addr->basic_errno = ERRNO_BADTRANSPORT;
66 addr->message = string_sprintf("failed to expand transport "
67 "\"%s\" in %s router: %s", tpname, router_name, expand_string_message);
70 if (is_tainted2(ss, LOG_MAIN|LOG_PANIC, "Tainted tainted value '%s' from '%s' for transport", ss, tpname))
72 addr->basic_errno = ERRNO_BADTRANSPORT;
73 /* Avoid leaking info to an attacker */
74 addr->message = US"internal configuration error";
81 for (transport_instance * tp = transports; tp; tp = tp->next)
82 if (Ustrcmp(tp->name, ss) == 0)
84 DEBUG(D_route) debug_printf("set transport %s\n", ss);
89 addr->basic_errno = ERRNO_BADTRANSPORT;
90 addr->message = string_sprintf("transport \"%s\" not found in %s router", ss,
95 /* End of rf_get_transport.c */