Use separate routine for translating return-codes to printable strings
[exim.git] / src / src / transports / smtp.c
CommitLineData
0756eb3c
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
f9ba5e22 5/* Copyright (c) University of Cambridge 1995 - 2018 */
0756eb3c
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8#include "../exim.h"
9#include "smtp.h"
10
0756eb3c
PH
11
12/* Options specific to the smtp transport. This transport also supports LMTP
13over TCP/IP. The options must be in alphabetic order (note that "_" comes
14before the lower case letters). Some live in the transport_instance block so as
15to be publicly visible; these are flagged with opt_public. */
16
17optionlist smtp_transport_options[] = {
506900af
JH
18 { "*expand_multi_domain", opt_stringptr | opt_hidden | opt_public,
19 (void *)offsetof(transport_instance, expand_multi_domain) },
9c695f6d
JH
20 { "*expand_retry_include_ip_address", opt_stringptr | opt_hidden,
21 (void *)(offsetof(smtp_transport_options_block, expand_retry_include_ip_address)) },
22
48c7f9e2
PH
23 { "address_retry_include_sender", opt_bool,
24 (void *)offsetof(smtp_transport_options_block, address_retry_include_sender) },
0756eb3c
PH
25 { "allow_localhost", opt_bool,
26 (void *)offsetof(smtp_transport_options_block, allow_localhost) },
617d3932
JH
27#ifdef EXPERIMENTAL_ARC
28 { "arc_sign", opt_stringptr,
29 (void *)offsetof(smtp_transport_options_block, arc_sign) },
30#endif
0756eb3c
PH
31 { "authenticated_sender", opt_stringptr,
32 (void *)offsetof(smtp_transport_options_block, authenticated_sender) },
382afc6b
PH
33 { "authenticated_sender_force", opt_bool,
34 (void *)offsetof(smtp_transport_options_block, authenticated_sender_force) },
0756eb3c
PH
35 { "command_timeout", opt_time,
36 (void *)offsetof(smtp_transport_options_block, command_timeout) },
37 { "connect_timeout", opt_time,
38 (void *)offsetof(smtp_transport_options_block, connect_timeout) },
39 { "connection_max_messages", opt_int | opt_public,
40 (void *)offsetof(transport_instance, connection_max_messages) },
5ec37a55
PP
41# ifdef SUPPORT_DANE
42 { "dane_require_tls_ciphers", opt_stringptr,
43 (void *)offsetof(smtp_transport_options_block, dane_require_tls_ciphers) },
44# endif
0756eb3c
PH
45 { "data_timeout", opt_time,
46 (void *)offsetof(smtp_transport_options_block, data_timeout) },
47 { "delay_after_cutoff", opt_bool,
48 (void *)offsetof(smtp_transport_options_block, delay_after_cutoff) },
80a47a2c 49#ifndef DISABLE_DKIM
f7572e5a 50 { "dkim_canon", opt_stringptr,
ff5aac2b 51 (void *)offsetof(smtp_transport_options_block, dkim.dkim_canon) },
f7572e5a 52 { "dkim_domain", opt_stringptr,
ff5aac2b 53 (void *)offsetof(smtp_transport_options_block, dkim.dkim_domain) },
d73e45df
JH
54 { "dkim_hash", opt_stringptr,
55 (void *)offsetof(smtp_transport_options_block, dkim.dkim_hash) },
7c6ec81b
JH
56 { "dkim_identity", opt_stringptr,
57 (void *)offsetof(smtp_transport_options_block, dkim.dkim_identity) },
f7572e5a 58 { "dkim_private_key", opt_stringptr,
ff5aac2b 59 (void *)offsetof(smtp_transport_options_block, dkim.dkim_private_key) },
f7572e5a 60 { "dkim_selector", opt_stringptr,
ff5aac2b 61 (void *)offsetof(smtp_transport_options_block, dkim.dkim_selector) },
f7572e5a 62 { "dkim_sign_headers", opt_stringptr,
ff5aac2b 63 (void *)offsetof(smtp_transport_options_block, dkim.dkim_sign_headers) },
f7572e5a 64 { "dkim_strict", opt_stringptr,
ff5aac2b 65 (void *)offsetof(smtp_transport_options_block, dkim.dkim_strict) },
2bc0f45e
JH
66 { "dkim_timestamps", opt_stringptr,
67 (void *)offsetof(smtp_transport_options_block, dkim.dkim_timestamps) },
80a47a2c 68#endif
0756eb3c
PH
69 { "dns_qualify_single", opt_bool,
70 (void *)offsetof(smtp_transport_options_block, dns_qualify_single) },
71 { "dns_search_parents", opt_bool,
72 (void *)offsetof(smtp_transport_options_block, dns_search_parents) },
578897ea 73 { "dnssec_request_domains", opt_stringptr,
7cd171b7 74 (void *)offsetof(smtp_transport_options_block, dnssec.request) },
578897ea 75 { "dnssec_require_domains", opt_stringptr,
7cd171b7 76 (void *)offsetof(smtp_transport_options_block, dnssec.require) },
9e4f5962
PP
77 { "dscp", opt_stringptr,
78 (void *)offsetof(smtp_transport_options_block, dscp) },
0756eb3c
PH
79 { "fallback_hosts", opt_stringptr,
80 (void *)offsetof(smtp_transport_options_block, fallback_hosts) },
81 { "final_timeout", opt_time,
82 (void *)offsetof(smtp_transport_options_block, final_timeout) },
83 { "gethostbyname", opt_bool,
84 (void *)offsetof(smtp_transport_options_block, gethostbyname) },
85 { "helo_data", opt_stringptr,
86 (void *)offsetof(smtp_transport_options_block, helo_data) },
87 { "hosts", opt_stringptr,
88 (void *)offsetof(smtp_transport_options_block, hosts) },
89 { "hosts_avoid_esmtp", opt_stringptr,
90 (void *)offsetof(smtp_transport_options_block, hosts_avoid_esmtp) },
c51b8e75
PH
91 { "hosts_avoid_pipelining", opt_stringptr,
92 (void *)offsetof(smtp_transport_options_block, hosts_avoid_pipelining) },
80a47a2c 93#ifdef SUPPORT_TLS
0756eb3c
PH
94 { "hosts_avoid_tls", opt_stringptr,
95 (void *)offsetof(smtp_transport_options_block, hosts_avoid_tls) },
80a47a2c 96#endif
0756eb3c
PH
97 { "hosts_max_try", opt_int,
98 (void *)offsetof(smtp_transport_options_block, hosts_max_try) },
533244af
PH
99 { "hosts_max_try_hardlimit", opt_int,
100 (void *)offsetof(smtp_transport_options_block, hosts_max_try_hardlimit) },
80a47a2c 101#ifdef SUPPORT_TLS
0756eb3c
PH
102 { "hosts_nopass_tls", opt_stringptr,
103 (void *)offsetof(smtp_transport_options_block, hosts_nopass_tls) },
875512a3
JH
104 { "hosts_noproxy_tls", opt_stringptr,
105 (void *)offsetof(smtp_transport_options_block, hosts_noproxy_tls) },
80a47a2c 106#endif
0756eb3c
PH
107 { "hosts_override", opt_bool,
108 (void *)offsetof(smtp_transport_options_block, hosts_override) },
ee8b8090
JH
109#ifdef EXPERIMENTAL_PIPE_CONNECT
110 { "hosts_pipe_connect", opt_stringptr,
111 (void *)offsetof(smtp_transport_options_block, hosts_pipe_connect) },
112#endif
0756eb3c
PH
113 { "hosts_randomize", opt_bool,
114 (void *)offsetof(smtp_transport_options_block, hosts_randomize) },
f2de3a33 115#if defined(SUPPORT_TLS) && !defined(DISABLE_OCSP)
44662487
JH
116 { "hosts_request_ocsp", opt_stringptr,
117 (void *)offsetof(smtp_transport_options_block, hosts_request_ocsp) },
118#endif
0756eb3c
PH
119 { "hosts_require_auth", opt_stringptr,
120 (void *)offsetof(smtp_transport_options_block, hosts_require_auth) },
80a47a2c 121#ifdef SUPPORT_TLS
c0635b6d 122# ifdef SUPPORT_DANE
7a31d643
JH
123 { "hosts_require_dane", opt_stringptr,
124 (void *)offsetof(smtp_transport_options_block, hosts_require_dane) },
125# endif
f2de3a33 126# ifndef DISABLE_OCSP
f5d78688
JH
127 { "hosts_require_ocsp", opt_stringptr,
128 (void *)offsetof(smtp_transport_options_block, hosts_require_ocsp) },
129# endif
0756eb3c
PH
130 { "hosts_require_tls", opt_stringptr,
131 (void *)offsetof(smtp_transport_options_block, hosts_require_tls) },
80a47a2c 132#endif
0756eb3c
PH
133 { "hosts_try_auth", opt_stringptr,
134 (void *)offsetof(smtp_transport_options_block, hosts_try_auth) },
f98442df
JH
135 { "hosts_try_chunking", opt_stringptr,
136 (void *)offsetof(smtp_transport_options_block, hosts_try_chunking) },
c0635b6d 137#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE)
96e47838
TL
138 { "hosts_try_dane", opt_stringptr,
139 (void *)offsetof(smtp_transport_options_block, hosts_try_dane) },
140#endif
fb05276a
JH
141 { "hosts_try_fastopen", opt_stringptr,
142 (void *)offsetof(smtp_transport_options_block, hosts_try_fastopen) },
8ccd00b1 143#ifndef DISABLE_PRDR
fd98a5c6
JH
144 { "hosts_try_prdr", opt_stringptr,
145 (void *)offsetof(smtp_transport_options_block, hosts_try_prdr) },
146#endif
99400968
JH
147#ifdef SUPPORT_TLS
148 { "hosts_verify_avoid_tls", opt_stringptr,
149 (void *)offsetof(smtp_transport_options_block, hosts_verify_avoid_tls) },
150#endif
0756eb3c
PH
151 { "interface", opt_stringptr,
152 (void *)offsetof(smtp_transport_options_block, interface) },
153 { "keepalive", opt_bool,
154 (void *)offsetof(smtp_transport_options_block, keepalive) },
f1513293
PH
155 { "lmtp_ignore_quota", opt_bool,
156 (void *)offsetof(smtp_transport_options_block, lmtp_ignore_quota) },
0756eb3c
PH
157 { "max_rcpt", opt_int | opt_public,
158 (void *)offsetof(transport_instance, max_addresses) },
506900af 159 { "multi_domain", opt_expand_bool | opt_public,
0756eb3c
PH
160 (void *)offsetof(transport_instance, multi_domain) },
161 { "port", opt_stringptr,
162 (void *)offsetof(smtp_transport_options_block, port) },
163 { "protocol", opt_stringptr,
164 (void *)offsetof(smtp_transport_options_block, protocol) },
9c695f6d 165 { "retry_include_ip_address", opt_expand_bool,
0756eb3c
PH
166 (void *)offsetof(smtp_transport_options_block, retry_include_ip_address) },
167 { "serialize_hosts", opt_stringptr,
168 (void *)offsetof(smtp_transport_options_block, serialize_hosts) },
169 { "size_addition", opt_int,
1ddf77d0 170 (void *)offsetof(smtp_transport_options_block, size_addition) },
f0989ec0 171#ifdef SUPPORT_SOCKS
1ddf77d0
JH
172 { "socks_proxy", opt_stringptr,
173 (void *)offsetof(smtp_transport_options_block, socks_proxy) },
7eb6c37c 174#endif
80a47a2c 175#ifdef SUPPORT_TLS
1ddf77d0 176 { "tls_certificate", opt_stringptr,
0756eb3c
PH
177 (void *)offsetof(smtp_transport_options_block, tls_certificate) },
178 { "tls_crl", opt_stringptr,
179 (void *)offsetof(smtp_transport_options_block, tls_crl) },
54c90be1
PP
180 { "tls_dh_min_bits", opt_int,
181 (void *)offsetof(smtp_transport_options_block, tls_dh_min_bits) },
0756eb3c
PH
182 { "tls_privatekey", opt_stringptr,
183 (void *)offsetof(smtp_transport_options_block, tls_privatekey) },
3f0945ff 184 { "tls_require_ciphers", opt_stringptr,
0756eb3c 185 (void *)offsetof(smtp_transport_options_block, tls_require_ciphers) },
3f0945ff
PP
186 { "tls_sni", opt_stringptr,
187 (void *)offsetof(smtp_transport_options_block, tls_sni) },
0756eb3c
PH
188 { "tls_tempfail_tryclear", opt_bool,
189 (void *)offsetof(smtp_transport_options_block, tls_tempfail_tryclear) },
a63be306
WB
190 { "tls_try_verify_hosts", opt_stringptr,
191 (void *)offsetof(smtp_transport_options_block, tls_try_verify_hosts) },
e51c7be2
JH
192 { "tls_verify_cert_hostnames", opt_stringptr,
193 (void *)offsetof(smtp_transport_options_block,tls_verify_cert_hostnames)},
0756eb3c 194 { "tls_verify_certificates", opt_stringptr,
a63be306
WB
195 (void *)offsetof(smtp_transport_options_block, tls_verify_certificates) },
196 { "tls_verify_hosts", opt_stringptr,
71c15846
JH
197 (void *)offsetof(smtp_transport_options_block, tls_verify_hosts) },
198#endif
199#ifdef SUPPORT_I18N
200 { "utf8_downconvert", opt_stringptr,
201 (void *)offsetof(smtp_transport_options_block, utf8_downconvert) },
80a47a2c 202#endif
0756eb3c
PH
203};
204
205/* Size of the options list. An extern variable has to be used so that its
206address can appear in the tables drtables.c. */
207
71c15846 208int smtp_transport_options_count = nelem(smtp_transport_options);
0756eb3c 209
d185889f
JH
210
211#ifdef MACRO_PREDEF
212
213/* Dummy values */
214smtp_transport_options_block smtp_transport_option_defaults = {0};
215void smtp_transport_init(transport_instance *tblock) {}
216BOOL smtp_transport_entry(transport_instance *tblock, address_item *addr) {return FALSE;}
217void smtp_transport_closedown(transport_instance *tblock) {}
218
219#else /*!MACRO_PREDEF*/
220
221
0756eb3c
PH
222/* Default private options block for the smtp transport. */
223
224smtp_transport_options_block smtp_transport_option_defaults = {
838d897c 225 .hosts = NULL,
847cd15f 226 .fallback_hosts = NULL,
838d897c
JH
227 .hostlist = NULL,
228 .fallback_hostlist = NULL,
838d897c
JH
229 .helo_data = US"$primary_hostname",
230 .interface = NULL,
231 .port = NULL,
232 .protocol = US"smtp",
233 .dscp = NULL,
234 .serialize_hosts = NULL,
235 .hosts_try_auth = NULL,
236 .hosts_require_auth = NULL,
237 .hosts_try_chunking = US"*",
c0635b6d 238#ifdef SUPPORT_DANE
838d897c
JH
239 .hosts_try_dane = NULL,
240 .hosts_require_dane = NULL,
5ec37a55 241 .dane_require_tls_ciphers = NULL,
96e47838 242#endif
838d897c 243 .hosts_try_fastopen = NULL,
8ccd00b1 244#ifndef DISABLE_PRDR
838d897c 245 .hosts_try_prdr = US"*",
f5d78688 246#endif
f2de3a33 247#ifndef DISABLE_OCSP
838d897c
JH
248 .hosts_request_ocsp = US"*", /* hosts_request_ocsp (except under DANE; tls_client_start()) */
249 .hosts_require_ocsp = NULL,
fd98a5c6 250#endif
838d897c
JH
251 .hosts_require_tls = NULL,
252 .hosts_avoid_tls = NULL,
253 .hosts_verify_avoid_tls = NULL,
254 .hosts_avoid_pipelining = NULL,
ee8b8090
JH
255#ifdef EXPERIMENTAL_PIPE_CONNECT
256 .hosts_pipe_connect = NULL,
257#endif
838d897c 258 .hosts_avoid_esmtp = NULL,
57cc2785 259#ifdef SUPPORT_TLS
838d897c
JH
260 .hosts_nopass_tls = NULL,
261 .hosts_noproxy_tls = US"*",
57cc2785 262#endif
838d897c
JH
263 .command_timeout = 5*60,
264 .connect_timeout = 5*60,
265 .data_timeout = 5*60,
266 .final_timeout = 10*60,
267 .size_addition = 1024,
268 .hosts_max_try = 5,
269 .hosts_max_try_hardlimit = 50,
270 .address_retry_include_sender = TRUE,
271 .allow_localhost = FALSE,
272 .authenticated_sender_force = FALSE,
273 .gethostbyname = FALSE,
274 .dns_qualify_single = TRUE,
275 .dns_search_parents = FALSE,
276 .dnssec = { .request=NULL, .require=NULL },
277 .delay_after_cutoff = TRUE,
278 .hosts_override = FALSE,
279 .hosts_randomize = FALSE,
280 .keepalive = TRUE,
281 .lmtp_ignore_quota = FALSE,
282 .expand_retry_include_ip_address = NULL,
283 .retry_include_ip_address = TRUE,
f0989ec0 284#ifdef SUPPORT_SOCKS
838d897c 285 .socks_proxy = NULL,
b8bf753b 286#endif
80a47a2c 287#ifdef SUPPORT_TLS
838d897c
JH
288 .tls_certificate = NULL,
289 .tls_crl = NULL,
290 .tls_privatekey = NULL,
291 .tls_require_ciphers = NULL,
292 .tls_sni = NULL,
293 .tls_verify_certificates = US"system",
294 .tls_dh_min_bits = EXIM_CLIENT_DH_DEFAULT_MIN_BITS,
295 .tls_tempfail_tryclear = TRUE,
296 .tls_verify_hosts = NULL,
297 .tls_try_verify_hosts = US"*",
298 .tls_verify_cert_hostnames = US"*",
80a47a2c 299#endif
71c15846
JH
300#ifdef SUPPORT_I18N
301 .utf8_downconvert = NULL,
302#endif
80a47a2c 303#ifndef DISABLE_DKIM
838d897c
JH
304 .dkim =
305 {.dkim_domain = NULL,
7c6ec81b 306 .dkim_identity = NULL,
838d897c
JH
307 .dkim_private_key = NULL,
308 .dkim_selector = NULL,
309 .dkim_canon = NULL,
7c6ec81b 310 .dkim_sign_headers = NULL,
838d897c 311 .dkim_strict = NULL,
d73e45df 312 .dkim_hash = US"sha256",
2bc0f45e 313 .dkim_timestamps = NULL,
617d3932
JH
314 .dot_stuffed = FALSE,
315 .force_bodyhash = FALSE,
316# ifdef EXPERIMENTAL_ARC
317 .arc_signspec = NULL,
318# endif
319 },
320# ifdef EXPERIMENTAL_ARC
321 .arc_sign = NULL,
322# endif
80a47a2c 323#endif
0756eb3c
PH
324};
325
6c1c3d1d
WB
326/* some DSN flags for use later */
327
328static int rf_list[] = {rf_notify_never, rf_notify_success,
329 rf_notify_failure, rf_notify_delay };
330
45500060 331static uschar *rf_names[] = { US"NEVER", US"SUCCESS", US"FAILURE", US"DELAY" };
6c1c3d1d
WB
332
333
0756eb3c
PH
334
335/* Local statics */
336
87cb4a16
JH
337static uschar *smtp_command; /* Points to last cmd for error messages */
338static uschar *mail_command; /* Points to MAIL cmd for error messages */
339static uschar *data_command = US""; /* Points to DATA cmd for error messages */
340static BOOL update_waiting; /* TRUE to update the "wait" database */
875512a3
JH
341
342/*XXX move to smtp_context */
87cb4a16 343static BOOL pipelining_active; /* current transaction is in pipe mode */
0756eb3c
PH
344
345
ee8b8090
JH
346static unsigned ehlo_response(uschar * buf, unsigned checks);
347
348
0756eb3c
PH
349/*************************************************
350* Setup entry point *
351*************************************************/
352
353/* This function is called when the transport is about to be used,
354but before running it in a sub-process. It is used for two things:
355
356 (1) To set the fallback host list in addresses, when delivering.
26da7e20
PH
357 (2) To pass back the interface, port, protocol, and other options, for use
358 during callout verification.
0756eb3c
PH
359
360Arguments:
361 tblock pointer to the transport instance block
362 addrlist list of addresses about to be transported
363 tf if not NULL, pointer to block in which to return options
929ba01c
PH
364 uid the uid that will be set (not used)
365 gid the gid that will be set (not used)
0756eb3c
PH
366 errmsg place for error message (not used)
367
368Returns: OK always (FAIL, DEFER not used)
369*/
370
371static int
372smtp_transport_setup(transport_instance *tblock, address_item *addrlist,
929ba01c 373 transport_feedback *tf, uid_t uid, gid_t gid, uschar **errmsg)
0756eb3c 374{
ee8b8090 375smtp_transport_options_block *ob = SOB tblock->options_block;
0756eb3c
PH
376
377errmsg = errmsg; /* Keep picky compilers happy */
929ba01c
PH
378uid = uid;
379gid = gid;
0756eb3c
PH
380
381/* Pass back options if required. This interface is getting very messy. */
382
02b41d71 383if (tf)
0756eb3c
PH
384 {
385 tf->interface = ob->interface;
386 tf->port = ob->port;
387 tf->protocol = ob->protocol;
388 tf->hosts = ob->hosts;
389 tf->hosts_override = ob->hosts_override;
390 tf->hosts_randomize = ob->hosts_randomize;
391 tf->gethostbyname = ob->gethostbyname;
392 tf->qualify_single = ob->dns_qualify_single;
393 tf->search_parents = ob->dns_search_parents;
26da7e20 394 tf->helo_data = ob->helo_data;
0756eb3c
PH
395 }
396
397/* Set the fallback host list for all the addresses that don't have fallback
398host lists, provided that the local host wasn't present in the original host
399list. */
400
401if (!testflag(addrlist, af_local_host_removed))
02b41d71
JH
402 for (; addrlist; addrlist = addrlist->next)
403 if (!addrlist->fallback_hosts) addrlist->fallback_hosts = ob->fallback_hostlist;
0756eb3c
PH
404
405return OK;
406}
407
408
409
410/*************************************************
411* Initialization entry point *
412*************************************************/
413
414/* Called for each instance, after its options have been read, to
415enable consistency checks to be done, or anything else that needs
416to be set up.
417
418Argument: pointer to the transport instance block
419Returns: nothing
420*/
421
422void
423smtp_transport_init(transport_instance *tblock)
424{
ee8b8090 425smtp_transport_options_block *ob = SOB tblock->options_block;
0756eb3c
PH
426
427/* Retry_use_local_part defaults FALSE if unset */
428
429if (tblock->retry_use_local_part == TRUE_UNSET)
430 tblock->retry_use_local_part = FALSE;
431
432/* Set the default port according to the protocol */
433
ee8b8090
JH
434if (!ob->port)
435 ob->port = strcmpic(ob->protocol, US"lmtp") == 0
436 ? US"lmtp"
437 : strcmpic(ob->protocol, US"smtps") == 0
438 ? US"smtps" : US"smtp";
0756eb3c
PH
439
440/* Set up the setup entry point, to be called before subprocesses for this
441transport. */
442
443tblock->setup = smtp_transport_setup;
444
445/* Complain if any of the timeouts are zero. */
446
447if (ob->command_timeout <= 0 || ob->data_timeout <= 0 ||
448 ob->final_timeout <= 0)
449 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
450 "command, data, or final timeout value is zero for %s transport",
451 tblock->name);
452
453/* If hosts_override is set and there are local hosts, set the global
454flag that stops verify from showing router hosts. */
455
456if (ob->hosts_override && ob->hosts != NULL) tblock->overrides_hosts = TRUE;
457
458/* If there are any fallback hosts listed, build a chain of host items
459for them, but do not do any lookups at this time. */
460
461host_build_hostlist(&(ob->fallback_hostlist), ob->fallback_hosts, FALSE);
462}
463
464
465
466
467
468/*************************************************
469* Set delivery info into all active addresses *
470*************************************************/
471
472/* Only addresses whose status is >= PENDING are relevant. A lesser
473status means that an address is not currently being processed.
474
475Arguments:
447d236c
PH
476 addrlist points to a chain of addresses
477 errno_value to put in each address's errno field
478 msg to put in each address's message field
479 rc to put in each address's transport_return field
480 pass_message if TRUE, set the "pass message" flag in the address
c562fd30 481 host if set, mark addrs as having used this host
895fbaf2
JH
482 smtp_greeting from peer
483 helo_response from peer
0756eb3c
PH
484
485If errno_value has the special value ERRNO_CONNECTTIMEOUT, ETIMEDOUT is put in
486the errno field, and RTEF_CTOUT is ORed into the more_errno field, to indicate
487this particular type of timeout.
488
489Returns: nothing
490*/
491
7cd1141b
PH
492static void
493set_errno(address_item *addrlist, int errno_value, uschar *msg, int rc,
895fbaf2
JH
494 BOOL pass_message, host_item * host
495#ifdef EXPERIMENTAL_DSN_INFO
496 , const uschar * smtp_greeting, const uschar * helo_response
497#endif
498 )
0756eb3c 499{
0756eb3c
PH
500int orvalue = 0;
501if (errno_value == ERRNO_CONNECTTIMEOUT)
502 {
503 errno_value = ETIMEDOUT;
504 orvalue = RTEF_CTOUT;
505 }
db3f7b69 506for (address_item * addr = addrlist; addr; addr = addr->next)
168dec3b 507 if (addr->transport_return >= PENDING)
447d236c 508 {
168dec3b
JH
509 addr->basic_errno = errno_value;
510 addr->more_errno |= orvalue;
02b41d71 511 if (msg)
168dec3b
JH
512 {
513 addr->message = msg;
514 if (pass_message) setflag(addr, af_pass_message);
515 }
516 addr->transport_return = rc;
517 if (host)
895fbaf2 518 {
168dec3b 519 addr->host_used = host;
895fbaf2
JH
520#ifdef EXPERIMENTAL_DSN_INFO
521 if (smtp_greeting)
522 {uschar * s = Ustrchr(smtp_greeting, '\n'); if (s) *s = '\0';}
523 addr->smtp_greeting = smtp_greeting;
524
525 if (helo_response)
526 {uschar * s = Ustrchr(helo_response, '\n'); if (s) *s = '\0';}
527 addr->helo_response = helo_response;
528#endif
529 }
447d236c 530 }
0756eb3c
PH
531}
532
895fbaf2
JH
533static void
534set_errno_nohost(address_item *addrlist, int errno_value, uschar *msg, int rc,
535 BOOL pass_message)
536{
537set_errno(addrlist, errno_value, msg, rc, pass_message, NULL
538#ifdef EXPERIMENTAL_DSN_INFO
539 , NULL, NULL
540#endif
541 );
542}
0756eb3c
PH
543
544
545/*************************************************
546* Check an SMTP response *
547*************************************************/
548
549/* This function is given an errno code and the SMTP response buffer
550to analyse, together with the host identification for generating messages. It
551sets an appropriate message and puts the first digit of the response code into
552the yield variable. If no response was actually read, a suitable digit is
553chosen.
554
555Arguments:
447d236c
PH
556 host the current host, to get its name for messages
557 errno_value pointer to the errno value
558 more_errno from the top address for use with ERRNO_FILTER_FAIL
559 buffer the SMTP response buffer
560 yield where to put a one-digit SMTP response code
4c04137d 561 message where to put an error message
447d236c
PH
562 pass_message set TRUE if message is an SMTP response
563
564Returns: TRUE if an SMTP "QUIT" command should be sent, else FALSE
0756eb3c
PH
565*/
566
a7538db1
JH
567static BOOL
568check_response(host_item *host, int *errno_value, int more_errno,
447d236c 569 uschar *buffer, int *yield, uschar **message, BOOL *pass_message)
0756eb3c 570{
0d9fa8c0 571uschar * pl = pipelining_active ? US"pipelined " : US"";
e9166683 572const uschar * s;
0756eb3c
PH
573
574*yield = '4'; /* Default setting is to give a temporary error */
575
e9166683 576switch(*errno_value)
0756eb3c 577 {
e9166683
JH
578 case ETIMEDOUT: /* Handle response timeout */
579 *message = US string_sprintf("SMTP timeout after %s%s",
580 pl, smtp_command);
581 if (transport_count > 0)
582 *message = US string_sprintf("%s (%d bytes written)", *message,
583 transport_count);
584 return FALSE;
585
586 case ERRNO_SMTPFORMAT: /* Handle malformed SMTP response */
587 s = string_printing(buffer);
588 while (isspace(*s)) s++;
589 *message = *s == 0
590 ? string_sprintf("Malformed SMTP reply (an empty line) "
591 "in response to %s%s", pl, smtp_command)
592 : string_sprintf("Malformed SMTP reply in response to %s%s: %s",
593 pl, smtp_command, s);
594 return FALSE;
595
596 case ERRNO_FILTER_FAIL: /* Handle a failed filter process error;
597 can't send QUIT as we mustn't end the DATA. */
598 *message = string_sprintf("transport filter process failed (%d)%s",
599 more_errno,
600 more_errno == EX_EXECFAILED ? ": unable to execute command" : "");
601 return FALSE;
602
603 case ERRNO_CHHEADER_FAIL: /* Handle a failed add_headers expansion;
604 can't send QUIT as we mustn't end the DATA. */
605 *message =
606 string_sprintf("failed to expand headers_add or headers_remove: %s",
607 expand_string_message);
608 return FALSE;
609
610 case ERRNO_WRITEINCOMPLETE: /* failure to write a complete data block */
611 *message = string_sprintf("failed to write a data block");
612 return FALSE;
0756eb3c 613
8c5d388a 614#ifdef SUPPORT_I18N
e9166683
JH
615 case ERRNO_UTF8_FWD: /* no advertised SMTPUTF8, for international message */
616 *message = US"utf8 support required but not offered for forwarding";
617 DEBUG(D_deliver|D_transport) debug_printf("%s\n", *message);
618 return TRUE;
250b6871 619#endif
e9166683 620 }
250b6871 621
0756eb3c
PH
622/* Handle error responses from the remote mailer. */
623
624if (buffer[0] != 0)
625 {
e9166683
JH
626 *message = string_sprintf("SMTP error from remote mail server after %s%s: "
627 "%s", pl, smtp_command, s = string_printing(buffer));
447d236c 628 *pass_message = TRUE;
0756eb3c
PH
629 *yield = buffer[0];
630 return TRUE;
631 }
632
633/* No data was read. If there is no errno, this must be the EOF (i.e.
19b9dc85
PH
634connection closed) case, which causes deferral. An explicit connection reset
635error has the same effect. Otherwise, put the host's identity in the message,
636leaving the errno value to be interpreted as well. In all cases, we have to
637assume the connection is now dead. */
0756eb3c 638
19b9dc85 639if (*errno_value == 0 || *errno_value == ECONNRESET)
0756eb3c
PH
640 {
641 *errno_value = ERRNO_SMTPCLOSED;
c562fd30 642 *message = US string_sprintf("Remote host closed connection "
02b41d71 643 "in response to %s%s", pl, smtp_command);
0756eb3c 644 }
de6273b4
JH
645else
646 *message = US string_sprintf("%s [%s]", host->name, host->address);
0756eb3c
PH
647
648return FALSE;
649}
650
651
652
653/*************************************************
654* Write error message to logs *
655*************************************************/
656
657/* This writes to the main log and to the message log.
658
659Arguments:
0756eb3c 660 host the current host
ec62d0a9
HSHR
661 detail the current message (addr_item->message)
662 basic_errno the errno (addr_item->basic_errno)
0756eb3c
PH
663
664Returns: nothing
665*/
666
667static void
ec62d0a9 668write_logs(const host_item *host, const uschar *suffix, int basic_errno)
0756eb3c 669{
52f12a7c
JH
670gstring * message = LOGGING(outgoing_port)
671 ? string_fmt_append(NULL, "H=%s [%s]:%d", host->name, host->address,
584ddd64 672 host->port == PORT_NONE ? 25 : host->port)
52f12a7c 673 : string_fmt_append(NULL, "H=%s [%s]", host->name, host->address);
c562fd30 674
ec62d0a9 675if (suffix)
0756eb3c 676 {
52f12a7c 677 message = string_fmt_append(message, ": %s", suffix);
ec62d0a9 678 if (basic_errno > 0)
52f12a7c 679 message = string_fmt_append(message, ": %s", strerror(basic_errno));
0756eb3c
PH
680 }
681else
52f12a7c 682 message = string_fmt_append(message, " %s", exim_errstr(basic_errno));
ec62d0a9 683
52f12a7c
JH
684log_write(0, LOG_MAIN, "%s", string_from_gstring(message));
685deliver_msglog("%s %s\n", tod_stamp(tod_log), message->s);
0756eb3c
PH
686}
687
c562fd30
JH
688static void
689msglog_line(host_item * host, uschar * message)
690{
37f3dc43
JH
691deliver_msglog("%s H=%s [%s] %s\n", tod_stamp(tod_log),
692 host->name, host->address, message);
c562fd30
JH
693}
694
0756eb3c
PH
695
696
0cbf2b82 697#ifndef DISABLE_EVENT
d68218c7
JH
698/*************************************************
699* Post-defer action *
700*************************************************/
701
702/* This expands an arbitrary per-transport string.
703 It might, for example, be used to write to the database log.
704
705Arguments:
d68218c7
JH
706 addr the address item containing error information
707 host the current host
708
709Returns: nothing
710*/
711
712static void
774ef2d7 713deferred_event_raise(address_item *addr, host_item *host)
d68218c7 714{
774ef2d7 715uschar * action = addr->transport->event_action;
55414b25 716const uschar * save_domain;
a7538db1
JH
717uschar * save_local;
718
d68218c7 719if (!action)
a7538db1 720 return;
d68218c7 721
a7538db1
JH
722save_domain = deliver_domain;
723save_local = deliver_localpart;
724
725/*XXX would ip & port already be set up? */
726deliver_host_address = string_copy(host->address);
774ef2d7
JH
727deliver_host_port = host->port == PORT_NONE ? 25 : host->port;
728event_defer_errno = addr->basic_errno;
d68218c7
JH
729
730router_name = addr->router->name;
731transport_name = addr->transport->name;
a7538db1
JH
732deliver_domain = addr->domain;
733deliver_localpart = addr->local_part;
734
774ef2d7 735(void) event_raise(action, US"msg:host:defer",
a7538db1
JH
736 addr->message
737 ? addr->basic_errno > 0
738 ? string_sprintf("%s: %s", addr->message, strerror(addr->basic_errno))
739 : string_copy(addr->message)
740 : addr->basic_errno > 0
741 ? string_copy(US strerror(addr->basic_errno))
742 : NULL);
743
744deliver_localpart = save_local;
745deliver_domain = save_domain;
d68218c7
JH
746router_name = transport_name = NULL;
747}
748#endif
749
ee8b8090
JH
750/*************************************************
751* Reap SMTP specific responses *
752*************************************************/
753static int
754smtp_discard_responses(smtp_context * sx, smtp_transport_options_block * ob,
755 int count)
756{
757uschar flushbuffer[4096];
758
759while (count-- > 0)
760 {
761 if (!smtp_read_response(sx, flushbuffer, sizeof(flushbuffer),
762 '2', ob->command_timeout)
763 && (errno != 0 || flushbuffer[0] == 0))
764 break;
765 }
766return count;
767}
768
769
770/* Return boolean success */
771
772static BOOL
773smtp_reap_banner(smtp_context * sx)
774{
775BOOL good_response = smtp_read_response(sx, sx->buffer, sizeof(sx->buffer),
776 '2', (SOB sx->conn_args.ob)->command_timeout);
777#ifdef EXPERIMENTAL_DSN_INFO
778sx->smtp_greeting = string_copy(sx->buffer);
779#endif
780return good_response;
781}
782
783static BOOL
784smtp_reap_ehlo(smtp_context * sx)
785{
786if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
787 (SOB sx->conn_args.ob)->command_timeout))
788 {
789 if (errno != 0 || sx->buffer[0] == 0 || sx->lmtp)
790 {
791#ifdef EXPERIMENTAL_DSN_INFO
792 sx->helo_response = string_copy(sx->buffer);
793#endif
794 return FALSE;
795 }
796 sx->esmtp = FALSE;
797 }
798#ifdef EXPERIMENTAL_DSN_INFO
799sx->helo_response = string_copy(sx->buffer);
800#endif
801return TRUE;
802}
803
804
805
806#ifdef EXPERIMENTAL_PIPE_CONNECT
807static uschar *
808ehlo_cache_key(const smtp_context * sx)
809{
810host_item * host = sx->conn_args.host;
811return Ustrchr(host->address, ':')
812 ? string_sprintf("[%s]:%d.EHLO", host->address,
813 host->port == PORT_NONE ? sx->port : host->port)
814 : string_sprintf("%s:%d.EHLO", host->address,
815 host->port == PORT_NONE ? sx->port : host->port);
816}
817
818static void
819write_ehlo_cache_entry(const smtp_context * sx)
820{
821open_db dbblock, * dbm_file;
822
823if ((dbm_file = dbfn_open(US"misc", O_RDWR, &dbblock, TRUE)))
824 {
825 uschar * ehlo_resp_key = ehlo_cache_key(sx);
826 dbdata_ehlo_resp er = { .data = sx->ehlo_resp };
827
828 dbfn_write(dbm_file, ehlo_resp_key, &er, (int)sizeof(er));
829 dbfn_close(dbm_file);
830 }
831}
832
833static void
834invalidate_ehlo_cache_entry(smtp_context * sx)
835{
836open_db dbblock, * dbm_file;
837
838if ( sx->early_pipe_active
839 && (dbm_file = dbfn_open(US"misc", O_RDWR, &dbblock, TRUE)))
840 {
841 uschar * ehlo_resp_key = ehlo_cache_key(sx);
842 dbfn_delete(dbm_file, ehlo_resp_key);
843 dbfn_close(dbm_file);
844 }
845}
846
847static BOOL
848read_ehlo_cache_entry(smtp_context * sx)
849{
850open_db dbblock;
851open_db * dbm_file;
852
853if (!(dbm_file = dbfn_open(US"misc", O_RDONLY, &dbblock, FALSE)))
854 { DEBUG(D_transport) debug_printf("ehlo-cache: no misc DB\n"); }
855else
856 {
857 uschar * ehlo_resp_key = ehlo_cache_key(sx);
858 dbdata_ehlo_resp * er;
859
860 if (!(er = dbfn_read(dbm_file, ehlo_resp_key)))
861 { DEBUG(D_transport) debug_printf("no ehlo-resp record\n"); }
862 else if (time(NULL) - er->time_stamp > retry_data_expire)
863 {
864 DEBUG(D_transport) debug_printf("ehlo-resp record too old\n");
865 dbfn_close(dbm_file);
866 if ((dbm_file = dbfn_open(US"misc", O_RDWR, &dbblock, TRUE)))
867 dbfn_delete(dbm_file, ehlo_resp_key);
868 }
869 else
870 {
871 sx->ehlo_resp = er->data;
872 dbfn_close(dbm_file);
873 DEBUG(D_transport) debug_printf(
874 "EHLO response bits from cache: cleartext 0x%04x crypted 0x%04x\n",
875 er->data.cleartext_features, er->data.crypted_features);
876 return TRUE;
877 }
878 dbfn_close(dbm_file);
879 }
880return FALSE;
881}
882
883
884
885/* Return an auths bitmap for the set of AUTH methods offered by the server
886which match our authenticators. */
887
888static unsigned short
889study_ehlo_auths(smtp_context * sx)
890{
891uschar * names;
892auth_instance * au;
893uschar authnum;
894unsigned short authbits = 0;
895
896if (!sx->esmtp) return 0;
897if (!regex_AUTH) regex_AUTH = regex_must_compile(AUTHS_REGEX, FALSE, TRUE);
898if (!regex_match_and_setup(regex_AUTH, sx->buffer, 0, -1)) return 0;
899expand_nmax = -1; /* reset */
900names = string_copyn(expand_nstring[1], expand_nlength[1]);
901
902for (au = auths, authnum = 0; au; au = au->next, authnum++) if (au->client)
903 {
904 const uschar * list = names;
905 int sep = ' ';
906 uschar name[32];
907
908 while (string_nextinlist(&list, &sep, name, sizeof(name)))
909 if (strcmpic(au->public_name, name) == 0)
910 { authbits |= BIT(authnum); break; }
911 }
912
913DEBUG(D_transport)
914 debug_printf("server offers %s AUTH, methods '%s', bitmap 0x%04x\n",
915 tls_out.active.sock >= 0 ? "crypted" : "plaintext", names, authbits);
916
917if (tls_out.active.sock >= 0)
918 sx->ehlo_resp.crypted_auths = authbits;
919else
920 sx->ehlo_resp.cleartext_auths = authbits;
921return authbits;
922}
923
924
925
926
927/* Wait for and check responses for early-pipelining.
928
929Called from the lower-level smtp_read_response() function
930used for general code that assume synchronisation, if context
931flags indicate outstanding early-pipelining commands. Also
932called fom sync_responses() which handles pipelined commands.
933
934Arguments:
935 sx smtp connection context
936 countp number of outstanding responses, adjusted on return
937
938Return:
939 OK all well
940 FAIL SMTP error in response
941*/
942int
943smtp_reap_early_pipe(smtp_context * sx, int * countp)
944{
945BOOL pending_BANNER = sx->pending_BANNER;
946BOOL pending_EHLO = sx->pending_EHLO;
947
948sx->pending_BANNER = FALSE; /* clear early to avoid recursion */
949sx->pending_EHLO = FALSE;
950
951if (pending_BANNER)
952 {
953 DEBUG(D_transport) debug_printf("%s expect banner\n", __FUNCTION__);
954 (*countp)--;
955 if (!smtp_reap_banner(sx))
956 {
957 DEBUG(D_transport) debug_printf("bad banner\n");
958 goto fail;
959 }
960 }
961
962if (pending_EHLO)
963 {
964 unsigned peer_offered;
965 unsigned short authbits = 0, * ap;
966
967 DEBUG(D_transport) debug_printf("%s expect ehlo\n", __FUNCTION__);
968 (*countp)--;
969 if (!smtp_reap_ehlo(sx))
970 {
971 DEBUG(D_transport) debug_printf("bad response for EHLO\n");
972 goto fail;
973 }
974
975 /* Compare the actual EHLO response to the cached value we assumed;
976 on difference, dump or rewrite the cache and arrange for a retry. */
977
978 ap = tls_out.active.sock < 0
979 ? &sx->ehlo_resp.cleartext_auths : &sx->ehlo_resp.crypted_auths;
980
981 peer_offered = ehlo_response(sx->buffer,
982 (tls_out.active.sock < 0 ? OPTION_TLS : OPTION_REQUIRETLS)
983 | OPTION_CHUNKING | OPTION_PRDR | OPTION_DSN | OPTION_PIPE | OPTION_SIZE
984 | OPTION_UTF8 | OPTION_EARLY_PIPE
985 );
986 if ( peer_offered != sx->peer_offered
987 || (authbits = study_ehlo_auths(sx)) != *ap)
988 {
989 HDEBUG(D_transport)
990 debug_printf("EHLO extensions changed, 0x%04x/0x%04x -> 0x%04x/0x%04x\n",
991 sx->peer_offered, *ap, peer_offered, authbits);
992 *ap = authbits;
993 if (peer_offered & OPTION_EARLY_PIPE)
994 write_ehlo_cache_entry(sx);
995 else
996 invalidate_ehlo_cache_entry(sx);
997
998 return OK; /* just carry on */
999 }
1000 }
1001return OK;
1002
1003fail:
1004 invalidate_ehlo_cache_entry(sx);
1005 (void) smtp_discard_responses(sx, sx->conn_args.ob, *countp);
1006 return FAIL;
1007}
1008#endif
1009
1010
0756eb3c
PH
1011/*************************************************
1012* Synchronize SMTP responses *
1013*************************************************/
1014
1015/* This function is called from smtp_deliver() to receive SMTP responses from
1016the server, and match them up with the commands to which they relate. When
1017PIPELINING is not in use, this function is called after every command, and is
1018therefore somewhat over-engineered, but it is simpler to use a single scheme
1019that works both with and without PIPELINING instead of having two separate sets
1020of code.
1021
1022The set of commands that are buffered up with pipelining may start with MAIL
1023and may end with DATA; in between are RCPT commands that correspond to the
1024addresses whose status is PENDING_DEFER. All other commands (STARTTLS, AUTH,
1025etc.) are never buffered.
1026
1027Errors after MAIL or DATA abort the whole process leaving the response in the
1028buffer. After MAIL, pending responses are flushed, and the original command is
1029re-instated in big_buffer for error messages. For RCPT commands, the remote is
1030permitted to reject some recipient addresses while accepting others. However
1031certain errors clearly abort the whole process. Set the value in
1032transport_return to PENDING_OK if the address is accepted. If there is a
1033subsequent general error, it will get reset accordingly. If not, it will get
1034converted to OK at the end.
1035
1036Arguments:
df5b41e3 1037 sx smtp connection context
48c7f9e2 1038 count the number of responses to read
48c7f9e2
PH
1039 pending_DATA 0 if last command sent was not DATA
1040 +1 if previously had a good recipient
1041 -1 if not previously had a good recipient
0756eb3c
PH
1042
1043Returns: 3 if at least one address had 2xx and one had 5xx
1044 2 if at least one address had 5xx but none had 2xx
1045 1 if at least one host had a 2xx response, but none had 5xx
1046 0 no address had 2xx or 5xx but no errors (all 4xx, or just DATA)
1047 -1 timeout while reading RCPT response
1048 -2 I/O or other non-response error for RCPT
1049 -3 DATA or MAIL failed - errno and buffer set
ee8b8090 1050 -4 banner or EHLO failed (early-pipelining)
0756eb3c
PH
1051*/
1052
1053static int
df5b41e3 1054sync_responses(smtp_context * sx, int count, int pending_DATA)
0756eb3c 1055{
ee8b8090
JH
1056address_item * addr = sx->sync_addr;
1057smtp_transport_options_block * ob = sx->conn_args.ob;
0756eb3c
PH
1058int yield = 0;
1059
ee8b8090
JH
1060#ifdef EXPERIMENTAL_PIPE_CONNECT
1061if (smtp_reap_early_pipe(sx, &count) != OK)
1062 return -4;
1063#endif
1064
0756eb3c
PH
1065/* Handle the response for a MAIL command. On error, reinstate the original
1066command in big_buffer for error message use, and flush any further pending
1067responses before returning, except after I/O errors and timeouts. */
1068
df5b41e3 1069if (sx->pending_MAIL)
0756eb3c 1070 {
7c576fca 1071 DEBUG(D_transport) debug_printf("%s expect mail\n", __FUNCTION__);
0756eb3c 1072 count--;
251b9eb4 1073 if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer),
e9166683 1074 '2', ob->command_timeout))
0756eb3c 1075 {
e027f545 1076 DEBUG(D_transport) debug_printf("bad response for MAIL\n");
0756eb3c 1077 Ustrcpy(big_buffer, mail_command); /* Fits, because it came from there! */
df5b41e3 1078 if (errno == 0 && sx->buffer[0] != 0)
0756eb3c 1079 {
e97957bc 1080 int save_errno = 0;
df5b41e3 1081 if (sx->buffer[0] == '4')
e97957bc
PH
1082 {
1083 save_errno = ERRNO_MAIL4XX;
df5b41e3 1084 addr->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
e97957bc 1085 }
ee8b8090 1086 count = smtp_discard_responses(sx, ob, count);
e97957bc 1087 errno = save_errno;
0756eb3c 1088 }
c562fd30
JH
1089
1090 if (pending_DATA) count--; /* Number of RCPT responses to come */
1091 while (count-- > 0) /* Mark any pending addrs with the host used */
1092 {
1093 while (addr->transport_return != PENDING_DEFER) addr = addr->next;
ee8b8090 1094 addr->host_used = sx->conn_args.host;
c562fd30
JH
1095 addr = addr->next;
1096 }
0756eb3c
PH
1097 return -3;
1098 }
1099 }
1100
1101if (pending_DATA) count--; /* Number of RCPT responses to come */
1102
1103/* Read and handle the required number of RCPT responses, matching each one up
1104with an address by scanning for the next address whose status is PENDING_DEFER.
1105*/
1106
1107while (count-- > 0)
1108 {
4c2471ca
JH
1109 while (addr->transport_return != PENDING_DEFER)
1110 if (!(addr = addr->next))
1111 return -2;
0756eb3c
PH
1112
1113 /* The address was accepted */
ee8b8090 1114 addr->host_used = sx->conn_args.host;
0756eb3c 1115
7c576fca 1116 DEBUG(D_transport) debug_printf("%s expect rcpt\n", __FUNCTION__);
251b9eb4 1117 if (smtp_read_response(sx, sx->buffer, sizeof(sx->buffer),
e9166683 1118 '2', ob->command_timeout))
0756eb3c
PH
1119 {
1120 yield |= 1;
1121 addr->transport_return = PENDING_OK;
1122
1123 /* If af_dr_retry_exists is set, there was a routing delay on this address;
09945f1e
PH
1124 ensure that any address-specific retry record is expunged. We do this both
1125 for the basic key and for the version that also includes the sender. */
0756eb3c
PH
1126
1127 if (testflag(addr, af_dr_retry_exists))
09945f1e
PH
1128 {
1129 uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
1130 sender_address);
1131 retry_add_item(addr, altkey, rf_delete);
0756eb3c 1132 retry_add_item(addr, addr->address_retry_key, rf_delete);
09945f1e 1133 }
0756eb3c
PH
1134 }
1135
1136 /* Timeout while reading the response */
1137
1138 else if (errno == ETIMEDOUT)
1139 {
c562fd30 1140 uschar *message = string_sprintf("SMTP timeout after RCPT TO:<%s>",
ee8b8090 1141 transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes));
df5b41e3 1142 set_errno_nohost(sx->first_addr, ETIMEDOUT, message, DEFER, FALSE);
0756eb3c 1143 retry_add_item(addr, addr->address_retry_key, 0);
f6c332bd 1144 update_waiting = FALSE;
0756eb3c
PH
1145 return -1;
1146 }
1147
1148 /* Handle other errors in obtaining an SMTP response by returning -1. This
1149 will cause all the addresses to be deferred. Restore the SMTP command in
1150 big_buffer for which we are checking the response, so the error message
1151 makes sense. */
1152
df5b41e3 1153 else if (errno != 0 || sx->buffer[0] == 0)
0756eb3c
PH
1154 {
1155 string_format(big_buffer, big_buffer_size, "RCPT TO:<%s>",
ee8b8090 1156 transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes));
0756eb3c
PH
1157 return -2;
1158 }
1159
1160 /* Handle SMTP permanent and temporary response codes. */
1161
1162 else
1163 {
1164 addr->message =
447d236c 1165 string_sprintf("SMTP error from remote mail server after RCPT TO:<%s>: "
ee8b8090 1166 "%s", transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes),
df5b41e3 1167 string_printing(sx->buffer));
447d236c 1168 setflag(addr, af_pass_message);
e9166683 1169 if (!sx->verify)
ee8b8090 1170 msglog_line(sx->conn_args.host, addr->message);
0756eb3c
PH
1171
1172 /* The response was 5xx */
1173
df5b41e3 1174 if (sx->buffer[0] == '5')
0756eb3c
PH
1175 {
1176 addr->transport_return = FAIL;
1177 yield |= 2;
1178 }
1179
1180 /* The response was 4xx */
1181
1182 else
1183 {
0756eb3c
PH
1184 addr->transport_return = DEFER;
1185 addr->basic_errno = ERRNO_RCPT4XX;
df5b41e3 1186 addr->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
0756eb3c 1187
e9166683
JH
1188 if (!sx->verify)
1189 {
0cbf2b82 1190#ifndef DISABLE_EVENT
e9166683
JH
1191 event_defer_errno = addr->more_errno;
1192 msg_event_raise(US"msg:rcpt:host:defer", addr);
5ef5dd52
JB
1193#endif
1194
e9166683
JH
1195 /* Log temporary errors if there are more hosts to be tried.
1196 If not, log this last one in the == line. */
0756eb3c 1197
ee8b8090 1198 if (sx->conn_args.host->next)
67ea939c
JH
1199 if (LOGGING(outgoing_port))
1200 log_write(0, LOG_MAIN, "H=%s [%s]:%d %s", sx->conn_args.host->name,
1201 sx->conn_args.host->address,
1202 sx->port == PORT_NONE ? 25 : sx->port, addr->message);
1203 else
1204 log_write(0, LOG_MAIN, "H=%s [%s]: %s", sx->conn_args.host->name,
1205 sx->conn_args.host->address, addr->message);
0756eb3c 1206
0cbf2b82 1207#ifndef DISABLE_EVENT
e9166683
JH
1208 else
1209 msg_event_raise(US"msg:rcpt:defer", addr);
5ef5dd52
JB
1210#endif
1211
e9166683
JH
1212 /* Do not put this message on the list of those waiting for specific
1213 hosts, as otherwise it is likely to be tried too often. */
0756eb3c 1214
e9166683 1215 update_waiting = FALSE;
0756eb3c 1216
e9166683
JH
1217 /* Add a retry item for the address so that it doesn't get tried again
1218 too soon. If address_retry_include_sender is true, add the sender address
1219 to the retry key. */
0756eb3c 1220
e9166683
JH
1221 retry_add_item(addr,
1222 ob->address_retry_include_sender
1223 ? string_sprintf("%s:<%s>", addr->address_retry_key, sender_address)
1224 : addr->address_retry_key,
1225 0);
1226 }
0756eb3c
PH
1227 }
1228 }
1229 } /* Loop for next RCPT response */
1230
1231/* Update where to start at for the next block of responses, unless we
1232have already handled all the addresses. */
1233
e9166683 1234if (addr) sx->sync_addr = addr->next;
0756eb3c
PH
1235
1236/* Handle a response to DATA. If we have not had any good recipients, either
1237previously or in this block, the response is ignored. */
1238
7c576fca 1239if (pending_DATA != 0)
0756eb3c 1240 {
7c576fca 1241 DEBUG(D_transport) debug_printf("%s expect data\n", __FUNCTION__);
251b9eb4 1242 if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer),
7c576fca 1243 '3', ob->command_timeout))
e97957bc 1244 {
7c576fca
JH
1245 int code;
1246 uschar *msg;
1247 BOOL pass_message;
1248 if (pending_DATA > 0 || (yield & 1) != 0)
e97957bc 1249 {
7c576fca
JH
1250 if (errno == 0 && sx->buffer[0] == '4')
1251 {
1252 errno = ERRNO_DATA4XX;
1253 sx->first_addr->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
1254 }
1255 return -3;
e97957bc 1256 }
ee8b8090 1257 (void)check_response(sx->conn_args.host, &errno, 0, sx->buffer, &code, &msg, &pass_message);
7c576fca
JH
1258 DEBUG(D_transport) debug_printf("%s\nerror for DATA ignored: pipelining "
1259 "is in use and there were no good recipients\n", msg);
e97957bc 1260 }
0756eb3c
PH
1261 }
1262
1263/* All responses read and handled; MAIL (if present) received 2xx and DATA (if
1264present) received 3xx. If any RCPTs were handled and yielded anything other
1265than 4xx, yield will be set non-zero. */
1266
1267return yield;
1268}
1269
1270
1271
ee8b8090
JH
1272
1273
1274/* Try an authenticator's client entry */
1275
1276static int
1277try_authenticator(smtp_context * sx, auth_instance * au)
1278{
1279smtp_transport_options_block * ob = sx->conn_args.ob; /* transport options */
1280host_item * host = sx->conn_args.host; /* host to deliver to */
1281int rc;
1282
1283sx->outblock.authenticating = TRUE;
1284rc = (au->info->clientcode)(au, sx, ob->command_timeout,
1285 sx->buffer, sizeof(sx->buffer));
1286sx->outblock.authenticating = FALSE;
1287DEBUG(D_transport) debug_printf("%s authenticator yielded %d\n", au->name, rc);
1288
1289/* A temporary authentication failure must hold up delivery to
1290this host. After a permanent authentication failure, we carry on
1291to try other authentication methods. If all fail hard, try to
1292deliver the message unauthenticated unless require_auth was set. */
1293
1294switch(rc)
1295 {
1296 case OK:
1297 f.smtp_authenticated = TRUE; /* stops the outer loop */
1298 client_authenticator = au->name;
1299 if (au->set_client_id)
1300 client_authenticated_id = expand_string(au->set_client_id);
1301 break;
1302
1303 /* Failure after writing a command */
1304
1305 case FAIL_SEND:
1306 return FAIL_SEND;
1307
1308 /* Failure after reading a response */
1309
1310 case FAIL:
1311 if (errno != 0 || sx->buffer[0] != '5') return FAIL;
1312 log_write(0, LOG_MAIN, "%s authenticator failed H=%s [%s] %s",
1313 au->name, host->name, host->address, sx->buffer);
1314 break;
1315
1316 /* Failure by some other means. In effect, the authenticator
1317 decided it wasn't prepared to handle this case. Typically this
1318 is the result of "fail" in an expansion string. Do we need to
1319 log anything here? Feb 2006: a message is now put in the buffer
1320 if logging is required. */
1321
1322 case CANCELLED:
1323 if (*sx->buffer != 0)
1324 log_write(0, LOG_MAIN, "%s authenticator cancelled "
1325 "authentication H=%s [%s] %s", au->name, host->name,
1326 host->address, sx->buffer);
1327 break;
1328
1329 /* Internal problem, message in buffer. */
1330
1331 case ERROR:
1332 set_errno_nohost(sx->addrlist, ERRNO_AUTHPROB, string_copy(sx->buffer),
1333 DEFER, FALSE);
1334 return ERROR;
1335 }
1336return OK;
1337}
1338
1339
1340
1341
1342/* Do the client side of smtp-level authentication.
1343
fcc8e047 1344Arguments:
ee8b8090
JH
1345 sx smtp connection context
1346
1347sx->buffer should have the EHLO response from server (gets overwritten)
fcc8e047
JH
1348
1349Returns:
1350 OK Success, or failed (but not required): global "smtp_authenticated" set
1351 DEFER Failed authentication (and was required)
1352 ERROR Internal problem
1353
1354 FAIL_SEND Failed communications - transmit
1355 FAIL - response
1356*/
1357
251b9eb4 1358static int
ee8b8090 1359smtp_auth(smtp_context * sx)
fcc8e047 1360{
ee8b8090
JH
1361host_item * host = sx->conn_args.host; /* host to deliver to */
1362smtp_transport_options_block * ob = sx->conn_args.ob; /* transport options */
1363int require_auth = verify_check_given_host(CUSS &ob->hosts_require_auth, host);
1364#ifdef EXPERIMENTAL_PIPE_CONNECT
1365unsigned short authbits = tls_out.active.sock >= 0
1366 ? sx->ehlo_resp.crypted_auths : sx->ehlo_resp.cleartext_auths;
1367#endif
1368uschar * fail_reason = US"server did not advertise AUTH support";
fcc8e047 1369
8768d548 1370f.smtp_authenticated = FALSE;
a7538db1 1371client_authenticator = client_authenticated_id = client_authenticated_sender = NULL;
fcc8e047 1372
ee8b8090
JH
1373if (!regex_AUTH)
1374 regex_AUTH = regex_must_compile(AUTHS_REGEX, FALSE, TRUE);
1375
1376/* Is the server offering AUTH? */
fcc8e047 1377
ee8b8090
JH
1378if ( sx->esmtp
1379 &&
1380#ifdef EXPERIMENTAL_PIPE_CONNECT
1381 sx->early_pipe_active ? authbits
1382 :
1383#endif
1384 regex_match_and_setup(regex_AUTH, sx->buffer, 0, -1)
1385 )
a7538db1 1386 {
ee8b8090 1387 uschar * names = NULL;
a7538db1 1388 expand_nmax = -1; /* reset */
fcc8e047 1389
ee8b8090
JH
1390#ifdef EXPERIMENTAL_PIPE_CONNECT
1391 if (!sx->early_pipe_active)
1392#endif
1393 names = string_copyn(expand_nstring[1], expand_nlength[1]);
1394
a7538db1 1395 /* Must not do this check until after we have saved the result of the
ee8b8090 1396 regex match above as the check could be another RE. */
fcc8e047 1397
ee8b8090
JH
1398 if ( require_auth == OK
1399 || verify_check_given_host(CUSS &ob->hosts_try_auth, host) == OK)
a7538db1 1400 {
ee8b8090 1401 auth_instance * au;
fcc8e047 1402
a7538db1 1403 DEBUG(D_transport) debug_printf("scanning authentication mechanisms\n");
ee8b8090
JH
1404 fail_reason = US"no common mechanisms were found";
1405
1406#ifdef EXPERIMENTAL_PIPE_CONNECT
1407 if (sx->early_pipe_active)
1408 {
1409 /* Scan our authenticators (which support use by a client and were offered
1410 by the server (checked at cache-write time)), not suppressed by
1411 client_condition. If one is found, attempt to authenticate by calling its
1412 client function. We are limited to supporting up to 16 authenticator
1413 public-names by the number of bits in a short. */
1414
1415 uschar bitnum;
1416 int rc;
1417
1418 for (bitnum = 0, au = auths;
1419 !f.smtp_authenticated && au && bitnum < 16;
1420 bitnum++, au = au->next) if (authbits & BIT(bitnum))
1421 {
1422 if ( au->client_condition
1423 && !expand_check_condition(au->client_condition, au->name,
1424 US"client authenticator"))
1425 {
1426 DEBUG(D_transport) debug_printf("skipping %s authenticator: %s\n",
1427 au->name, "client_condition is false");
1428 continue;
1429 }
1430
1431 /* Found data for a listed mechanism. Call its client entry. Set
1432 a flag in the outblock so that data is overwritten after sending so
1433 that reflections don't show it. */
1434
1435 fail_reason = US"authentication attempt(s) failed";
1436
1437 if ((rc = try_authenticator(sx, au)) != OK)
1438 return rc;
1439 }
1440 }
1441 else
1442#endif
fcc8e047 1443
a7538db1
JH
1444 /* Scan the configured authenticators looking for one which is configured
1445 for use as a client, which is not suppressed by client_condition, and
1446 whose name matches an authentication mechanism supported by the server.
1447 If one is found, attempt to authenticate by calling its client function.
1448 */
fcc8e047 1449
db3f7b69 1450 for (auth_instance * au = auths; !f.smtp_authenticated && au; au = au->next)
a7538db1
JH
1451 {
1452 uschar *p = names;
ee8b8090
JH
1453
1454 if ( !au->client
1455 || ( au->client_condition
1456 && !expand_check_condition(au->client_condition, au->name,
1457 US"client authenticator")))
a7538db1
JH
1458 {
1459 DEBUG(D_transport) debug_printf("skipping %s authenticator: %s\n",
1460 au->name,
1461 (au->client)? "client_condition is false" :
1462 "not configured as a client");
1463 continue;
1464 }
fcc8e047 1465
a7538db1 1466 /* Loop to scan supported server mechanisms */
fcc8e047 1467
cab0c277 1468 while (*p)
a7538db1 1469 {
a7538db1 1470 int len = Ustrlen(au->public_name);
ee8b8090
JH
1471 int rc;
1472
a7538db1 1473 while (isspace(*p)) p++;
fcc8e047 1474
a7538db1
JH
1475 if (strncmpic(au->public_name, p, len) != 0 ||
1476 (p[len] != 0 && !isspace(p[len])))
1477 {
1478 while (*p != 0 && !isspace(*p)) p++;
1479 continue;
1480 }
fcc8e047 1481
a7538db1
JH
1482 /* Found data for a listed mechanism. Call its client entry. Set
1483 a flag in the outblock so that data is overwritten after sending so
1484 that reflections don't show it. */
fcc8e047 1485
a7538db1 1486 fail_reason = US"authentication attempt(s) failed";
a7538db1 1487
ee8b8090
JH
1488 if ((rc = try_authenticator(sx, au)) != OK)
1489 return rc;
fcc8e047 1490
a7538db1
JH
1491 break; /* If not authenticated, try next authenticator */
1492 } /* Loop for scanning supported server mechanisms */
1493 } /* Loop for further authenticators */
fcc8e047 1494 }
a7538db1 1495 }
fcc8e047 1496
a7538db1 1497/* If we haven't authenticated, but are required to, give up. */
fcc8e047 1498
8768d548 1499if (require_auth == OK && !f.smtp_authenticated)
a7538db1 1500 {
251b9eb4 1501 set_errno_nohost(sx->addrlist, ERRNO_AUTHFAIL,
a7538db1 1502 string_sprintf("authentication required but %s", fail_reason), DEFER,
895fbaf2 1503 FALSE);
a7538db1
JH
1504 return DEFER;
1505 }
4d8d62b9 1506
a7538db1 1507return OK;
fcc8e047
JH
1508}
1509
1510
1511/* Construct AUTH appendix string for MAIL TO */
1512/*
1513Arguments
1514 buffer to build string
1515 addrlist chain of potential addresses to deliver
1516 ob transport options
1517
8768d548 1518Globals f.smtp_authenticated
fcc8e047
JH
1519 client_authenticated_sender
1520Return True on error, otherwise buffer has (possibly empty) terminated string
1521*/
1522
1523BOOL
1524smtp_mail_auth_str(uschar *buffer, unsigned bufsize, address_item *addrlist,
1525 smtp_transport_options_block *ob)
1526{
1527uschar *local_authenticated_sender = authenticated_sender;
1528
1529#ifdef notdef
8768d548 1530 debug_printf("smtp_mail_auth_str: as<%s> os<%s> SA<%s>\n", authenticated_sender, ob->authenticated_sender, f.smtp_authenticated?"Y":"N");
fcc8e047
JH
1531#endif
1532
1533if (ob->authenticated_sender != NULL)
1534 {
1535 uschar *new = expand_string(ob->authenticated_sender);
1536 if (new == NULL)
1537 {
8768d548 1538 if (!f.expand_string_forcedfail)
fcc8e047
JH
1539 {
1540 uschar *message = string_sprintf("failed to expand "
1541 "authenticated_sender: %s", expand_string_message);
895fbaf2 1542 set_errno_nohost(addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE);
fcc8e047
JH
1543 return TRUE;
1544 }
1545 }
1546 else if (new[0] != 0) local_authenticated_sender = new;
1547 }
1548
1549/* Add the authenticated sender address if present */
1550
8768d548 1551if ((f.smtp_authenticated || ob->authenticated_sender_force) &&
fcc8e047
JH
1552 local_authenticated_sender != NULL)
1553 {
1554 string_format(buffer, bufsize, " AUTH=%s",
1555 auth_xtextencode(local_authenticated_sender,
1556 Ustrlen(local_authenticated_sender)));
1557 client_authenticated_sender = string_copy(local_authenticated_sender);
1558 }
1559else
1560 *buffer= 0;
1561
1562return FALSE;
1563}
1564
1565
1566
c0635b6d 1567#ifdef SUPPORT_DANE
2d5fdd53
JH
1568/* Lookup TLSA record for host/port.
1569Return: OK success with dnssec; DANE mode
1570 DEFER Do not use this host now, may retry later
1571 FAIL_FORCED No TLSA record; DANE not usable
1572 FAIL Do not use this connection
1573*/
1574
0e66b3b6 1575int
4b0fe319 1576tlsa_lookup(const host_item * host, dns_answer * dnsa, BOOL dane_required)
0e66b3b6
JH
1577{
1578/* move this out to host.c given the similarity to dns_lookup() ? */
1579uschar buffer[300];
55414b25 1580const uschar * fullname = buffer;
58c30e47
JH
1581int rc;
1582BOOL sec;
0e66b3b6
JH
1583
1584/* TLSA lookup string */
1585(void)sprintf(CS buffer, "_%d._tcp.%.256s", host->port, host->name);
1586
58c30e47
JH
1587rc = dns_lookup(dnsa, buffer, T_TLSA, &fullname);
1588sec = dns_is_secure(dnsa);
1589DEBUG(D_transport)
1590 debug_printf("TLSA lookup ret %d %sDNSSEC\n", rc, sec ? "" : "not ");
1591
1592switch (rc)
0e66b3b6 1593 {
2d5fdd53
JH
1594 case DNS_AGAIN:
1595 return DEFER; /* just defer this TLS'd conn */
1596
899b8bbc 1597 case DNS_SUCCEED:
624f33df
JH
1598 if (sec)
1599 {
1600 DEBUG(D_transport)
1601 {
1602 dns_scan dnss;
db3f7b69 1603 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
1b76ad22
JH
1604 rr = dns_next_rr(dnsa, &dnss, RESET_NEXT))
1605 if (rr->type == T_TLSA && rr->size > 3)
1606 {
1607 uint16_t payload_length = rr->size - 3;
1608 uschar s[MAX_TLSA_EXPANDED_SIZE], * sp = s, * p = US rr->data;
1609
1610 sp += sprintf(CS sp, "%d ", *p++); /* usage */
1611 sp += sprintf(CS sp, "%d ", *p++); /* selector */
1612 sp += sprintf(CS sp, "%d ", *p++); /* matchtype */
1613 while (payload_length-- > 0 && sp-s < (MAX_TLSA_EXPANDED_SIZE - 4))
1614 sp += sprintf(CS sp, "%02x", *p++);
1615
1616 debug_printf(" %s\n", s);
1617 }
624f33df
JH
1618 }
1619 return OK;
1620 }
899b8bbc
JH
1621 log_write(0, LOG_MAIN,
1622 "DANE error: TLSA lookup for %s not DNSSEC", host->name);
1623 /*FALLTRHOUGH*/
1624
ef3a1a30
JH
1625 case DNS_NODATA: /* no TLSA RR for this lookup */
1626 case DNS_NOMATCH: /* no records at all for this lookup */
6b524204 1627 return dane_required ? FAIL : FAIL_FORCED;
2d5fdd53
JH
1628
1629 default:
1630 case DNS_FAIL:
1631 return dane_required ? FAIL : DEFER;
0e66b3b6 1632 }
0e66b3b6
JH
1633}
1634#endif
1635
1636
a39bd74d
JB
1637
1638typedef struct smtp_compare_s
1639{
1640 uschar *current_sender_address;
1641 struct transport_instance *tblock;
1642} smtp_compare_t;
1643
d093f8e5
JH
1644
1645/* Create a unique string that identifies this message, it is based on
1646sender_address, helo_data and tls_certificate if enabled.
1647*/
a39bd74d
JB
1648
1649static uschar *
1650smtp_local_identity(uschar * sender, struct transport_instance * tblock)
1651{
1652address_item * addr1;
1653uschar * if1 = US"";
1654uschar * helo1 = US"";
1655#ifdef SUPPORT_TLS
1656uschar * tlsc1 = US"";
1657#endif
1658uschar * save_sender_address = sender_address;
1659uschar * local_identity = NULL;
ee8b8090 1660smtp_transport_options_block * ob = SOB tblock->options_block;
a39bd74d
JB
1661
1662sender_address = sender;
1663
1664addr1 = deliver_make_addr (sender, TRUE);
1665deliver_set_expansions(addr1);
1666
1667if (ob->interface)
1668 if1 = expand_string(ob->interface);
1669
1670if (ob->helo_data)
1671 helo1 = expand_string(ob->helo_data);
1672
1673#ifdef SUPPORT_TLS
1674if (ob->tls_certificate)
1675 tlsc1 = expand_string(ob->tls_certificate);
1676local_identity = string_sprintf ("%s^%s^%s", if1, helo1, tlsc1);
1677#else
1678local_identity = string_sprintf ("%s^%s", if1, helo1);
1679#endif
1680
1681deliver_set_expansions(NULL);
1682sender_address = save_sender_address;
1683
1684return local_identity;
1685}
1686
1687
1688
1689/* This routine is a callback that is called from transport_check_waiting.
1690This function will evaluate the incoming message versus the previous
1691message. If the incoming message is using a different local identity then
1692we will veto this new message. */
1693
1694static BOOL
1695smtp_are_same_identities(uschar * message_id, smtp_compare_t * s_compare)
1696{
dadff1d4
HSHR
1697uschar * message_local_identity,
1698 * current_local_identity,
1699 * new_sender_address;
1700
1701current_local_identity =
a39bd74d 1702 smtp_local_identity(s_compare->current_sender_address, s_compare->tblock);
a39bd74d 1703
dadff1d4
HSHR
1704if (!(new_sender_address = deliver_get_sender_address(message_id)))
1705 return 0;
1706
1707message_local_identity =
1708 smtp_local_identity(new_sender_address, s_compare->tblock);
a39bd74d
JB
1709
1710return Ustrcmp(current_local_identity, message_local_identity) == 0;
1711}
1712
1713
1714
8ac90765
JH
1715static unsigned
1716ehlo_response(uschar * buf, unsigned checks)
9094b84b 1717{
e9166683
JH
1718size_t bsize = Ustrlen(buf);
1719
ee8b8090 1720/* debug_printf("%s: check for 0x%04x\n", __FUNCTION__, checks); */
8ac90765 1721
ee8b8090 1722#ifdef SUPPORT_TLS
8ac90765
JH
1723# ifdef EXPERIMENTAL_REQUIRETLS
1724if ( checks & OPTION_REQUIRETLS
1725 && pcre_exec(regex_REQUIRETLS, NULL, CS buf,bsize, 0, PCRE_EOPT, NULL,0) < 0)
8ac90765 1726# endif
ee8b8090
JH
1727 checks &= ~OPTION_REQUIRETLS;
1728
1729if ( checks & OPTION_TLS
1730 && pcre_exec(regex_STARTTLS, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
9094b84b 1731#endif
ee8b8090 1732 checks &= ~OPTION_TLS;
9094b84b 1733
14de8063 1734if ( checks & OPTION_IGNQ
ff5aac2b
JH
1735 && pcre_exec(regex_IGNOREQUOTA, NULL, CS buf, bsize, 0,
1736 PCRE_EOPT, NULL, 0) < 0)
14de8063 1737 checks &= ~OPTION_IGNQ;
9094b84b 1738
14de8063 1739if ( checks & OPTION_CHUNKING
f98442df 1740 && pcre_exec(regex_CHUNKING, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
14de8063 1741 checks &= ~OPTION_CHUNKING;
f98442df 1742
9094b84b 1743#ifndef DISABLE_PRDR
14de8063 1744if ( checks & OPTION_PRDR
ff5aac2b 1745 && pcre_exec(regex_PRDR, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
9094b84b 1746#endif
ee8b8090 1747 checks &= ~OPTION_PRDR;
9094b84b
JH
1748
1749#ifdef SUPPORT_I18N
14de8063 1750if ( checks & OPTION_UTF8
ff5aac2b 1751 && pcre_exec(regex_UTF8, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
9094b84b 1752#endif
ee8b8090 1753 checks &= ~OPTION_UTF8;
9094b84b 1754
14de8063 1755if ( checks & OPTION_DSN
ff5aac2b 1756 && pcre_exec(regex_DSN, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
14de8063 1757 checks &= ~OPTION_DSN;
9094b84b 1758
14de8063 1759if ( checks & OPTION_PIPE
ff5aac2b
JH
1760 && pcre_exec(regex_PIPELINING, NULL, CS buf, bsize, 0,
1761 PCRE_EOPT, NULL, 0) < 0)
14de8063 1762 checks &= ~OPTION_PIPE;
9094b84b 1763
14de8063 1764if ( checks & OPTION_SIZE
ff5aac2b 1765 && pcre_exec(regex_SIZE, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0)
14de8063 1766 checks &= ~OPTION_SIZE;
9094b84b 1767
ee8b8090
JH
1768#ifdef EXPERIMENTAL_PIPE_CONNECT
1769if ( checks & OPTION_EARLY_PIPE
1770 && pcre_exec(regex_EARLY_PIPE, NULL, CS buf, bsize, 0,
1771 PCRE_EOPT, NULL, 0) < 0)
1772#endif
1773 checks &= ~OPTION_EARLY_PIPE;
1774
1775/* debug_printf("%s: found 0x%04x\n", __FUNCTION__, checks); */
9094b84b
JH
1776return checks;
1777}
1778
1779
6d5c916c
JH
1780
1781/* Callback for emitting a BDAT data chunk header.
6d5c916c 1782
e027f545
JH
1783If given a nonzero size, first flush any buffered SMTP commands
1784then emit the command.
1785
d2aa036b
JH
1786Reap previous SMTP command responses if requested, and always reap
1787the response from a previous BDAT command.
1788
1789Args:
1790 tctx transport context
1791 chunk_size value for SMTP BDAT command
1792 flags
1793 tc_chunk_last add LAST option to SMTP BDAT command
1794 tc_reap_prev reap response to previous SMTP commands
6d5c916c
JH
1795
1796Returns: OK or ERROR
1797*/
1798
1799static int
d2aa036b
JH
1800smtp_chunk_cmd_callback(transport_ctx * tctx, unsigned chunk_size,
1801 unsigned flags)
6d5c916c 1802{
ee8b8090 1803smtp_transport_options_block * ob = SOB tctx->tblock->options_block;
e9166683 1804smtp_context * sx = tctx->smtp_context;
e027f545
JH
1805int cmd_count = 0;
1806int prev_cmd_count;
6d5c916c 1807
4e910c01
JH
1808/* Write SMTP chunk header command. If not reaping responses, note that
1809there may be more writes (like, the chunk data) done soon. */
6d5c916c 1810
e027f545 1811if (chunk_size > 0)
87cb4a16 1812 {
ee8b8090
JH
1813#ifdef EXPERIMENTAL_PIPE_CONNECT
1814 BOOL new_conn = !!(sx->outblock.conn_args);
1815#endif
251b9eb4 1816 if((cmd_count = smtp_write_command(sx,
4e910c01
JH
1817 flags & tc_reap_prev ? SCMD_FLUSH : SCMD_MORE,
1818 "BDAT %u%s\r\n", chunk_size, flags & tc_chunk_last ? " LAST" : "")
e027f545 1819 ) < 0) return ERROR;
87cb4a16
JH
1820 if (flags & tc_chunk_last)
1821 data_command = string_copy(big_buffer); /* Save for later error message */
ee8b8090
JH
1822#ifdef EXPERIMENTAL_PIPE_CONNECT
1823 /* That command write could have been the one that made the connection.
1824 Copy the fd from the client conn ctx (smtp transport specific) to the
1825 generic transport ctx. */
1826
1827 if (new_conn)
1828 tctx->u.fd = sx->outblock.cctx->sock;
1829#endif
87cb4a16 1830 }
e027f545 1831
e9166683 1832prev_cmd_count = cmd_count += sx->cmd_count;
6d5c916c 1833
e027f545 1834/* Reap responses for any previous, but not one we just emitted */
6d5c916c 1835
e027f545
JH
1836if (chunk_size > 0)
1837 prev_cmd_count--;
e9166683 1838if (sx->pending_BDAT)
e027f545 1839 prev_cmd_count--;
6d5c916c 1840
e027f545 1841if (flags & tc_reap_prev && prev_cmd_count > 0)
6d5c916c 1842 {
58fc5fb2
JH
1843 DEBUG(D_transport) debug_printf("look for %d responses"
1844 " for previous pipelined cmds\n", prev_cmd_count);
6d5c916c 1845
e9166683 1846 switch(sync_responses(sx, prev_cmd_count, 0))
e027f545
JH
1847 {
1848 case 1: /* 2xx (only) => OK */
e9166683
JH
1849 case 3: sx->good_RCPT = TRUE; /* 2xx & 5xx => OK & progress made */
1850 case 2: sx->completed_addr = TRUE; /* 5xx (only) => progress made */
e027f545
JH
1851 case 0: break; /* No 2xx or 5xx, but no probs */
1852
1853 case -1: /* Timeout on RCPT */
ee8b8090
JH
1854#ifdef EXPERIMENTAL_PIPE_CONNECT
1855 case -4: /* non-2xx for pipelined banner or EHLO */
1856#endif
e027f545
JH
1857 default: return ERROR; /* I/O error, or any MAIL/DATA error */
1858 }
1859 cmd_count = 1;
e9166683 1860 if (!sx->pending_BDAT)
e027f545 1861 pipelining_active = FALSE;
6d5c916c 1862 }
e027f545 1863
58fc5fb2 1864/* Reap response for an outstanding BDAT */
e027f545 1865
e9166683 1866if (sx->pending_BDAT)
e027f545 1867 {
58fc5fb2
JH
1868 DEBUG(D_transport) debug_printf("look for one response for BDAT\n");
1869
251b9eb4 1870 if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
e027f545
JH
1871 ob->command_timeout))
1872 {
e9166683 1873 if (errno == 0 && sx->buffer[0] == '4')
e027f545
JH
1874 {
1875 errno = ERRNO_DATA4XX; /*XXX does this actually get used? */
36e55f49 1876 sx->addrlist->more_errno |=
e9166683 1877 ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
e027f545
JH
1878 }
1879 return ERROR;
1880 }
1881 cmd_count--;
e9166683 1882 sx->pending_BDAT = FALSE;
e027f545
JH
1883 pipelining_active = FALSE;
1884 }
1885else if (chunk_size > 0)
e9166683 1886 sx->pending_BDAT = TRUE;
e027f545
JH
1887
1888
e9166683 1889sx->cmd_count = cmd_count;
e027f545 1890return OK;
6d5c916c
JH
1891}
1892
1893
1894
ee8b8090
JH
1895
1896
0756eb3c 1897/*************************************************
d093f8e5 1898* Make connection for given message *
0756eb3c
PH
1899*************************************************/
1900
d093f8e5
JH
1901/*
1902Arguments:
1903 ctx connection context
d093f8e5
JH
1904 suppress_tls if TRUE, don't attempt a TLS connection - this is set for
1905 a second attempt after TLS initialization fails
d093f8e5
JH
1906
1907Returns: OK - the connection was made and the delivery attempted;
1908 fd is set in the conn context, tls_out set up.
1909 DEFER - the connection could not be made, or something failed
1910 while setting up the SMTP session, or there was a
1911 non-message-specific error, such as a timeout.
1912 ERROR - helo_data or add_headers or authenticated_sender is
1913 specified for this transport, and the string failed
1914 to expand
1915*/
1916int
e9166683 1917smtp_setup_conn(smtp_context * sx, BOOL suppress_tls)
d093f8e5 1918{
c0635b6d 1919#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE)
d093f8e5
JH
1920dns_answer tlsa_dnsa;
1921#endif
ee8b8090 1922smtp_transport_options_block * ob = sx->conn_args.tblock->options_block;
d093f8e5 1923BOOL pass_message = FALSE;
d093f8e5 1924uschar * message = NULL;
d093f8e5
JH
1925int yield = OK;
1926int rc;
1927
ee8b8090 1928sx->conn_args.ob = ob;
d093f8e5 1929
ee8b8090
JH
1930sx->lmtp = strcmpic(ob->protocol, US"lmtp") == 0;
1931sx->smtps = strcmpic(ob->protocol, US"smtps") == 0;
d093f8e5
JH
1932sx->ok = FALSE;
1933sx->send_rset = TRUE;
1934sx->send_quit = TRUE;
1935sx->setting_up = TRUE;
1936sx->esmtp = TRUE;
1937sx->esmtp_sent = FALSE;
59a286ef 1938#ifdef SUPPORT_I18N
d093f8e5 1939sx->utf8_needed = FALSE;
59a286ef 1940#endif
d093f8e5 1941sx->dsn_all_lasthop = TRUE;
c0635b6d 1942#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE)
d093f8e5 1943sx->dane = FALSE;
8ac90765 1944sx->dane_required =
ee8b8090
JH
1945 verify_check_given_host(CUSS &ob->hosts_require_dane, sx->conn_args.host) == OK;
1946#endif
1947#ifdef EXPERIMENTAL_PIPE_CONNECT
1948sx->early_pipe_active = sx->early_pipe_ok = FALSE;
1949sx->ehlo_resp.cleartext_features = sx->ehlo_resp.crypted_features = 0;
1950sx->pending_BANNER = sx->pending_EHLO = FALSE;
d093f8e5
JH
1951#endif
1952
ee8b8090 1953if ((sx->max_rcpt = sx->conn_args.tblock->max_addresses) == 0) sx->max_rcpt = 999999;
d093f8e5 1954sx->peer_offered = 0;
14de8063 1955sx->avoid_option = 0;
d093f8e5 1956sx->igquotstr = US"";
ee8b8090 1957if (!sx->helo_data) sx->helo_data = ob->helo_data;
d093f8e5
JH
1958#ifdef EXPERIMENTAL_DSN_INFO
1959sx->smtp_greeting = NULL;
1960sx->helo_response = NULL;
59a286ef
JH
1961#endif
1962
0756eb3c 1963smtp_command = US"initial connection";
d093f8e5 1964sx->buffer[0] = '\0';
0756eb3c
PH
1965
1966/* Set up the buffer for reading SMTP response packets. */
1967
d093f8e5
JH
1968sx->inblock.buffer = sx->inbuffer;
1969sx->inblock.buffersize = sizeof(sx->inbuffer);
1970sx->inblock.ptr = sx->inbuffer;
1971sx->inblock.ptrend = sx->inbuffer;
0756eb3c
PH
1972
1973/* Set up the buffer for holding SMTP commands while pipelining */
1974
d093f8e5
JH
1975sx->outblock.buffer = sx->outbuffer;
1976sx->outblock.buffersize = sizeof(sx->outbuffer);
1977sx->outblock.ptr = sx->outbuffer;
1978sx->outblock.cmd_count = 0;
1979sx->outblock.authenticating = FALSE;
ee8b8090 1980sx->outblock.conn_args = NULL;
0756eb3c 1981
6c512171
PH
1982/* Reset the parameters of a TLS session. */
1983
817d9f57
JH
1984tls_out.bits = 0;
1985tls_out.cipher = NULL; /* the one we may use for this transport */
9d1c15ef
JH
1986tls_out.ourcert = NULL;
1987tls_out.peercert = NULL;
817d9f57
JH
1988tls_out.peerdn = NULL;
1989#if defined(SUPPORT_TLS) && !defined(USE_GNUTLS)
1990tls_out.sni = NULL;
5b456975 1991#endif
018058b2 1992tls_out.ocsp = OCSP_NOT_REQ;
6c512171 1993
35aba663
JH
1994/* Flip the legacy TLS-related variables over to the outbound set in case
1995they're used in the context of the transport. Don't bother resetting
02b41d71
JH
1996afterward (when being used by a transport) as we're in a subprocess.
1997For verify, unflipped once the callout is dealt with */
35aba663
JH
1998
1999tls_modify_variables(&tls_out);
2000
061b7ebd 2001#ifndef SUPPORT_TLS
d093f8e5 2002if (sx->smtps)
061b7ebd 2003 {
d093f8e5 2004 set_errno_nohost(sx->addrlist, ERRNO_TLSFAILURE, US"TLS support not available",
895fbaf2 2005 DEFER, FALSE);
018058b2 2006 return ERROR;
061b7ebd
PP
2007 }
2008#endif
2009
0756eb3c
PH
2010/* Make a connection to the host if this isn't a continued delivery, and handle
2011the initial interaction and HELO/EHLO/LHLO. Connect timeout errors are handled
2012specially so they can be identified for retries. */
2013
58c30e47 2014if (!continue_hostname)
0756eb3c 2015 {
e9166683 2016 if (sx->verify)
ee8b8090 2017 HDEBUG(D_verify) debug_printf("interface=%s port=%d\n", sx->conn_args.interface, sx->port);
02b41d71 2018
ee8b8090 2019 /* Get the actual port the connection will use, into sx->conn_args.host */
4311097e 2020
ee8b8090 2021 smtp_port_for_connect(sx->conn_args.host, sx->port);
0756eb3c 2022
c0635b6d 2023#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE)
58c30e47 2024 /* Do TLSA lookup for DANE */
0e66b3b6 2025 {
0e66b3b6
JH
2026 tls_out.dane_verified = FALSE;
2027 tls_out.tlsa_usage = 0;
2028
ee8b8090 2029 if (sx->conn_args.host->dnssec == DS_YES)
0e66b3b6 2030 {
d093f8e5 2031 if( sx->dane_required
ee8b8090 2032 || verify_check_given_host(CUSS &ob->hosts_try_dane, sx->conn_args.host) == OK
0e66b3b6 2033 )
ee8b8090 2034 switch (rc = tlsa_lookup(sx->conn_args.host, &tlsa_dnsa, sx->dane_required))
4b0fe319 2035 {
58c30e47 2036 case OK: sx->dane = TRUE;
ee8b8090 2037 ob->tls_tempfail_tryclear = FALSE;
58c30e47 2038 break;
2d5fdd53 2039 case FAIL_FORCED: break;
d093f8e5 2040 default: set_errno_nohost(sx->addrlist, ERRNO_DNSDEFER,
2d5fdd53 2041 string_sprintf("DANE error: tlsa lookup %s",
9c5e5449 2042 rc_to_string(rc)),
2d5fdd53 2043 rc, FALSE);
8d3dc239 2044# ifndef DISABLE_EVENT
ee8b8090 2045 (void) event_raise(sx->conn_args.tblock->event_action,
c4b57fdd
JH
2046 US"dane:fail", sx->dane_required
2047 ? US"dane-required" : US"dnssec-invalid");
8d3dc239 2048# endif
2d5fdd53 2049 return rc;
4b0fe319 2050 }
0e66b3b6 2051 }
d093f8e5 2052 else if (sx->dane_required)
0e66b3b6 2053 {
d093f8e5 2054 set_errno_nohost(sx->addrlist, ERRNO_DNSDEFER,
ee8b8090 2055 string_sprintf("DANE error: %s lookup not DNSSEC", sx->conn_args.host->name),
895fbaf2 2056 FAIL, FALSE);
8d3dc239 2057# ifndef DISABLE_EVENT
ee8b8090 2058 (void) event_raise(sx->conn_args.tblock->event_action,
c4b57fdd 2059 US"dane:fail", US"dane-required");
8d3dc239 2060# endif
4b0fe319 2061 return FAIL;
0e66b3b6 2062 }
0e66b3b6
JH
2063 }
2064#endif /*DANE*/
2065
58c30e47
JH
2066 /* Make the TCP connection */
2067
74f1a423
JH
2068 sx->cctx.tls_ctx = NULL;
2069 sx->inblock.cctx = sx->outblock.cctx = &sx->cctx;
ee8b8090 2070 sx->avoid_option = sx->peer_offered = smtp_peer_options = 0;
58c30e47 2071
ee8b8090
JH
2072#ifdef EXPERIMENTAL_PIPE_CONNECT
2073 if (verify_check_given_host(CUSS &ob->hosts_pipe_connect, sx->conn_args.host) == OK)
58c30e47 2074 {
ee8b8090
JH
2075 sx->early_pipe_ok = TRUE;
2076 if ( read_ehlo_cache_entry(sx)
2077 && sx->ehlo_resp.cleartext_features & OPTION_EARLY_PIPE)
58c30e47 2078 {
ee8b8090
JH
2079 DEBUG(D_transport) debug_printf("Using cached cleartext PIPE_CONNECT\n");
2080 sx->early_pipe_active = TRUE;
2081 sx->peer_offered = sx->ehlo_resp.cleartext_features;
58c30e47 2082 }
58c30e47
JH
2083 }
2084
ee8b8090
JH
2085 if (sx->early_pipe_active)
2086 sx->outblock.conn_args = &sx->conn_args;
2087 else
2088#endif
2089 {
2090 if ((sx->cctx.sock = smtp_connect(&sx->conn_args, NULL)) < 0)
2091 {
2092 uschar * msg = NULL;
2093 if (sx->verify)
2094 {
2095 msg = US strerror(errno);
2096 HDEBUG(D_verify) debug_printf("connect: %s\n", msg);
2097 }
2098 set_errno_nohost(sx->addrlist,
2099 errno == ETIMEDOUT ? ERRNO_CONNECTTIMEOUT : errno,
2100 sx->verify ? string_sprintf("could not connect: %s", msg)
2101 : NULL,
2102 DEFER, FALSE);
2103 sx->send_quit = FALSE;
2104 return DEFER;
2105 }
2106 }
41c7c167
PH
2107 /* Expand the greeting message while waiting for the initial response. (Makes
2108 sense if helo_data contains ${lookup dnsdb ...} stuff). The expansion is
2109 delayed till here so that $sending_interface and $sending_port are set. */
ee8b8090
JH
2110/*XXX early-pipe: they still will not be. Is there any way to find out what they
2111will be? Somehow I doubt it. */
41c7c167 2112
02b41d71
JH
2113 if (sx->helo_data)
2114 if (!(sx->helo_data = expand_string(sx->helo_data)))
e9166683 2115 if (sx->verify)
02b41d71
JH
2116 log_write(0, LOG_MAIN|LOG_PANIC,
2117 "<%s>: failed to expand transport's helo_data value for callout: %s",
2118 sx->addrlist->address, expand_string_message);
2119
8c5d388a 2120#ifdef SUPPORT_I18N
d093f8e5 2121 if (sx->helo_data)
810d16ad 2122 {
02b41d71
JH
2123 expand_string_message = NULL;
2124 if ((sx->helo_data = string_domain_utf8_to_alabel(sx->helo_data,
2125 &expand_string_message)),
2126 expand_string_message)
e9166683 2127 if (sx->verify)
02b41d71
JH
2128 log_write(0, LOG_MAIN|LOG_PANIC,
2129 "<%s>: failed to expand transport's helo_data value for callout: %s",
2130 sx->addrlist->address, expand_string_message);
2131 else
2132 sx->helo_data = NULL;
810d16ad
JH
2133 }
2134#endif
41c7c167 2135
0756eb3c
PH
2136 /* The first thing is to wait for an initial OK response. The dreaded "goto"
2137 is nevertheless a reasonably clean way of programming this kind of logic,
2138 where you want to escape on any error. */
2139
d093f8e5 2140 if (!sx->smtps)
061b7ebd 2141 {
ee8b8090
JH
2142#ifdef EXPERIMENTAL_PIPE_CONNECT
2143 if (sx->early_pipe_active)
2144 {
2145 sx->pending_BANNER = TRUE; /* sync_responses() must eventually handle */
2146 sx->outblock.cmd_count = 1;
2147 }
2148 else
8d330698 2149#endif
ee8b8090
JH
2150 {
2151#ifdef TCP_QUICKACK
2152 (void) setsockopt(sx->cctx.sock, IPPROTO_TCP, TCP_QUICKACK, US &off,
2153 sizeof(off));
895fbaf2 2154#endif
ee8b8090
JH
2155 if (!smtp_reap_banner(sx))
2156 goto RESPONSE_FAILED;
2157 }
0756eb3c 2158
0cbf2b82 2159#ifndef DISABLE_EVENT
b30275b8 2160 {
805c9d53 2161 uschar * s;
ee8b8090
JH
2162 lookup_dnssec_authenticated = sx->conn_args.host->dnssec==DS_YES ? US"yes"
2163 : sx->conn_args.host->dnssec==DS_NO ? US"no" : NULL;
2164 s = event_raise(sx->conn_args.tblock->event_action, US"smtp:connect", sx->buffer);
b30275b8 2165 if (s)
a7538db1 2166 {
d093f8e5 2167 set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL,
b30275b8 2168 string_sprintf("deferred by smtp:connect event expansion: %s", s),
895fbaf2 2169 DEFER, FALSE);
a7538db1
JH
2170 yield = DEFER;
2171 goto SEND_QUIT;
2172 }
b30275b8 2173 }
a7538db1
JH
2174#endif
2175
061b7ebd
PP
2176 /* Now check if the helo_data expansion went well, and sign off cleanly if
2177 it didn't. */
41c7c167 2178
d093f8e5 2179 if (!sx->helo_data)
061b7ebd 2180 {
d093f8e5 2181 message = string_sprintf("failed to expand helo_data: %s",
061b7ebd 2182 expand_string_message);
d093f8e5 2183 set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE);
061b7ebd
PP
2184 yield = DEFER;
2185 goto SEND_QUIT;
2186 }
41c7c167
PH
2187 }
2188
0756eb3c 2189/** Debugging without sending a message
d093f8e5 2190sx->addrlist->transport_return = DEFER;
0756eb3c
PH
2191goto SEND_QUIT;
2192**/
2193
2194 /* Errors that occur after this point follow an SMTP command, which is
2195 left in big_buffer by smtp_write_command() for use in error messages. */
2196
2197 smtp_command = big_buffer;
2198
2199 /* Tell the remote who we are...
2200
2201 February 1998: A convention has evolved that ESMTP-speaking MTAs include the
2202 string "ESMTP" in their greeting lines, so make Exim send EHLO if the
2203 greeting is of this form. The assumption was that the far end supports it
2204 properly... but experience shows that there are some that give 5xx responses,
2205 even though the banner includes "ESMTP" (there's a bloody-minded one that
2206 says "ESMTP not spoken here"). Cope with that case.
2207
2208 September 2000: Time has passed, and it seems reasonable now to always send
2209 EHLO at the start. It is also convenient to make the change while installing
2210 the TLS stuff.
2211
2212 July 2003: Joachim Wieland met a broken server that advertises "PIPELINING"
2213 but times out after sending MAIL FROM, RCPT TO and DATA all together. There
2214 would be no way to send out the mails, so there is now a host list
2215 "hosts_avoid_esmtp" that disables ESMTP for special hosts and solves the
2216 PIPELINING problem as well. Maybe it can also be useful to cure other
2217 problems with broken servers.
2218
2219 Exim originally sent "Helo" at this point and ran for nearly a year that way.
2220 Then somebody tried it with a Microsoft mailer... It seems that all other
2221 mailers use upper case for some reason (the RFC is quite clear about case
2222 independence) so, for peace of mind, I gave in. */
2223
ee8b8090 2224 sx->esmtp = verify_check_given_host(CUSS &ob->hosts_avoid_esmtp, sx->conn_args.host) != OK;
0756eb3c 2225
061b7ebd
PP
2226 /* Alas; be careful, since this goto is not an error-out, so conceivably
2227 we might set data between here and the target which we assume to exist
2228 and be usable. I can see this coming back to bite us. */
a7538db1 2229#ifdef SUPPORT_TLS
d093f8e5 2230 if (sx->smtps)
061b7ebd 2231 {
14de8063 2232 smtp_peer_options |= OPTION_TLS;
061b7ebd 2233 suppress_tls = FALSE;
ee8b8090 2234 ob->tls_tempfail_tryclear = FALSE;
061b7ebd
PP
2235 smtp_command = US"SSL-on-connect";
2236 goto TLS_NEGOTIATE;
2237 }
a7538db1 2238#endif
061b7ebd 2239
d093f8e5 2240 if (sx->esmtp)
0756eb3c 2241 {
ee8b8090
JH
2242 if (smtp_write_command(sx,
2243#ifdef EXPERIMENTAL_PIPE_CONNECT
2244 sx->early_pipe_active ? SCMD_BUFFER :
2245#endif
2246 SCMD_FLUSH,
2247 "%s %s\r\n", sx->lmtp ? "LHLO" : "EHLO", sx->helo_data) < 0)
0756eb3c 2248 goto SEND_FAILED;
d093f8e5 2249 sx->esmtp_sent = TRUE;
ee8b8090
JH
2250
2251#ifdef EXPERIMENTAL_PIPE_CONNECT
2252 if (sx->early_pipe_active)
0756eb3c 2253 {
ee8b8090
JH
2254 sx->pending_EHLO = TRUE;
2255
2256 /* If we have too many authenticators to handle and might need to AUTH
2257 for this transport, pipeline no further as we will need the
2258 list of auth methods offered. Reap the banner and EHLO. */
2259
2260 if ( (ob->hosts_require_auth || ob->hosts_try_auth)
2261 && f.smtp_in_early_pipe_no_auth)
895fbaf2 2262 {
ee8b8090
JH
2263 DEBUG(D_transport) debug_printf("may need to auth, so pipeline no further\n");
2264 if (smtp_write_command(sx, SCMD_FLUSH, NULL) < 0)
2265 goto SEND_FAILED;
2266 if (sync_responses(sx, 2, 0) != 0)
2267 {
2268 HDEBUG(D_transport)
2269 debug_printf("failed reaping pipelined cmd responses\n");
2270 goto RESPONSE_FAILED;
2271 }
2272 sx->early_pipe_active = FALSE;
895fbaf2 2273 }
0756eb3c 2274 }
ee8b8090 2275 else
895fbaf2 2276#endif
ee8b8090
JH
2277 if (!smtp_reap_ehlo(sx))
2278 goto RESPONSE_FAILED;
0756eb3c
PH
2279 }
2280 else
0756eb3c
PH
2281 DEBUG(D_transport)
2282 debug_printf("not sending EHLO (host matches hosts_avoid_esmtp)\n");
0756eb3c 2283
ee8b8090
JH
2284#ifdef EXPERIMENTAL_PIPE_CONNECT
2285 if (!sx->early_pipe_active)
2286#endif
2287 if (!sx->esmtp)
2288 {
2289 BOOL good_response;
2290 int n = sizeof(sx->buffer);
2291 uschar * rsp = sx->buffer;
a57ce043 2292
ee8b8090
JH
2293 if (sx->esmtp_sent && (n = Ustrlen(sx->buffer)) < sizeof(sx->buffer)/2)
2294 { rsp = sx->buffer + n + 1; n = sizeof(sx->buffer) - n; }
895fbaf2 2295
ee8b8090
JH
2296 if (smtp_write_command(sx, SCMD_FLUSH, "HELO %s\r\n", sx->helo_data) < 0)
2297 goto SEND_FAILED;
2298 good_response = smtp_read_response(sx, rsp, n, '2', ob->command_timeout);
895fbaf2 2299#ifdef EXPERIMENTAL_DSN_INFO
ee8b8090 2300 sx->helo_response = string_copy(rsp);
895fbaf2 2301#endif
ee8b8090 2302 if (!good_response)
a57ce043 2303 {
ee8b8090
JH
2304 /* Handle special logging for a closed connection after HELO
2305 when had previously sent EHLO */
2306
2307 if (rsp != sx->buffer && rsp[0] == 0 && (errno == 0 || errno == ECONNRESET))
2308 {
2309 errno = ERRNO_SMTPCLOSED;
2310 goto EHLOHELO_FAILED;
2311 }
2312 memmove(sx->buffer, rsp, Ustrlen(rsp));
2313 goto RESPONSE_FAILED;
a57ce043 2314 }
a57ce043 2315 }
2d14f397 2316
d093f8e5 2317 if (sx->esmtp || sx->lmtp)
2d14f397 2318 {
ee8b8090
JH
2319#ifdef EXPERIMENTAL_PIPE_CONNECT
2320 if (!sx->early_pipe_active)
2321#endif
2322 {
2323 sx->peer_offered = ehlo_response(sx->buffer,
2324 OPTION_TLS /* others checked later */
2325#ifdef EXPERIMENTAL_PIPE_CONNECT
2326 | (sx->early_pipe_ok
2327 ? OPTION_IGNQ
2328 | OPTION_CHUNKING | OPTION_PRDR | OPTION_DSN | OPTION_PIPE | OPTION_SIZE
2329#ifdef SUPPORT_I18N
2330 | OPTION_UTF8
2331#endif
2332 | OPTION_EARLY_PIPE
2333 : 0
2334 )
2335#endif
2336 );
2337#ifdef EXPERIMENTAL_PIPE_CONNECT
2338 if (sx->early_pipe_ok)
2339 {
2340 sx->ehlo_resp.cleartext_features = sx->peer_offered;
2341
2342 if ( (sx->peer_offered & (OPTION_PIPE | OPTION_EARLY_PIPE))
2343 == (OPTION_PIPE | OPTION_EARLY_PIPE))
2344 {
2345 DEBUG(D_transport) debug_printf("PIPE_CONNECT usable in future for this IP\n");
2346 sx->ehlo_resp.cleartext_auths = study_ehlo_auths(sx);
2347 write_ehlo_cache_entry(sx);
2348 }
2349 }
2350#endif
2351 }
f1513293 2352
0756eb3c
PH
2353 /* Set tls_offered if the response to EHLO specifies support for STARTTLS. */
2354
a7538db1 2355#ifdef SUPPORT_TLS
14de8063 2356 smtp_peer_options |= sx->peer_offered & OPTION_TLS;
7ade712c 2357#endif
2d14f397 2358 }
0756eb3c
PH
2359 }
2360
57cc2785
JH
2361/* For continuing deliveries down the same channel, having re-exec'd the socket
2362is the standard input; for a socket held open from verify it is recorded
2363in the cutthrough context block. Either way we don't need to redo EHLO here
2364(but may need to do so for TLS - see below).
2365Set up the pointer to where subsequent commands will be left, for
2d14f397 2366error messages. Note that smtp_peer_options will have been
0756eb3c
PH
2367set from the command line if they were set in the process that passed the
2368connection on. */
2369
895fbaf2 2370/*XXX continue case needs to propagate DSN_INFO, prob. in deliver.c
4c04137d 2371as the continue goes via transport_pass_socket() and doublefork and exec.
895fbaf2
JH
2372It does not wait. Unclear how we keep separate host's responses
2373separate - we could match up by host ip+port as a bodge. */
2374
0756eb3c
PH
2375else
2376 {
74f1a423 2377 if (cutthrough.cctx.sock >= 0 && cutthrough.callout_hold_only)
57cc2785 2378 {
74f1a423 2379 sx->cctx = cutthrough.cctx;
ee8b8090 2380 sx->conn_args.host->port = sx->port = cutthrough.host.port;
57cc2785
JH
2381 }
2382 else
2383 {
74f1a423
JH
2384 sx->cctx.sock = 0; /* stdin */
2385 sx->cctx.tls_ctx = NULL;
ee8b8090 2386 smtp_port_for_connect(sx->conn_args.host, sx->port); /* Record the port that was used */
57cc2785 2387 }
74f1a423 2388 sx->inblock.cctx = sx->outblock.cctx = &sx->cctx;
0756eb3c 2389 smtp_command = big_buffer;
02b41d71 2390 sx->helo_data = NULL; /* ensure we re-expand ob->helo_data */
875512a3 2391
57cc2785
JH
2392 /* For a continued connection with TLS being proxied for us, or a
2393 held-open verify connection with TLS, nothing more to do. */
875512a3 2394
57cc2785 2395 if ( continue_proxy_cipher
74f1a423
JH
2396 || (cutthrough.cctx.sock >= 0 && cutthrough.callout_hold_only
2397 && cutthrough.is_tls)
57cc2785 2398 )
875512a3
JH
2399 {
2400 sx->peer_offered = smtp_peer_options;
7c576fca 2401 sx->pipelining_used = pipelining_active = !!(smtp_peer_options & OPTION_PIPE);
57cc2785
JH
2402 HDEBUG(D_transport) debug_printf("continued connection, %s TLS\n",
2403 continue_proxy_cipher ? "proxied" : "verify conn with");
875512a3
JH
2404 return OK;
2405 }
2406 HDEBUG(D_transport) debug_printf("continued connection, no TLS\n");
0756eb3c
PH
2407 }
2408
2409/* If TLS is available on this connection, whether continued or not, attempt to
2410start up a TLS session, unless the host is in hosts_avoid_tls. If successful,
2411send another EHLO - the server may give a different answer in secure mode. We
2412use a separate buffer for reading the response to STARTTLS so that if it is
2413negative, the original EHLO data is available for subsequent analysis, should
2414the client not be required to use TLS. If the response is bad, copy the buffer
2415for error analysis. */
2416
2417#ifdef SUPPORT_TLS
14de8063 2418if ( smtp_peer_options & OPTION_TLS
5130845b 2419 && !suppress_tls
ee8b8090 2420 && verify_check_given_host(CUSS &ob->hosts_avoid_tls, sx->conn_args.host) != OK
e9166683 2421 && ( !sx->verify
ee8b8090 2422 || verify_check_given_host(CUSS &ob->hosts_verify_avoid_tls, sx->conn_args.host) != OK
02b41d71 2423 ) )
0756eb3c
PH
2424 {
2425 uschar buffer2[4096];
ee8b8090 2426
251b9eb4 2427 if (smtp_write_command(sx, SCMD_FLUSH, "STARTTLS\r\n") < 0)
0756eb3c
PH
2428 goto SEND_FAILED;
2429
ee8b8090
JH
2430#ifdef EXPERIMENTAL_PIPE_CONNECT
2431 /* If doing early-pipelining reap the banner and EHLO-response but leave
2432 the response for the STARTTLS we just sent alone. */
2433
2434 if (sx->early_pipe_active && sync_responses(sx, 2, 0) != 0)
2435 {
2436 HDEBUG(D_transport)
2437 debug_printf("failed reaping pipelined cmd responses\n");
2438 goto RESPONSE_FAILED;
2439 }
2440#endif
2441
0756eb3c
PH
2442 /* If there is an I/O error, transmission of this message is deferred. If
2443 there is a temporary rejection of STARRTLS and tls_tempfail_tryclear is
2444 false, we also defer. However, if there is a temporary rejection of STARTTLS
2445 and tls_tempfail_tryclear is true, or if there is an outright rejection of
2446 STARTTLS, we carry on. This means we will try to send the message in clear,
2447 unless the host is in hosts_require_tls (tested below). */
2448
ee8b8090 2449 if (!smtp_read_response(sx, buffer2, sizeof(buffer2), '2', ob->command_timeout))
0756eb3c 2450 {
4b0fe319
JH
2451 if ( errno != 0
2452 || buffer2[0] == 0
ee8b8090 2453 || (buffer2[0] == '4' && !ob->tls_tempfail_tryclear)
4b0fe319 2454 )
0dda4340 2455 {
d093f8e5 2456 Ustrncpy(sx->buffer, buffer2, sizeof(sx->buffer));
9e7e0f6a 2457 sx->buffer[sizeof(sx->buffer)-1] = '\0';
0756eb3c 2458 goto RESPONSE_FAILED;
0dda4340 2459 }
0756eb3c
PH
2460 }
2461
2462 /* STARTTLS accepted: try to negotiate a TLS session. */
2463
2464 else
061b7ebd 2465 TLS_NEGOTIATE:
0756eb3c 2466 {
cf0c6164 2467 uschar * errstr;
ee8b8090
JH
2468 sx->cctx.tls_ctx = tls_client_start(sx->cctx.sock, sx->conn_args.host,
2469 sx->addrlist, sx->conn_args.tblock,
c0635b6d 2470# ifdef SUPPORT_DANE
cf0c6164 2471 sx->dane ? &tlsa_dnsa : NULL,
0e66b3b6 2472# endif
74f1a423 2473 &tls_out, &errstr);
0756eb3c 2474
74f1a423 2475 if (!sx->cctx.tls_ctx)
0756eb3c 2476 {
74f1a423
JH
2477 /* TLS negotiation failed; give an error. From outside, this function may
2478 be called again to try in clear on a new connection, if the options permit
2479 it for this host. */
8008accd 2480 DEBUG(D_tls) debug_printf("TLS session fail: %s\n", errstr);
74f1a423 2481
c0635b6d 2482# ifdef SUPPORT_DANE
c4b57fdd
JH
2483 if (sx->dane)
2484 {
2485 log_write(0, LOG_MAIN,
cf0c6164 2486 "DANE attempt failed; TLS connection to %s [%s]: %s",
ee8b8090 2487 sx->conn_args.host->name, sx->conn_args.host->address, errstr);
8d3dc239 2488# ifndef DISABLE_EVENT
ee8b8090 2489 (void) event_raise(sx->conn_args.tblock->event_action,
c4b57fdd 2490 US"dane:fail", US"validation-failure"); /* could do with better detail */
8d3dc239 2491# endif
c4b57fdd 2492 }
6ebd79ec
JH
2493# endif
2494
de6273b4 2495 errno = ERRNO_TLSFAILURE;
cf0c6164 2496 message = string_sprintf("TLS session: %s", errstr);
d093f8e5 2497 sx->send_quit = FALSE;
0756eb3c
PH
2498 goto TLS_FAILED;
2499 }
2500
2501 /* TLS session is set up */
2502
2d14f397 2503 smtp_peer_options_wrap = smtp_peer_options;
db3f7b69 2504 for (address_item * addr = sx->addrlist; addr; addr = addr->next)
5ca2a9a1
PH
2505 if (addr->transport_return == PENDING_DEFER)
2506 {
817d9f57 2507 addr->cipher = tls_out.cipher;
9d1c15ef
JH
2508 addr->ourcert = tls_out.ourcert;
2509 addr->peercert = tls_out.peercert;
817d9f57 2510 addr->peerdn = tls_out.peerdn;
018058b2 2511 addr->ocsp = tls_out.ocsp;
5ca2a9a1 2512 }
0756eb3c
PH
2513 }
2514 }
2515
061b7ebd
PP
2516/* if smtps, we'll have smtp_command set to something else; always safe to
2517reset it here. */
2518smtp_command = big_buffer;
2519
41c7c167
PH
2520/* If we started TLS, redo the EHLO/LHLO exchange over the secure channel. If
2521helo_data is null, we are dealing with a connection that was passed from
2522another process, and so we won't have expanded helo_data above. We have to
2523expand it here. $sending_ip_address and $sending_port are set up right at the
2524start of the Exim process (in exim.c). */
0756eb3c 2525
74f1a423 2526if (tls_out.active.sock >= 0)
0756eb3c 2527 {
ee8b8090 2528 uschar * greeting_cmd;
895fbaf2 2529
ee8b8090 2530 if (!sx->helo_data && !(sx->helo_data = expand_string(ob->helo_data)))
41c7c167 2531 {
d093f8e5
JH
2532 uschar *message = string_sprintf("failed to expand helo_data: %s",
2533 expand_string_message);
2534 set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE);
2535 yield = DEFER;
2536 goto SEND_QUIT;
41c7c167
PH
2537 }
2538
ee8b8090
JH
2539#ifdef EXPERIMENTAL_PIPE_CONNECT
2540 /* For SMTPS there is no cleartext early-pipe; use the crypted permission bit.
2541 We're unlikely to get the group sent and delivered before the server sends its
2542 banner, but it's still worth sending as a group.
2543 For STARTTLS allow for cleartext early-pipe but no crypted early-pipe, but not
2544 the reverse. */
2545
2546 if (sx->smtps ? sx->early_pipe_ok : sx->early_pipe_active)
2547 {
2548 sx->peer_offered = sx->ehlo_resp.crypted_features;
2549 if ((sx->early_pipe_active =
2550 !!(sx->ehlo_resp.crypted_features & OPTION_EARLY_PIPE)))
2551 DEBUG(D_transport) debug_printf("Using cached crypted PIPE_CONNECT\n");
2552 }
2553#endif
2554
0d0e4455 2555 /* For SMTPS we need to wait for the initial OK response. */
d093f8e5 2556 if (sx->smtps)
ee8b8090
JH
2557#ifdef EXPERIMENTAL_PIPE_CONNECT
2558 if (sx->early_pipe_active)
2559 {
2560 sx->pending_BANNER = TRUE;
2561 sx->outblock.cmd_count = 1;
2562 }
2563 else
895fbaf2 2564#endif
ee8b8090
JH
2565 if (!smtp_reap_banner(sx))
2566 goto RESPONSE_FAILED;
0d0e4455 2567
ee8b8090
JH
2568 if (sx->lmtp)
2569 greeting_cmd = US"LHLO";
2570 else if (sx->esmtp)
2571 greeting_cmd = US"EHLO";
0d0e4455
PP
2572 else
2573 {
ee8b8090 2574 greeting_cmd = US"HELO";
0d0e4455
PP
2575 DEBUG(D_transport)
2576 debug_printf("not sending EHLO (host matches hosts_avoid_esmtp)\n");
061b7ebd
PP
2577 }
2578
ee8b8090
JH
2579 if (smtp_write_command(sx,
2580#ifdef EXPERIMENTAL_PIPE_CONNECT
2581 sx->early_pipe_active ? SCMD_BUFFER :
2582#endif
2583 SCMD_FLUSH,
2584 "%s %s\r\n", greeting_cmd, sx->helo_data) < 0)
0756eb3c 2585 goto SEND_FAILED;
ee8b8090
JH
2586
2587#ifdef EXPERIMENTAL_PIPE_CONNECT
2588 if (sx->early_pipe_active)
2589 sx->pending_EHLO = TRUE;
2590 else
895fbaf2 2591#endif
ee8b8090
JH
2592 {
2593 if (!smtp_reap_ehlo(sx))
2594 goto RESPONSE_FAILED;
2595 smtp_peer_options = 0;
2596 }
0756eb3c
PH
2597 }
2598
2599/* If the host is required to use a secure channel, ensure that we
2600have one. */
2601
d093f8e5 2602else if ( sx->smtps
c0635b6d 2603# ifdef SUPPORT_DANE
d093f8e5 2604 || sx->dane
8ac90765
JH
2605# endif
2606# ifdef EXPERIMENTAL_REQUIRETLS
2607 || tls_requiretls & REQUIRETLS_MSG
0e66b3b6 2608# endif
ee8b8090 2609 || verify_check_given_host(CUSS &ob->hosts_require_tls, sx->conn_args.host) == OK
7a31d643 2610 )
0756eb3c 2611 {
8ac90765
JH
2612 errno =
2613# ifdef EXPERIMENTAL_REQUIRETLS
2614 tls_requiretls & REQUIRETLS_MSG ? ERRNO_REQUIRETLS :
2615# endif
2616 ERRNO_TLSREQUIRED;
c562fd30 2617 message = string_sprintf("a TLS session is required, but %s",
14de8063 2618 smtp_peer_options & OPTION_TLS
2d14f397 2619 ? "an attempt to start TLS failed" : "the server did not offer TLS support");
8d3dc239 2620# if defined(SUPPORT_DANE) && !defined(DISABLE_EVENT)
c4b57fdd 2621 if (sx->dane)
ee8b8090 2622 (void) event_raise(sx->conn_args.tblock->event_action, US"dane:fail",
c4b57fdd
JH
2623 smtp_peer_options & OPTION_TLS
2624 ? US"validation-failure" /* could do with better detail */
2625 : US"starttls-not-supported");
2626# endif
0756eb3c
PH
2627 goto TLS_FAILED;
2628 }
0e66b3b6 2629#endif /*SUPPORT_TLS*/
0756eb3c
PH
2630
2631/* If TLS is active, we have just started it up and re-done the EHLO command,
2632so its response needs to be analyzed. If TLS is not active and this is a
2633continued session down a previously-used socket, we haven't just done EHLO, so
2634we skip this. */
2635
2636if (continue_hostname == NULL
a7538db1 2637#ifdef SUPPORT_TLS
74f1a423 2638 || tls_out.active.sock >= 0
a7538db1 2639#endif
0756eb3c
PH
2640 )
2641 {
d093f8e5 2642 if (sx->esmtp || sx->lmtp)
2d14f397 2643 {
ee8b8090
JH
2644#ifdef EXPERIMENTAL_PIPE_CONNECT
2645 if (!sx->early_pipe_active)
2646#endif
2647 {
e9166683 2648 sx->peer_offered = ehlo_response(sx->buffer,
d093f8e5 2649 0 /* no TLS */
ee8b8090
JH
2650#ifdef EXPERIMENTAL_PIPE_CONNECT
2651 | (sx->lmtp && ob->lmtp_ignore_quota ? OPTION_IGNQ : 0)
2652 | OPTION_DSN | OPTION_PIPE | OPTION_SIZE
2653 | OPTION_CHUNKING | OPTION_PRDR | OPTION_UTF8 | OPTION_REQUIRETLS
2654 | (tls_out.active.sock >= 0 ? OPTION_EARLY_PIPE : 0) /* not for lmtp */
2655
2656#else
2657
2658 | (sx->lmtp && ob->lmtp_ignore_quota ? OPTION_IGNQ : 0)
14de8063
JH
2659 | OPTION_CHUNKING
2660 | OPTION_PRDR
ee8b8090 2661# ifdef SUPPORT_I18N
14de8063 2662 | (sx->addrlist->prop.utf8_msg ? OPTION_UTF8 : 0)
d093f8e5
JH
2663 /*XXX if we hand peercaps on to continued-conn processes,
2664 must not depend on this addr */
ee8b8090 2665# endif
14de8063
JH
2666 | OPTION_DSN
2667 | OPTION_PIPE
ee8b8090
JH
2668 | (ob->size_addition >= 0 ? OPTION_SIZE : 0)
2669# if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
8ac90765 2670 | (tls_requiretls & REQUIRETLS_MSG ? OPTION_REQUIRETLS : 0)
ee8b8090 2671# endif
8ac90765 2672#endif
9094b84b 2673 );
ee8b8090
JH
2674#ifdef EXPERIMENTAL_PIPE_CONNECT
2675 if (tls_out.active.sock >= 0)
2676 sx->ehlo_resp.crypted_features = sx->peer_offered;
2677#endif
2678 }
9094b84b 2679
2d14f397
JH
2680 /* Set for IGNOREQUOTA if the response to LHLO specifies support and the
2681 lmtp_ignore_quota option was set. */
f1513293 2682
14de8063 2683 sx->igquotstr = sx->peer_offered & OPTION_IGNQ ? US" IGNOREQUOTA" : US"";
f1513293 2684
2d14f397
JH
2685 /* If the response to EHLO specified support for the SIZE parameter, note
2686 this, provided size_addition is non-negative. */
f1513293 2687
14de8063 2688 smtp_peer_options |= sx->peer_offered & OPTION_SIZE;
0756eb3c 2689
2d14f397
JH
2690 /* Note whether the server supports PIPELINING. If hosts_avoid_esmtp matched
2691 the current host, esmtp will be false, so PIPELINING can never be used. If
2692 the current host matches hosts_avoid_pipelining, don't do it. */
0756eb3c 2693
14de8063 2694 if ( sx->peer_offered & OPTION_PIPE
ee8b8090 2695 && verify_check_given_host(CUSS &ob->hosts_avoid_pipelining, sx->conn_args.host) != OK)
14de8063 2696 smtp_peer_options |= OPTION_PIPE;
0756eb3c 2697
2d14f397 2698 DEBUG(D_transport) debug_printf("%susing PIPELINING\n",
14de8063 2699 smtp_peer_options & OPTION_PIPE ? "" : "not ");
0756eb3c 2700
14de8063 2701 if ( sx->peer_offered & OPTION_CHUNKING
ee8b8090 2702 && verify_check_given_host(CUSS &ob->hosts_try_chunking, sx->conn_args.host) != OK)
14de8063 2703 sx->peer_offered &= ~OPTION_CHUNKING;
f98442df 2704
14de8063 2705 if (sx->peer_offered & OPTION_CHUNKING)
ee8b8090 2706 DEBUG(D_transport) debug_printf("CHUNKING usable\n");
0756eb3c 2707
8ccd00b1 2708#ifndef DISABLE_PRDR
14de8063 2709 if ( sx->peer_offered & OPTION_PRDR
ee8b8090 2710 && verify_check_given_host(CUSS &ob->hosts_try_prdr, sx->conn_args.host) != OK)
14de8063 2711 sx->peer_offered &= ~OPTION_PRDR;
fd98a5c6 2712
14de8063 2713 if (sx->peer_offered & OPTION_PRDR)
ee8b8090 2714 DEBUG(D_transport) debug_printf("PRDR usable\n");
fd98a5c6
JH
2715#endif
2716
2d14f397 2717 /* Note if the server supports DSN */
14de8063 2718 smtp_peer_options |= sx->peer_offered & OPTION_DSN;
2d14f397 2719 DEBUG(D_transport) debug_printf("%susing DSN\n",
14de8063 2720 sx->peer_offered & OPTION_DSN ? "" : "not ");
6c1c3d1d 2721
8ac90765
JH
2722#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
2723 if (sx->peer_offered & OPTION_REQUIRETLS)
2724 {
2725 smtp_peer_options |= OPTION_REQUIRETLS;
2726 DEBUG(D_transport) debug_printf(
2727 tls_requiretls & REQUIRETLS_MSG
2728 ? "using REQUIRETLS\n" : "REQUIRETLS offered\n");
2729 }
2730#endif
2731
ee8b8090
JH
2732#ifdef EXPERIMENTAL_PIPE_CONNECT
2733 if ( sx->early_pipe_ok
2734 && !sx->early_pipe_active
2735 && tls_out.active.sock >= 0
2736 && smtp_peer_options & OPTION_PIPE
2737 && ( sx->ehlo_resp.cleartext_features | sx->ehlo_resp.crypted_features)
2738 & OPTION_EARLY_PIPE)
2739 {
2740 DEBUG(D_transport) debug_printf("PIPE_CONNECT usable in future for this IP\n");
2741 sx->ehlo_resp.crypted_auths = study_ehlo_auths(sx);
2742 write_ehlo_cache_entry(sx);
2743 }
2744#endif
2745
2d14f397
JH
2746 /* Note if the response to EHLO specifies support for the AUTH extension.
2747 If it has, check that this host is one we want to authenticate to, and do
2748 the business. The host name and address must be available when the
2749 authenticator's client driver is running. */
0756eb3c 2750
ee8b8090 2751 switch (yield = smtp_auth(sx))
2d14f397
JH
2752 {
2753 default: goto SEND_QUIT;
2754 case OK: break;
2755 case FAIL_SEND: goto SEND_FAILED;
2756 case FAIL: goto RESPONSE_FAILED;
2757 }
0756eb3c
PH
2758 }
2759 }
7c576fca 2760sx->pipelining_used = pipelining_active = !!(smtp_peer_options & OPTION_PIPE);
0756eb3c
PH
2761
2762/* The setting up of the SMTP call is now complete. Any subsequent errors are
2763message-specific. */
2764
d093f8e5 2765sx->setting_up = FALSE;
0756eb3c 2766
8c5d388a 2767#ifdef SUPPORT_I18N
d093f8e5 2768if (sx->addrlist->prop.utf8_msg)
9094b84b 2769 {
71c15846
JH
2770 uschar * s;
2771
2772 /* If the transport sets a downconversion mode it overrides any set by ACL
2773 for the message. */
2774
ee8b8090 2775 if ((s = ob->utf8_downconvert))
71c15846
JH
2776 {
2777 if (!(s = expand_string(s)))
2778 {
2779 message = string_sprintf("failed to expand utf8_downconvert: %s",
2780 expand_string_message);
2781 set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE);
2782 yield = DEFER;
2783 goto SEND_QUIT;
2784 }
2785 switch (*s)
2786 {
2787 case '1': sx->addrlist->prop.utf8_downcvt = TRUE;
2788 sx->addrlist->prop.utf8_downcvt_maybe = FALSE;
2789 break;
2790 case '0': sx->addrlist->prop.utf8_downcvt = FALSE;
2791 sx->addrlist->prop.utf8_downcvt_maybe = FALSE;
2792 break;
2793 case '-': if (s[1] == '1')
2794 {
2795 sx->addrlist->prop.utf8_downcvt = FALSE;
2796 sx->addrlist->prop.utf8_downcvt_maybe = TRUE;
2797 }
2798 break;
2799 }
2800 }
2801
d093f8e5
JH
2802 sx->utf8_needed = !sx->addrlist->prop.utf8_downcvt
2803 && !sx->addrlist->prop.utf8_downcvt_maybe;
2804 DEBUG(D_transport) if (!sx->utf8_needed)
59a286ef 2805 debug_printf("utf8: %s downconvert\n",
d093f8e5 2806 sx->addrlist->prop.utf8_downcvt ? "mandatory" : "optional");
9094b84b
JH
2807 }
2808
7ade712c 2809/* If this is an international message we need the host to speak SMTPUTF8 */
14de8063 2810if (sx->utf8_needed && !(sx->peer_offered & OPTION_UTF8))
7ade712c
JH
2811 {
2812 errno = ERRNO_UTF8_FWD;
2813 goto RESPONSE_FAILED;
2814 }
71c15846 2815#endif /*SUPPORT_I18N*/
7ade712c 2816
8ac90765
JH
2817#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
2818 /*XXX should tls_requiretls actually be per-addr? */
2819
2820if ( tls_requiretls & REQUIRETLS_MSG
2821 && !(sx->peer_offered & OPTION_REQUIRETLS)
2822 )
2823 {
2824 sx->setting_up = TRUE;
2825 errno = ERRNO_REQUIRETLS;
2826 message = US"REQUIRETLS support is required from the server"
2827 " but it was not offered";
2828 DEBUG(D_transport) debug_printf("%s\n", message);
2829 goto TLS_FAILED;
2830 }
2831#endif
2832
d093f8e5
JH
2833return OK;
2834
2835
2836 {
2837 int code;
d093f8e5
JH
2838
2839 RESPONSE_FAILED:
d093f8e5 2840 message = NULL;
ee8b8090 2841 sx->send_quit = check_response(sx->conn_args.host, &errno, sx->addrlist->more_errno,
d093f8e5 2842 sx->buffer, &code, &message, &pass_message);
8ac90765 2843 yield = DEFER;
d093f8e5 2844 goto FAILED;
d093f8e5
JH
2845
2846 SEND_FAILED:
d093f8e5
JH
2847 code = '4';
2848 message = US string_sprintf("send() to %s [%s] failed: %s",
ee8b8090 2849 sx->conn_args.host->name, sx->conn_args.host->address, strerror(errno));
d093f8e5 2850 sx->send_quit = FALSE;
8ac90765 2851 yield = DEFER;
d093f8e5 2852 goto FAILED;
d093f8e5 2853
de6273b4
JH
2854 EHLOHELO_FAILED:
2855 code = '4';
2856 message = string_sprintf("Remote host closed connection in response to %s"
2857 " (EHLO response was: %s)", smtp_command, sx->buffer);
2858 sx->send_quit = FALSE;
8ac90765 2859 yield = DEFER;
de6273b4
JH
2860 goto FAILED;
2861
e5ab0ba9
JH
2862 /* This label is jumped to directly when a TLS negotiation has failed,
2863 or was not done for a host for which it is required. Values will be set
2864 in message and errno, and setting_up will always be true. Treat as
2865 a temporary error. */
2866
d093f8e5
JH
2867#ifdef SUPPORT_TLS
2868 TLS_FAILED:
8ac90765
JH
2869# ifdef EXPERIMENTAL_REQUIRETLS
2870 if (errno == ERRNO_REQUIRETLS)
2871 code = '5', yield = FAIL;
2872 /*XXX DSN will be labelled 500; prefer 530 5.7.4 */
2873 else
2874# endif
2875 code = '4', yield = DEFER;
de6273b4 2876 goto FAILED;
d093f8e5
JH
2877#endif
2878
2879 /* The failure happened while setting up the call; see if the failure was
2880 a 5xx response (this will either be on connection, or following HELO - a 5xx
e69636bc
JH
2881 after EHLO causes it to try HELO). If so, and there are no more hosts to try,
2882 fail all addresses, as this host is never going to accept them. For other
2883 errors during setting up (timeouts or whatever), defer all addresses, and
2884 yield DEFER, so that the host is not tried again for a while.
2885
2886 XXX This peeking for another host feels like a layering violation. We want
2887 to note the host as unusable, but down here we shouldn't know if this was
2888 the last host to try for the addr(list). Perhaps the upper layer should be
2889 the one to do set_errno() ? The problem is that currently the addr is where
2890 errno etc. are stashed, but until we run out of hosts to try the errors are
2891 host-specific. Maybe we should enhance the host_item definition? */
d093f8e5 2892
de6273b4 2893FAILED:
d093f8e5 2894 sx->ok = FALSE; /* For when reached by GOTO */
e69636bc 2895 set_errno(sx->addrlist, errno, message,
ee8b8090 2896 sx->conn_args.host->next
e69636bc
JH
2897 ? DEFER
2898 : code == '5'
d093f8e5 2899#ifdef SUPPORT_I18N
e69636bc 2900 || errno == ERRNO_UTF8_FWD
d093f8e5 2901#endif
e69636bc 2902 ? FAIL : DEFER,
ee8b8090 2903 pass_message, sx->conn_args.host
d093f8e5
JH
2904#ifdef EXPERIMENTAL_DSN_INFO
2905 , sx->smtp_greeting, sx->helo_response
2906#endif
2907 );
2908 }
2909
2910
2911SEND_QUIT:
2912
2913if (sx->send_quit)
251b9eb4 2914 (void)smtp_write_command(sx, SCMD_FLUSH, "QUIT\r\n");
d093f8e5 2915
d093f8e5 2916#ifdef SUPPORT_TLS
74f1a423
JH
2917if (sx->cctx.tls_ctx)
2918 {
2919 tls_close(sx->cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
2920 sx->cctx.tls_ctx = NULL;
2921 }
d093f8e5
JH
2922#endif
2923
2924/* Close the socket, and return the appropriate value, first setting
2925works because the NULL setting is passed back to the calling process, and
2926remote_max_parallel is forced to 1 when delivering over an existing connection,
b7d3afcf 2927*/
d093f8e5 2928
e1d04f48 2929HDEBUG(D_transport|D_acl|D_v) debug_printf_indent(" SMTP(close)>>\n");
d093f8e5
JH
2930if (sx->send_quit)
2931 {
74f1a423
JH
2932 shutdown(sx->cctx.sock, SHUT_WR);
2933 if (fcntl(sx->cctx.sock, F_SETFL, O_NONBLOCK) == 0)
db3f7b69
JH
2934 for (int i = 16; read(sx->cctx.sock, sx->inbuffer, sizeof(sx->inbuffer)) > 0 && i > 0;)
2935 i--; /* drain socket */
02b41d71 2936 sx->send_quit = FALSE;
d093f8e5 2937 }
74f1a423
JH
2938(void)close(sx->cctx.sock);
2939sx->cctx.sock = -1;
d093f8e5
JH
2940
2941#ifndef DISABLE_EVENT
ee8b8090 2942(void) event_raise(sx->conn_args.tblock->event_action, US"tcp:close", NULL);
d093f8e5
JH
2943#endif
2944
2945continue_transport = NULL;
2946continue_hostname = NULL;
2947return yield;
2948}
2949
2950
9be4572b
JH
2951
2952
2953/* Create the string of options that will be appended to the MAIL FROM:
2954in the connection context buffer */
2955
2956static int
2957build_mailcmd_options(smtp_context * sx, address_item * addrlist)
2958{
2959uschar * p = sx->buffer;
2960address_item * addr;
2961int address_count;
2962
2963*p = 0;
2964
14de8063 2965/* If we know the receiving MTA supports the SIZE qualification, and we know it,
9be4572b
JH
2966send it, adding something to the message size to allow for imprecision
2967and things that get added en route. Exim keeps the number of lines
2968in a message, so we can give an accurate value for the original message, but we
2969need some additional to handle added headers. (Double "." characters don't get
2970included in the count.) */
2971
14de8063
JH
2972if ( message_size > 0
2973 && sx->peer_offered & OPTION_SIZE && !(sx->avoid_option & OPTION_SIZE))
9be4572b 2974 {
328c5688
JH
2975/*XXX problem here under spool_files_wireformat?
2976Or just forget about lines? Or inflate by a fixed proportion? */
2977
ee8b8090 2978 sprintf(CS p, " SIZE=%d", message_size+message_linecount+(SOB sx->conn_args.ob)->size_addition);
9be4572b
JH
2979 while (*p) p++;
2980 }
2981
2982#ifndef DISABLE_PRDR
2983/* If it supports Per-Recipient Data Reponses, and we have omre than one recipient,
2984request that */
2985
2986sx->prdr_active = FALSE;
14de8063 2987if (sx->peer_offered & OPTION_PRDR)
db3f7b69 2988 for (address_item * addr = addrlist; addr; addr = addr->next)
9be4572b
JH
2989 if (addr->transport_return == PENDING_DEFER)
2990 {
2991 for (addr = addr->next; addr; addr = addr->next)
2992 if (addr->transport_return == PENDING_DEFER)
2993 { /* at least two recipients to send */
2994 sx->prdr_active = TRUE;
2995 sprintf(CS p, " PRDR"); p += 5;
2996 break;
2997 }
2998 break;
2999 }
3000#endif
3001
3002#ifdef SUPPORT_I18N
3003/* If it supports internationalised messages, and this meesage need that,
3004request it */
3005
14de8063 3006if ( sx->peer_offered & OPTION_UTF8
9be4572b
JH
3007 && addrlist->prop.utf8_msg
3008 && !addrlist->prop.utf8_downcvt
3009 )
3010 Ustrcpy(p, " SMTPUTF8"), p += 9;
3011#endif
3012
8ac90765
JH
3013#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
3014if (tls_requiretls & REQUIRETLS_MSG)
3015 Ustrcpy(p, " REQUIRETLS") , p += 11;
3016#endif
3017
9be4572b
JH
3018/* check if all addresses have DSN-lasthop flag; do not send RET and ENVID if so */
3019for (sx->dsn_all_lasthop = TRUE, addr = addrlist, address_count = 0;
3020 addr && address_count < sx->max_rcpt;
3021 addr = addr->next) if (addr->transport_return == PENDING_DEFER)
3022 {
3023 address_count++;
3024 if (!(addr->dsn_flags & rf_dsnlasthop))
3025 {
3026 sx->dsn_all_lasthop = FALSE;
3027 break;
3028 }
3029 }
3030
3031/* Add any DSN flags to the mail command */
3032
14de8063 3033if (sx->peer_offered & OPTION_DSN && !sx->dsn_all_lasthop)
9be4572b
JH
3034 {
3035 if (dsn_ret == dsn_ret_hdrs)
3036 { Ustrcpy(p, " RET=HDRS"); p += 9; }
3037 else if (dsn_ret == dsn_ret_full)
3038 { Ustrcpy(p, " RET=FULL"); p += 9; }
3039
3040 if (dsn_envid)
3041 {
3042 string_format(p, sizeof(sx->buffer) - (p-sx->buffer), " ENVID=%s", dsn_envid);
3043 while (*p) p++;
3044 }
3045 }
3046
3047/* If an authenticated_sender override has been specified for this transport
3048instance, expand it. If the expansion is forced to fail, and there was already
3049an authenticated_sender for this message, the original value will be used.
3050Other expansion failures are serious. An empty result is ignored, but there is
3051otherwise no check - this feature is expected to be used with LMTP and other
3052cases where non-standard addresses (e.g. without domains) might be required. */
3053
ee8b8090 3054if (smtp_mail_auth_str(p, sizeof(sx->buffer) - (p-sx->buffer), addrlist, sx->conn_args.ob))
9be4572b
JH
3055 return ERROR;
3056
3057return OK;
3058}
3059
3060
3061static void
3062build_rcptcmd_options(smtp_context * sx, const address_item * addr)
3063{
3064uschar * p = sx->buffer;
3065*p = 0;
3066
3067/* Add any DSN flags to the rcpt command */
3068
14de8063 3069if (sx->peer_offered & OPTION_DSN && !(addr->dsn_flags & rf_dsnlasthop))
9be4572b
JH
3070 {
3071 if (addr->dsn_flags & rf_dsnflags)
3072 {
9be4572b
JH
3073 BOOL first = TRUE;
3074
3075 Ustrcpy(p, " NOTIFY=");
3076 while (*p) p++;
db3f7b69 3077 for (int i = 0; i < nelem(rf_list); i++) if (addr->dsn_flags & rf_list[i])
9be4572b
JH
3078 {
3079 if (!first) *p++ = ',';
3080 first = FALSE;
3081 Ustrcpy(p, rf_names[i]);
3082 while (*p) p++;
3083 }
3084 }
3085
3086 if (addr->dsn_orcpt)
3087 {
3088 string_format(p, sizeof(sx->buffer) - (p-sx->buffer), " ORCPT=%s",
3089 addr->dsn_orcpt);
3090 while (*p) p++;
3091 }
3092 }
3093}
3094
3095
d9c3c8ed
JH
3096
3097/*
3098Return:
e9166683
JH
3099 0 good, rcpt results in addr->transport_return (PENDING_OK, DEFER, FAIL)
3100 -1 MAIL response error
3101 -2 any non-MAIL read i/o error
3102 -3 non-MAIL response timeout
3103 -4 internal error; channel still usable
3104 -5 transmit failed
d9c3c8ed
JH
3105 */
3106
3107int
3108smtp_write_mail_and_rcpt_cmds(smtp_context * sx, int * yield)
3109{
3110address_item * addr;
3111int address_count;
3112int rc;
3113
3114if (build_mailcmd_options(sx, sx->first_addr) != OK)
3115 {
3116 *yield = ERROR;
e9166683 3117 return -4;
d9c3c8ed
JH
3118 }
3119
3120/* From here until we send the DATA command, we can make use of PIPELINING
3121if the server host supports it. The code has to be able to check the responses
3122at any point, for when the buffer fills up, so we write it totally generally.
3123When PIPELINING is off, each command written reports that it has flushed the
3124buffer. */
3125
3126sx->pending_MAIL = TRUE; /* The block starts with MAIL */
3127
3128 {
3129 uschar * s = sx->from_addr;
3130#ifdef SUPPORT_I18N
3131 uschar * errstr = NULL;
3132
3133 /* If we must downconvert, do the from-address here. Remember we had to
3134 for the to-addresses (done below), and also (ugly) for re-doing when building
3135 the delivery log line. */
3136
3137 if ( sx->addrlist->prop.utf8_msg
14de8063 3138 && (sx->addrlist->prop.utf8_downcvt || !(sx->peer_offered & OPTION_UTF8))
d9c3c8ed
JH
3139 )
3140 {
3141 if (s = string_address_utf8_to_alabel(s, &errstr), errstr)
3142 {
3143 set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, errstr, DEFER, FALSE);
3144 *yield = ERROR;
e9166683 3145 return -4;
d9c3c8ed
JH
3146 }
3147 setflag(sx->addrlist, af_utf8_downcvt);
3148 }
3149#endif
3150
251b9eb4 3151 rc = smtp_write_command(sx, pipelining_active ? SCMD_BUFFER : SCMD_FLUSH,
d9c3c8ed
JH
3152 "MAIL FROM:<%s>%s\r\n", s, sx->buffer);
3153 }
3154
3155mail_command = string_copy(big_buffer); /* Save for later error message */
3156
3157switch(rc)
3158 {
3159 case -1: /* Transmission error */
e9166683 3160 return -5;
d9c3c8ed 3161
df5b41e3 3162 case +1: /* Cmd was sent */
251b9eb4 3163 if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
ee8b8090 3164 (SOB sx->conn_args.ob)->command_timeout))
d9c3c8ed
JH
3165 {
3166 if (errno == 0 && sx->buffer[0] == '4')
3167 {
3168 errno = ERRNO_MAIL4XX;
3169 sx->addrlist->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
3170 }
3171 return -1;
3172 }
3173 sx->pending_MAIL = FALSE;
3174 break;
e9166683
JH
3175
3176 /* otherwise zero: command queued for pipeline */
d9c3c8ed
JH
3177 }
3178
3179/* Pass over all the relevant recipient addresses for this host, which are the
3180ones that have status PENDING_DEFER. If we are using PIPELINING, we can send
3181several before we have to read the responses for those seen so far. This
3182checking is done by a subroutine because it also needs to be done at the end.
3183Send only up to max_rcpt addresses at a time, leaving next_addr pointing to
3184the next one if not all are sent.
3185
3186In the MUA wrapper situation, we want to flush the PIPELINING buffer for the
3187last address because we want to abort if any recipients have any kind of
3188problem, temporary or permanent. We know that all recipient addresses will have
3189the PENDING_DEFER status, because only one attempt is ever made, and we know
e9166683
JH
3190that max_rcpt will be large, so all addresses will be done at once.
3191
3192For verify we flush the pipeline after any (the only) rcpt address. */
d9c3c8ed
JH
3193
3194for (addr = sx->first_addr, address_count = 0;
3195 addr && address_count < sx->max_rcpt;
3196 addr = addr->next) if (addr->transport_return == PENDING_DEFER)
3197 {
3198 int count;
3199 BOOL no_flush;
3200 uschar * rcpt_addr;
3201
14de8063 3202 addr->dsn_aware = sx->peer_offered & OPTION_DSN
d9c3c8ed
JH
3203 ? dsn_support_yes : dsn_support_no;
3204
3205 address_count++;
4c2471ca
JH
3206 no_flush = pipelining_active && !sx->verify
3207 && (!mua_wrapper || addr->next && address_count < sx->max_rcpt);
d9c3c8ed
JH
3208
3209 build_rcptcmd_options(sx, addr);
3210
3211 /* Now send the RCPT command, and process outstanding responses when
3212 necessary. After a timeout on RCPT, we just end the function, leaving the
3213 yield as OK, because this error can often mean that there is a problem with
3214 just one address, so we don't want to delay the host. */
3215
ee8b8090 3216 rcpt_addr = transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes);
d9c3c8ed
JH
3217
3218#ifdef SUPPORT_I18N
3219 if ( testflag(sx->addrlist, af_utf8_downcvt)
3220 && !(rcpt_addr = string_address_utf8_to_alabel(rcpt_addr, NULL))
3221 )
3222 {
3223 /*XXX could we use a per-address errstr here? Not fail the whole send? */
3224 errno = ERRNO_EXPANDFAIL;
e9166683 3225 return -5; /*XXX too harsh? */
d9c3c8ed
JH
3226 }
3227#endif
3228
251b9eb4 3229 count = smtp_write_command(sx, no_flush ? SCMD_BUFFER : SCMD_FLUSH,
4e910c01 3230 "RCPT TO:<%s>%s%s\r\n", rcpt_addr, sx->igquotstr, sx->buffer);
d9c3c8ed 3231
e9166683 3232 if (count < 0) return -5;
d9c3c8ed
JH
3233 if (count > 0)
3234 {
df5b41e3 3235 switch(sync_responses(sx, count, 0))
d9c3c8ed
JH
3236 {
3237 case 3: sx->ok = TRUE; /* 2xx & 5xx => OK & progress made */
3238 case 2: sx->completed_addr = TRUE; /* 5xx (only) => progress made */
e9166683 3239 break;
d9c3c8ed
JH
3240
3241 case 1: sx->ok = TRUE; /* 2xx (only) => OK, but if LMTP, */
3242 if (!sx->lmtp) /* can't tell about progress yet */
3243 sx->completed_addr = TRUE;
3244 case 0: /* No 2xx or 5xx, but no probs */
3245 break;
3246
e9166683
JH
3247 case -1: return -3; /* Timeout on RCPT */
3248 case -2: return -2; /* non-MAIL read i/o error */
3249 default: return -1; /* any MAIL error */
ee8b8090
JH
3250
3251#ifdef EXPERIMENTAL_PIPE_CONNECT
3252 case -4: return -1; /* non-2xx for pipelined banner or EHLO */
3253#endif
d9c3c8ed
JH
3254 }
3255 sx->pending_MAIL = FALSE; /* Dealt with MAIL */
3256 }
3257 } /* Loop for next address */
3258
3259sx->next_addr = addr;
3260return 0;
3261}
3262
3263
875512a3
JH
3264#ifdef SUPPORT_TLS
3265/*****************************************************
3266* Proxy TLS connection for another transport process *
3267******************************************************/
3268/*
d097cc73
JH
3269Close the unused end of the pipe, fork once more, then use the given buffer
3270as a staging area, and select on both the given fd and the TLS'd client-fd for
3271data to read (per the coding in ip_recv() and fd_ready() this is legitimate).
3272Do blocking full-size writes, and reads under a timeout. Once both input
3273channels are closed, exit the process.
875512a3
JH
3274
3275Arguments:
74f1a423 3276 ct_ctx tls context
57cc2785
JH
3277 buf space to use for buffering
3278 bufsiz size of buffer
d097cc73 3279 pfd pipe filedescriptor array; [0] is comms to proxied process
875512a3
JH
3280 timeout per-read timeout, seconds
3281*/
3282
57cc2785 3283void
74f1a423
JH
3284smtp_proxy_tls(void * ct_ctx, uschar * buf, size_t bsize, int * pfd,
3285 int timeout)
875512a3 3286{
e47252f5 3287fd_set rfds, efds;
74f1a423 3288int max_fd = MAX(pfd[0], tls_out.active.sock) + 1;
db3f7b69 3289int rc, i;
875512a3 3290
d097cc73
JH
3291close(pfd[1]);
3292if ((rc = fork()))
3293 {
3294 DEBUG(D_transport) debug_printf("proxy-proc final-pid %d\n", rc);
3295 _exit(rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
3296 }
3297
8768d548 3298if (f.running_in_test_harness) millisleep(100); /* let parent debug out */
875512a3 3299set_process_info("proxying TLS connection for continued transport");
e47252f5 3300FD_ZERO(&rfds);
74f1a423 3301FD_SET(tls_out.active.sock, &rfds);
d097cc73 3302FD_SET(pfd[0], &rfds);
875512a3 3303
db3f7b69 3304for (int fd_bits = 3; fd_bits; )
875512a3
JH
3305 {
3306 time_t time_left = timeout;
3307 time_t time_start = time(NULL);
3308
3309 /* wait for data */
e47252f5 3310 efds = rfds;
875512a3
JH
3311 do
3312 {
3313 struct timeval tv = { time_left, 0 };
3314
e47252f5
JH
3315 rc = select(max_fd,
3316 (SELECT_ARG2_TYPE *)&rfds, NULL, (SELECT_ARG2_TYPE *)&efds, &tv);
875512a3
JH
3317
3318 if (rc < 0 && errno == EINTR)
3319 if ((time_left -= time(NULL) - time_start) > 0) continue;
3320
3321 if (rc <= 0)
3322 {
3323 DEBUG(D_transport) if (rc == 0) debug_printf("%s: timed out\n", __FUNCTION__);
d097cc73 3324 goto done;
875512a3 3325 }
e47252f5 3326
74f1a423 3327 if (FD_ISSET(tls_out.active.sock, &efds) || FD_ISSET(pfd[0], &efds))
e47252f5
JH
3328 {
3329 DEBUG(D_transport) debug_printf("select: exceptional cond on %s fd\n",
d097cc73
JH
3330 FD_ISSET(pfd[0], &efds) ? "proxy" : "tls");
3331 goto done;
e47252f5 3332 }
875512a3 3333 }
74f1a423 3334 while (rc < 0 || !(FD_ISSET(tls_out.active.sock, &rfds) || FD_ISSET(pfd[0], &rfds)));
875512a3
JH
3335
3336 /* handle inbound data */
74f1a423
JH
3337 if (FD_ISSET(tls_out.active.sock, &rfds))
3338 if ((rc = tls_read(ct_ctx, buf, bsize)) <= 0)
875512a3
JH
3339 {
3340 fd_bits &= ~1;
74f1a423 3341 FD_CLR(tls_out.active.sock, &rfds);
d097cc73 3342 shutdown(pfd[0], SHUT_WR);
e47252f5 3343 timeout = 5;
875512a3
JH
3344 }
3345 else
3346 {
db3f7b69 3347 for (int nbytes = 0; rc - nbytes > 0; nbytes += i)
d097cc73 3348 if ((i = write(pfd[0], buf + nbytes, rc - nbytes)) < 0) goto done;
875512a3
JH
3349 }
3350 else if (fd_bits & 1)
74f1a423 3351 FD_SET(tls_out.active.sock, &rfds);
875512a3
JH
3352
3353 /* handle outbound data */
d097cc73
JH
3354 if (FD_ISSET(pfd[0], &rfds))
3355 if ((rc = read(pfd[0], buf, bsize)) <= 0)
875512a3 3356 {
e47252f5 3357 fd_bits = 0;
74f1a423 3358 tls_close(ct_ctx, TLS_SHUTDOWN_NOWAIT);
c645dd29 3359 ct_ctx = NULL;
875512a3
JH
3360 }
3361 else
3362 {
db3f7b69 3363 for (int nbytes = 0; rc - nbytes > 0; nbytes += i)
74f1a423 3364 if ((i = tls_write(ct_ctx, buf + nbytes, rc - nbytes, FALSE)) < 0)
d097cc73 3365 goto done;
875512a3
JH
3366 }
3367 else if (fd_bits & 2)
d097cc73 3368 FD_SET(pfd[0], &rfds);
875512a3 3369 }
d097cc73
JH
3370
3371done:
8768d548 3372 if (f.running_in_test_harness) millisleep(100); /* let logging complete */
d097cc73 3373 exim_exit(0, US"TLS proxy");
875512a3
JH
3374}
3375#endif
3376
3377
d093f8e5
JH
3378/*************************************************
3379* Deliver address list to given host *
3380*************************************************/
3381
3382/* If continue_hostname is not null, we get here only when continuing to
3383deliver down an existing channel. The channel was passed as the standard
3384input. TLS is never active on a passed channel; the previous process always
3385closes it down before passing the connection on.
3386
3387Otherwise, we have to make a connection to the remote host, and do the
3388initial protocol exchange.
3389
3390When running as an MUA wrapper, if the sender or any recipient is rejected,
3391temporarily or permanently, we force failure for all recipients.
3392
3393Arguments:
3394 addrlist chain of potential addresses to deliver; only those whose
3395 transport_return field is set to PENDING_DEFER are currently
3396 being processed; others should be skipped - they have either
3397 been delivered to an earlier host or IP address, or been
3398 failed by one of them.
3399 host host to deliver to
3400 host_af AF_INET or AF_INET6
a843a57e
JH
3401 defport default TCP/IP port to use if host does not specify, in host
3402 byte order
d093f8e5
JH
3403 interface interface to bind to, or NULL
3404 tblock transport instance block
3405 message_defer set TRUE if yield is OK, but all addresses were deferred
3406 because of a non-recipient, non-host failure, that is, a
3407 4xx response to MAIL FROM, DATA, or ".". This is a defer
3408 that is specific to the message.
3409 suppress_tls if TRUE, don't attempt a TLS connection - this is set for
3410 a second attempt after TLS initialization fails
3411
3412Returns: OK - the connection was made and the delivery attempted;
3413 the result for each address is in its data block.
3414 DEFER - the connection could not be made, or something failed
3415 while setting up the SMTP session, or there was a
3416 non-message-specific error, such as a timeout.
3417 ERROR - a filter command is specified for this transport,
3418 and there was a problem setting it up; OR helo_data
3419 or add_headers or authenticated_sender is specified
3420 for this transport, and the string failed to expand
3421*/
3422
3423static int
a843a57e 3424smtp_deliver(address_item *addrlist, host_item *host, int host_af, int defport,
d093f8e5
JH
3425 uschar *interface, transport_instance *tblock,
3426 BOOL *message_defer, BOOL suppress_tls)
3427{
ee8b8090 3428smtp_transport_options_block * ob = SOB tblock->options_block;
d093f8e5 3429int yield = OK;
d093f8e5
JH
3430int save_errno;
3431int rc;
32dfdf8b 3432struct timeval start_delivery_time;
d093f8e5 3433
d093f8e5
JH
3434BOOL pass_message = FALSE;
3435uschar *message = NULL;
3436uschar new_message_id[MESSAGE_ID_LENGTH + 1];
d093f8e5
JH
3437
3438smtp_context sx;
3439
32dfdf8b 3440gettimeofday(&start_delivery_time, NULL);
d093f8e5 3441suppress_tls = suppress_tls; /* stop compiler warning when no TLS support */
02b41d71 3442*message_defer = FALSE;
d093f8e5
JH
3443
3444sx.addrlist = addrlist;
ee8b8090
JH
3445sx.conn_args.host = host;
3446sx.conn_args.host_af = host_af,
a843a57e 3447sx.port = defport;
ee8b8090 3448sx.conn_args.interface = interface;
02b41d71 3449sx.helo_data = NULL;
ee8b8090 3450sx.conn_args.tblock = tblock;
e9166683 3451sx.verify = FALSE;
ee8b8090 3452sx.sync_addr = sx.first_addr = addrlist;
d093f8e5 3453
9be4572b
JH
3454/* Get the channel set up ready for a message (MAIL FROM being the next
3455SMTP command to send */
3456
e9166683 3457if ((rc = smtp_setup_conn(&sx, suppress_tls)) != OK)
d093f8e5
JH
3458 return rc;
3459
0756eb3c
PH
3460/* If there is a filter command specified for this transport, we can now
3461set it up. This cannot be done until the identify of the host is known. */
3462
e9166683 3463if (tblock->filter_command)
0756eb3c 3464 {
9b989985 3465 transport_filter_timeout = tblock->filter_timeout;
0756eb3c
PH
3466
3467 /* On failure, copy the error to all addresses, abandon the SMTP call, and
3468 yield ERROR. */
3469
36d295f1
JH
3470 if (!transport_set_up_command(&transport_filter_argv,
3471 tblock->filter_command, TRUE, DEFER, addrlist,
3472 string_sprintf("%.50s transport", tblock->name), NULL))
0756eb3c 3473 {
895fbaf2
JH
3474 set_errno_nohost(addrlist->next, addrlist->basic_errno, addrlist->message, DEFER,
3475 FALSE);
0756eb3c
PH
3476 yield = ERROR;
3477 goto SEND_QUIT;
3478 }
48f1c853
JH
3479
3480 if ( transport_filter_argv
3481 && *transport_filter_argv
3482 && **transport_filter_argv
14de8063 3483 && sx.peer_offered & OPTION_CHUNKING
48f1c853
JH
3484 )
3485 {
14de8063 3486 sx.peer_offered &= ~OPTION_CHUNKING;
48f1c853
JH
3487 DEBUG(D_transport) debug_printf("CHUNKING not usable due to transport filter\n");
3488 }
0756eb3c
PH
3489 }
3490
0756eb3c
PH
3491/* For messages that have more than the maximum number of envelope recipients,
3492we want to send several transactions down the same SMTP connection. (See
3493comments in deliver.c as to how this reconciles, heuristically, with
3494remote_max_parallel.) This optimization was added to Exim after the following
3495code was already working. The simplest way to put it in without disturbing the
3496code was to use a goto to jump back to this point when there is another
3497transaction to handle. */
3498
3499SEND_MESSAGE:
d9c3c8ed 3500sx.from_addr = return_path;
36d295f1 3501sx.sync_addr = sx.first_addr;
d093f8e5
JH
3502sx.ok = FALSE;
3503sx.send_rset = TRUE;
d9c3c8ed 3504sx.completed_addr = FALSE;
0756eb3c
PH
3505
3506
57cc2785
JH
3507/* If we are a continued-connection-after-verify the MAIL and RCPT
3508commands were already sent; do not re-send but do mark the addrs as
3509having been accepted up to RCPT stage. A traditional cont-conn
3510always has a sequence number greater than one. */
6b62e899 3511
57cc2785 3512if (continue_hostname && continue_sequence == 1)
0756eb3c 3513 {
57cc2785 3514 sx.peer_offered = smtp_peer_options;
d8b8dd15 3515 sx.pending_MAIL = FALSE;
57cc2785
JH
3516 sx.ok = TRUE;
3517 sx.next_addr = NULL;
0756eb3c 3518
db3f7b69 3519 for (address_item * addr = addrlist; addr; addr = addr->next)
57cc2785
JH
3520 addr->transport_return = PENDING_OK;
3521 }
3522else
0756eb3c 3523 {
57cc2785
JH
3524 /* Initiate a message transfer. */
3525
3526 switch(smtp_write_mail_and_rcpt_cmds(&sx, &yield))
3527 {
3528 case 0: break;
3529 case -1: case -2: goto RESPONSE_FAILED;
3530 case -3: goto END_OFF;
3531 case -4: goto SEND_QUIT;
3532 default: goto SEND_FAILED;
3533 }
3534
3535 /* If we are an MUA wrapper, abort if any RCPTs were rejected, either
3536 permanently or temporarily. We should have flushed and synced after the last
3537 RCPT. */
3538
3539 if (mua_wrapper)
3540 {
4c2471ca
JH
3541 address_item * a;
3542 unsigned cnt;
3543
3544 for (a = sx.first_addr, cnt = 0; a && cnt < sx.max_rcpt; a = a->next, cnt++)
3545 if (a->transport_return != PENDING_OK)
57cc2785
JH
3546 {
3547 /*XXX could we find a better errno than 0 here? */
4c2471ca
JH
3548 set_errno_nohost(addrlist, 0, a->message, FAIL,
3549 testflag(a, af_pass_message));
57cc2785
JH
3550 sx.ok = FALSE;
3551 break;
3552 }
3553 }
0756eb3c
PH
3554 }
3555
3556/* If ok is TRUE, we know we have got at least one good recipient, and must now
3557send DATA, but if it is FALSE (in the normal, non-wrapper case), we may still
3558have a good recipient buffered up if we are pipelining. We don't want to waste
3559time sending DATA needlessly, so we only send it if either ok is TRUE or if we
6d5c916c
JH
3560are pipelining. The responses are all handled by sync_responses().
3561If using CHUNKING, do not send a BDAT until we know how big a chunk we want
3562to send is. */
0756eb3c 3563
14de8063 3564if ( !(sx.peer_offered & OPTION_CHUNKING)
d093f8e5 3565 && (sx.ok || (pipelining_active && !mua_wrapper)))
0756eb3c 3566 {
251b9eb4 3567 int count = smtp_write_command(&sx, SCMD_FLUSH, "DATA\r\n");
6d5c916c 3568
0756eb3c 3569 if (count < 0) goto SEND_FAILED;
df5b41e3 3570 switch(sync_responses(&sx, count, sx.ok ? +1 : -1))
0756eb3c 3571 {
d093f8e5 3572 case 3: sx.ok = TRUE; /* 2xx & 5xx => OK & progress made */
d9c3c8ed 3573 case 2: sx.completed_addr = TRUE; /* 5xx (only) => progress made */
0756eb3c
PH
3574 break;
3575
d093f8e5 3576 case 1: sx.ok = TRUE; /* 2xx (only) => OK, but if LMTP, */
d9c3c8ed 3577 if (!sx.lmtp) sx.completed_addr = TRUE; /* can't tell about progress yet */
0756eb3c
PH
3578 case 0: break; /* No 2xx or 5xx, but no probs */
3579
3580 case -1: goto END_OFF; /* Timeout on RCPT */
ee8b8090
JH
3581
3582#ifdef EXPERIMENTAL_PIPE_CONNECT
3583 case -4: HDEBUG(D_transport)
3584 debug_printf("failed reaping pipelined cmd responses\n");
3585#endif
0756eb3c
PH
3586 default: goto RESPONSE_FAILED; /* I/O error, or any MAIL/DATA error */
3587 }
0d9fa8c0 3588 pipelining_active = FALSE;
87cb4a16 3589 data_command = string_copy(big_buffer); /* Save for later error message */
0756eb3c
PH
3590 }
3591
0756eb3c
PH
3592/* If there were no good recipients (but otherwise there have been no
3593problems), just set ok TRUE, since we have handled address-specific errors
3594already. Otherwise, it's OK to send the message. Use the check/escape mechanism
3595for handling the SMTP dot-handling protocol, flagging to apply to headers as
3596well as body. Set the appropriate timeout value to be used for each chunk.
3597(Haven't been able to make it work using select() for writing yet.) */
3598
14de8063 3599if (!(sx.peer_offered & OPTION_CHUNKING) && !sx.ok)
6d5c916c
JH
3600 {
3601 /* Save the first address of the next batch. */
d9c3c8ed 3602 sx.first_addr = sx.next_addr;
6d5c916c 3603
d093f8e5 3604 sx.ok = TRUE;
6d5c916c 3605 }
ff5aac2b 3606else
0756eb3c 3607 {
6b46ecc6 3608 transport_ctx tctx = {
ee8b8090
JH
3609 .u = {.fd = sx.cctx.sock}, /*XXX will this need TLS info? */
3610 .tblock = tblock,
3611 .addr = addrlist,
3612 .check_string = US".",
3613 .escape_string = US"..", /* Escaping strings */
3614 .options =
3615 topt_use_crlf | topt_escape_headers
6b46ecc6
JH
3616 | (tblock->body_only ? topt_no_headers : 0)
3617 | (tblock->headers_only ? topt_no_body : 0)
3618 | (tblock->return_path_add ? topt_add_return_path : 0)
3619 | (tblock->delivery_date_add ? topt_add_delivery_date : 0)
3620 | (tblock->envelope_to_add ? topt_add_envelope_to : 0)
3621 };
3622
6d5c916c
JH
3623 /* If using CHUNKING we need a callback from the generic transport
3624 support to us, for the sending of BDAT smtp commands and the reaping
3625 of responses. The callback needs a whole bunch of state so set up
3626 a transport-context structure to be passed around. */
3627
14de8063 3628 if (sx.peer_offered & OPTION_CHUNKING)
59932f7d 3629 {
65de12cc 3630 tctx.check_string = tctx.escape_string = NULL;
6d5c916c
JH
3631 tctx.options |= topt_use_bdat;
3632 tctx.chunk_cb = smtp_chunk_cmd_callback;
e9166683
JH
3633 sx.pending_BDAT = FALSE;
3634 sx.good_RCPT = sx.ok;
3635 sx.cmd_count = 0;
3636 tctx.smtp_context = &sx;
59932f7d
JH
3637 }
3638 else
65de12cc 3639 tctx.options |= topt_end_dot;
59932f7d 3640
6d5c916c 3641 /* Save the first address of the next batch. */
d9c3c8ed 3642 sx.first_addr = sx.next_addr;
6d5c916c 3643
e027f545
JH
3644 /* Responses from CHUNKING commands go in buffer. Otherwise,
3645 there has not been a response. */
3646
d093f8e5 3647 sx.buffer[0] = 0;
e027f545 3648
0756eb3c 3649 sigalrm_seen = FALSE;
ee8b8090 3650 transport_write_timeout = ob->data_timeout;
0756eb3c
PH
3651 smtp_command = US"sending data block"; /* For error messages */
3652 DEBUG(D_transport|D_v)
14de8063 3653 if (sx.peer_offered & OPTION_CHUNKING)
6d5c916c
JH
3654 debug_printf(" will write message using CHUNKING\n");
3655 else
3656 debug_printf(" SMTP>> writing message and terminating \".\"\n");
0756eb3c 3657 transport_count = 0;
a7538db1 3658
80a47a2c 3659#ifndef DISABLE_DKIM
617d3932
JH
3660 dkim_exim_sign_init();
3661# ifdef EXPERIMENTAL_ARC
3662 {
ee8b8090 3663 uschar * s = ob->arc_sign;
617d3932
JH
3664 if (s)
3665 {
ee8b8090 3666 if (!(ob->dkim.arc_signspec = s = expand_string(s)))
617d3932 3667 {
8768d548 3668 if (!f.expand_string_forcedfail)
587d831d
JH
3669 {
3670 message = US"failed to expand arc_sign";
3671 sx.ok = FALSE;
3672 goto SEND_FAILED;
3673 }
3674 }
3675 else if (*s)
3676 {
3677 /* Ask dkim code to hash the body for ARC */
3678 (void) arc_ams_setup_sign_bodyhash();
ee8b8090 3679 ob->dkim.force_bodyhash = TRUE;
617d3932 3680 }
617d3932
JH
3681 }
3682 }
3683# endif
ee8b8090 3684 sx.ok = dkim_transport_write_message(&tctx, &ob->dkim, CUSS &message);
4cd12fe9 3685#else
42055a33 3686 sx.ok = transport_write_message(&tctx, 0);
4cd12fe9 3687#endif
0756eb3c
PH
3688
3689 /* transport_write_message() uses write() because it is called from other
3690 places to write to non-sockets. This means that under some OS (e.g. Solaris)
3691 it can exit with "Broken pipe" as its error. This really means that the
3692 socket got closed at the far end. */
3693
3694 transport_write_timeout = 0; /* for subsequent transports */
3695
3696 /* Failure can either be some kind of I/O disaster (including timeout),
e027f545
JH
3697 or the failure of a transport filter or the expansion of added headers.
3698 Or, when CHUNKING, it can be a protocol-detected failure. */
0756eb3c 3699
d093f8e5 3700 if (!sx.ok)
b9df1829
JH
3701 if (message) goto SEND_FAILED;
3702 else goto RESPONSE_FAILED;
0756eb3c
PH
3703
3704 /* We used to send the terminating "." explicitly here, but because of
3705 buffering effects at both ends of TCP/IP connections, you don't gain
3706 anything by keeping it separate, so it might as well go in the final
3707 data buffer for efficiency. This is now done by setting the topt_end_dot
3708 flag above. */
3709
3710 smtp_command = US"end of data";
3711
14de8063 3712 if (sx.peer_offered & OPTION_CHUNKING && sx.cmd_count > 1)
6d5c916c
JH
3713 {
3714 /* Reap any outstanding MAIL & RCPT commands, but not a DATA-go-ahead */
e9166683 3715 switch(sync_responses(&sx, sx.cmd_count-1, 0))
6d5c916c 3716 {
d093f8e5 3717 case 3: sx.ok = TRUE; /* 2xx & 5xx => OK & progress made */
d9c3c8ed 3718 case 2: sx.completed_addr = TRUE; /* 5xx (only) => progress made */
6d5c916c
JH
3719 break;
3720
d093f8e5 3721 case 1: sx.ok = TRUE; /* 2xx (only) => OK, but if LMTP, */
d9c3c8ed 3722 if (!sx.lmtp) sx.completed_addr = TRUE; /* can't tell about progress yet */
6d5c916c
JH
3723 case 0: break; /* No 2xx or 5xx, but no probs */
3724
3725 case -1: goto END_OFF; /* Timeout on RCPT */
ee8b8090
JH
3726
3727#ifdef EXPERIMENTAL_PIPE_CONNECT
3728 case -4: HDEBUG(D_transport)
3729 debug_printf("failed reaping pipelined cmd responses\n");
3730#endif
6d5c916c
JH
3731 default: goto RESPONSE_FAILED; /* I/O error, or any MAIL/DATA error */
3732 }
3733 }
3734
8ccd00b1 3735#ifndef DISABLE_PRDR
ee8b8090
JH
3736 /* For PRDR we optionally get a partial-responses warning followed by the
3737 individual responses, before going on with the overall response. If we don't
3738 get the warning then deal with per non-PRDR. */
3739
d093f8e5 3740 if(sx.prdr_active)
fd98a5c6 3741 {
ee8b8090 3742 sx.ok = smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '3', ob->final_timeout);
d093f8e5 3743 if (!sx.ok && errno == 0) switch(sx.buffer[0])
e027f545 3744 {
d093f8e5
JH
3745 case '2': sx.prdr_active = FALSE;
3746 sx.ok = TRUE;
e027f545
JH
3747 break;
3748 case '4': errno = ERRNO_DATA4XX;
3749 addrlist->more_errno |=
d093f8e5 3750 ((sx.buffer[1] - '0')*10 + sx.buffer[2] - '0') << 8;
e027f545
JH
3751 break;
3752 }
fd98a5c6
JH
3753 }
3754 else
3755#endif
3756
3757 /* For non-PRDR SMTP, we now read a single response that applies to the
3758 whole message. If it is OK, then all the addresses have been delivered. */
0756eb3c 3759
d093f8e5 3760 if (!sx.lmtp)
e97957bc 3761 {
251b9eb4 3762 sx.ok = smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2',
ee8b8090 3763 ob->final_timeout);
d093f8e5 3764 if (!sx.ok && errno == 0 && sx.buffer[0] == '4')
e97957bc
PH
3765 {
3766 errno = ERRNO_DATA4XX;
d093f8e5 3767 addrlist->more_errno |= ((sx.buffer[1] - '0')*10 + sx.buffer[2] - '0') << 8;
e97957bc
PH
3768 }
3769 }
0756eb3c
PH
3770
3771 /* For LMTP, we get back a response for every RCPT command that we sent;
3772 some may be accepted and some rejected. For those that get a response, their
3773 status is fixed; any that are accepted have been handed over, even if later
3774 responses crash - at least, that's how I read RFC 2033.
3775
3776 If all went well, mark the recipient addresses as completed, record which
3777 host/IPaddress they were delivered to, and cut out RSET when sending another
3778 message down the same channel. Write the completed addresses to the journal
3779 now so that they are recorded in case there is a crash of hardware or
3780 software before the spool gets updated. Also record the final SMTP
3781 confirmation if needed (for SMTP only). */
3782
d093f8e5 3783 if (sx.ok)
0756eb3c
PH
3784 {
3785 int flag = '=';
32dfdf8b 3786 struct timeval delivery_time;
0756eb3c 3787 int len;
32dfdf8b 3788 uschar * conf = NULL;
0d9fa8c0 3789
32dfdf8b 3790 timesince(&delivery_time, &start_delivery_time);
d093f8e5 3791 sx.send_rset = FALSE;
0d9fa8c0 3792 pipelining_active = FALSE;
0756eb3c 3793
0756eb3c
PH
3794 /* Set up confirmation if needed - applies only to SMTP */
3795
d68218c7 3796 if (
0cbf2b82 3797#ifdef DISABLE_EVENT
6c6d6e48 3798 LOGGING(smtp_confirmation) &&
a7538db1 3799#endif
d093f8e5 3800 !sx.lmtp
d68218c7 3801 )
0756eb3c 3802 {
d093f8e5 3803 const uschar *s = string_printing(sx.buffer);
55414b25 3804 /* deconst cast ok here as string_printing was checked to have alloc'n'copied */
5903c6ff 3805 conf = (s == sx.buffer)? US string_copy(s) : US s;
0756eb3c
PH
3806 }
3807
fd98a5c6 3808 /* Process all transported addresses - for LMTP or PRDR, read a status for
0756eb3c
PH
3809 each one. */
3810
db3f7b69 3811 for (address_item * addr = addrlist; addr != sx.first_addr; addr = addr->next)
0756eb3c
PH
3812 {
3813 if (addr->transport_return != PENDING_OK) continue;
3814
3815 /* LMTP - if the response fails badly (e.g. timeout), use it for all the
3816 remaining addresses. Otherwise, it's a return code for just the one
75def545
PH
3817 address. For temporary errors, add a retry item for the address so that
3818 it doesn't get tried again too soon. */
0756eb3c 3819
8ccd00b1 3820#ifndef DISABLE_PRDR
d093f8e5 3821 if (sx.lmtp || sx.prdr_active)
fd98a5c6 3822#else
d093f8e5 3823 if (sx.lmtp)
fd98a5c6 3824#endif
0756eb3c 3825 {
251b9eb4 3826 if (!smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2',
ee8b8090 3827 ob->final_timeout))
0756eb3c 3828 {
d093f8e5 3829 if (errno != 0 || sx.buffer[0] == 0) goto RESPONSE_FAILED;
fd98a5c6 3830 addr->message = string_sprintf(
8ccd00b1 3831#ifndef DISABLE_PRDR
d093f8e5 3832 "%s error after %s: %s", sx.prdr_active ? "PRDR":"LMTP",
fd98a5c6
JH
3833#else
3834 "LMTP error after %s: %s",
3835#endif
d093f8e5 3836 data_command, string_printing(sx.buffer));
75def545 3837 setflag(addr, af_pass_message); /* Allow message to go to user */
d093f8e5 3838 if (sx.buffer[0] == '5')
75def545
PH
3839 addr->transport_return = FAIL;
3840 else
3841 {
e97957bc 3842 errno = ERRNO_DATA4XX;
d093f8e5 3843 addr->more_errno |= ((sx.buffer[1] - '0')*10 + sx.buffer[2] - '0') << 8;
75def545 3844 addr->transport_return = DEFER;
8ccd00b1 3845#ifndef DISABLE_PRDR
d093f8e5 3846 if (!sx.prdr_active)
fd98a5c6
JH
3847#endif
3848 retry_add_item(addr, addr->address_retry_key, 0);
75def545 3849 }
0756eb3c
PH
3850 continue;
3851 }
d9c3c8ed 3852 sx.completed_addr = TRUE; /* NOW we can set this flag */
6c6d6e48 3853 if (LOGGING(smtp_confirmation))
c0ea85ab 3854 {
d093f8e5 3855 const uschar *s = string_printing(sx.buffer);
55414b25 3856 /* deconst cast ok here as string_printing was checked to have alloc'n'copied */
d093f8e5 3857 conf = (s == sx.buffer) ? US string_copy(s) : US s;
c0ea85ab 3858 }
0756eb3c
PH
3859 }
3860
3861 /* SMTP, or success return from LMTP for this address. Pass back the
2d280592 3862 actual host that was used. */
0756eb3c
PH
3863
3864 addr->transport_return = OK;
32dfdf8b
JH
3865 addr->more_errno = delivery_time.tv_sec;
3866 addr->delivery_usec = delivery_time.tv_usec;
d427a7f9 3867 addr->host_used = host;
0756eb3c
PH
3868 addr->special_action = flag;
3869 addr->message = conf;
7c576fca 3870
ee8b8090
JH
3871 if (tcp_out_fastopen)
3872 {
3873 setflag(addr, af_tcp_fastopen_conn);
3874 if (tcp_out_fastopen >= TFO_USED_NODATA) setflag(addr, af_tcp_fastopen);
3875 if (tcp_out_fastopen >= TFO_USED_DATA) setflag(addr, af_tcp_fastopen_data);
3876 }
7c576fca 3877 if (sx.pipelining_used) setflag(addr, af_pipelining);
ee8b8090
JH
3878#ifdef EXPERIMENTAL_PIPE_CONNECT
3879 if (sx.early_pipe_active) setflag(addr, af_early_pipe);
3880#endif
8ccd00b1 3881#ifndef DISABLE_PRDR
7eb0e5d2 3882 if (sx.prdr_active) setflag(addr, af_prdr_used);
fd98a5c6 3883#endif
7eb0e5d2 3884 if (sx.peer_offered & OPTION_CHUNKING) setflag(addr, af_chunking_used);
0756eb3c
PH
3885 flag = '-';
3886
8ccd00b1 3887#ifndef DISABLE_PRDR
d093f8e5 3888 if (!sx.prdr_active)
fd98a5c6
JH
3889#endif
3890 {
3891 /* Update the journal. For homonymic addresses, use the base address plus
3892 the transport name. See lots of comments in deliver.c about the reasons
3893 for the complications when homonyms are involved. Just carry on after
3894 write error, as it may prove possible to update the spool file later. */
4d8d62b9 3895
fd98a5c6 3896 if (testflag(addr, af_homonym))
d093f8e5 3897 sprintf(CS sx.buffer, "%.500s/%s\n", addr->unique + 3, tblock->name);
fd98a5c6 3898 else
d093f8e5 3899 sprintf(CS sx.buffer, "%.500s\n", addr->unique);
4d8d62b9 3900
5bfe3b35 3901 DEBUG(D_deliver) debug_printf("S:journalling %s\n", sx.buffer);
d093f8e5
JH
3902 len = Ustrlen(CS sx.buffer);
3903 if (write(journal_fd, sx.buffer, len) != len)
fd98a5c6 3904 log_write(0, LOG_MAIN|LOG_PANIC, "failed to write journal for "
d093f8e5 3905 "%s: %s", sx.buffer, strerror(errno));
fd98a5c6 3906 }
0756eb3c
PH
3907 }
3908
8ccd00b1 3909#ifndef DISABLE_PRDR
d093f8e5 3910 if (sx.prdr_active)
fd98a5c6 3911 {
2556b3c6
SA
3912 const uschar * overall_message;
3913
fd98a5c6
JH
3914 /* PRDR - get the final, overall response. For any non-success
3915 upgrade all the address statuses. */
2556b3c6 3916
251b9eb4 3917 sx.ok = smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2',
ee8b8090 3918 ob->final_timeout);
d093f8e5 3919 if (!sx.ok)
fd98a5c6 3920 {
d093f8e5 3921 if(errno == 0 && sx.buffer[0] == '4')
fd98a5c6
JH
3922 {
3923 errno = ERRNO_DATA4XX;
d093f8e5 3924 addrlist->more_errno |= ((sx.buffer[1] - '0')*10 + sx.buffer[2] - '0') << 8;
fd98a5c6 3925 }
db3f7b69 3926 for (address_item * addr = addrlist; addr != sx.first_addr; addr = addr->next)
d093f8e5 3927 if (sx.buffer[0] == '5' || addr->transport_return == OK)
fd98a5c6
JH
3928 addr->transport_return = PENDING_OK; /* allow set_errno action */
3929 goto RESPONSE_FAILED;
3930 }
3931
2556b3c6
SA
3932 /* Append the overall response to the individual PRDR response for logging
3933 and update the journal, or setup retry. */
3934
3935 overall_message = string_printing(sx.buffer);
db3f7b69 3936 for (address_item * addr = addrlist; addr != sx.first_addr; addr = addr->next)
2556b3c6
SA
3937 if (addr->transport_return == OK)
3938 addr->message = string_sprintf("%s\\n%s", addr->message, overall_message);
3939
db3f7b69 3940 for (address_item * addr = addrlist; addr != sx.first_addr; addr = addr->next)
fd98a5c6 3941 if (addr->transport_return == OK)
9be4572b
JH
3942 {
3943 if (testflag(addr, af_homonym))
3944 sprintf(CS sx.buffer, "%.500s/%s\n", addr->unique + 3, tblock->name);
3945 else
3946 sprintf(CS sx.buffer, "%.500s\n", addr->unique);
3947
3948 DEBUG(D_deliver) debug_printf("journalling(PRDR) %s\n", sx.buffer);
3949 len = Ustrlen(CS sx.buffer);
3950 if (write(journal_fd, sx.buffer, len) != len)
3951 log_write(0, LOG_MAIN|LOG_PANIC, "failed to write journal for "
3952 "%s: %s", sx.buffer, strerror(errno));
3953 }
3954 else if (addr->transport_return == DEFER)
3955 retry_add_item(addr, addr->address_retry_key, -2);
fd98a5c6
JH
3956 }
3957#endif
3958
0756eb3c
PH
3959 /* Ensure the journal file is pushed out to disk. */
3960
54fc8428 3961 if (EXIMfsync(journal_fd) < 0)
0756eb3c
PH
3962 log_write(0, LOG_MAIN|LOG_PANIC, "failed to fsync journal: %s",
3963 strerror(errno));
3964 }
3965 }
3966
3967
3968/* Handle general (not specific to one address) failures here. The value of ok
3969is used to skip over this code on the falling through case. A timeout causes a
3970deferral. Other errors may defer or fail according to the response code, and
3971may set up a special errno value, e.g. after connection chopped, which is
3972assumed if errno == 0 and there is no text in the buffer. If control reaches
3973here during the setting up phase (i.e. before MAIL FROM) then always defer, as
3974the problem is not related to this specific message. */
3975
d093f8e5 3976if (!sx.ok)
0756eb3c 3977 {
895fbaf2
JH
3978 int code, set_rc;
3979 uschar * set_message;
0756eb3c
PH
3980
3981 RESPONSE_FAILED:
895fbaf2
JH
3982 {
3983 save_errno = errno;
3984 message = NULL;
d093f8e5
JH
3985 sx.send_quit = check_response(host, &save_errno, addrlist->more_errno,
3986 sx.buffer, &code, &message, &pass_message);
895fbaf2
JH
3987 goto FAILED;
3988 }
0756eb3c
PH
3989
3990 SEND_FAILED:
895fbaf2
JH
3991 {
3992 save_errno = errno;
3993 code = '4';
b9df1829 3994 message = string_sprintf("send() to %s [%s] failed: %s",
c0ad8edf 3995 host->name, host->address, message ? message : US strerror(save_errno));
d093f8e5 3996 sx.send_quit = FALSE;
895fbaf2
JH
3997 goto FAILED;
3998 }
0756eb3c 3999
0756eb3c 4000 FAILED:
9be4572b
JH
4001 {
4002 BOOL message_error;
0756eb3c 4003
9be4572b
JH
4004 sx.ok = FALSE; /* For when reached by GOTO */
4005 set_message = message;
0756eb3c 4006
e97957bc 4007 /* We want to handle timeouts after MAIL or "." and loss of connection after
0756eb3c 4008 "." specially. They can indicate a problem with the sender address or with
e97957bc
PH
4009 the contents of the message rather than a real error on the connection. These
4010 cases are treated in the same way as a 4xx response. This next bit of code
4011 does the classification. */
0756eb3c 4012
e97957bc
PH
4013 switch(save_errno)
4014 {
4015 case 0:
4016 case ERRNO_MAIL4XX:
4017 case ERRNO_DATA4XX:
250b6871
JH
4018 message_error = TRUE;
4019 break;
0756eb3c 4020
e97957bc 4021 case ETIMEDOUT:
250b6871
JH
4022 message_error = Ustrncmp(smtp_command,"MAIL",4) == 0 ||
4023 Ustrncmp(smtp_command,"end ",4) == 0;
4024 break;
e97957bc
PH
4025
4026 case ERRNO_SMTPCLOSED:
250b6871
JH
4027 message_error = Ustrncmp(smtp_command,"end ",4) == 0;
4028 break;
e97957bc
PH
4029
4030 default:
250b6871
JH
4031 message_error = FALSE;
4032 break;
e97957bc 4033 }
0756eb3c 4034
e97957bc 4035 /* Handle the cases that are treated as message errors. These are:
0756eb3c 4036
e97957bc
PH
4037 (a) negative response or timeout after MAIL
4038 (b) negative response after DATA
4039 (c) negative response or timeout or dropped connection after "."
250b6871 4040 (d) utf8 support required and not offered
0756eb3c 4041
e97957bc
PH
4042 It won't be a negative response or timeout after RCPT, as that is dealt
4043 with separately above. The action in all cases is to set an appropriate
4044 error code for all the addresses, but to leave yield set to OK because the
4045 host itself has not failed. Of course, it might in practice have failed
4046 when we've had a timeout, but if so, we'll discover that at the next
4047 delivery attempt. For a temporary error, set the message_defer flag, and
4048 write to the logs for information if this is not the last host. The error
4049 for the last host will be logged as part of the address's log line. */
4050
4051 if (message_error)
0756eb3c 4052 {
e97957bc 4053 if (mua_wrapper) code = '5'; /* Force hard failure in wrapper mode */
e97957bc
PH
4054
4055 /* If there's an errno, the message contains just the identity of
4056 the host. */
4057
895fbaf2
JH
4058 if (code == '5')
4059 set_rc = FAIL;
4060 else /* Anything other than 5 is treated as temporary */
e97957bc 4061 {
895fbaf2 4062 set_rc = DEFER;
e97957bc
PH
4063 if (save_errno > 0)
4064 message = US string_sprintf("%s: %s", message, strerror(save_errno));
ec62d0a9
HSHR
4065
4066 write_logs(host, message, sx.first_addr ? sx.first_addr->basic_errno : 0);
4067
e97957bc
PH
4068 *message_defer = TRUE;
4069 }
4070 }
4071
4072 /* Otherwise, we have an I/O error or a timeout other than after MAIL or
4073 ".", or some other transportation error. We defer all addresses and yield
4074 DEFER, except for the case of failed add_headers expansion, or a transport
4075 filter failure, when the yield should be ERROR, to stop it trying other
4076 hosts. */
4077
4078 else
4079 {
ee8b8090
JH
4080#ifdef EXPERIMENTAL_PIPE_CONNECT
4081 /* If we were early-pipelinng and the actual EHLO response did not match
4082 the cached value we assumed, we could have detected it and passed a
4083 custom errno through to here. It would be nice to RSET and retry right
4084 away, but to reliably do that we eould need an extra synch point before
4085 we committed to data and that would discard half the gained roundrips.
4086 Or we could summarily drop the TCP connection. but that is also ugly.
4087 Instead, we ignore the possibility (having freshened the cache) and rely
4088 on the server telling us with a nonmessage error if we have tried to
4089 do something it no longer supports. */
4090#endif
895fbaf2 4091 set_rc = DEFER;
e97957bc 4092 yield = (save_errno == ERRNO_CHHEADER_FAIL ||
ee8b8090 4093 save_errno == ERRNO_FILTER_FAIL) ? ERROR : DEFER;
0756eb3c
PH
4094 }
4095 }
895fbaf2
JH
4096
4097 set_errno(addrlist, save_errno, set_message, set_rc, pass_message, host
4098#ifdef EXPERIMENTAL_DSN_INFO
d093f8e5 4099 , sx.smtp_greeting, sx.helo_response
895fbaf2
JH
4100#endif
4101 );
0756eb3c
PH
4102 }
4103
4104
4105/* If all has gone well, send_quit will be set TRUE, implying we can end the
4106SMTP session tidily. However, if there were too many addresses to send in one
4107message (indicated by first_addr being non-NULL) we want to carry on with the
4108rest of them. Also, it is desirable to send more than one message down the SMTP
4109connection if there are several waiting, provided we haven't already sent so
4110many as to hit the configured limit. The function transport_check_waiting looks
4111for a waiting message and returns its id. Then transport_pass_socket tries to
4112set up a continued delivery by passing the socket on to another process. The
4113variable send_rset is FALSE if a message has just been successfully transfered.
4114
4115If we are already sending down a continued channel, there may be further
4116addresses not yet delivered that are aimed at the same host, but which have not
4117been passed in this run of the transport. In this case, continue_more will be
4118true, and all we should do is send RSET if necessary, and return, leaving the
4119channel open.
4120
4121However, if no address was disposed of, i.e. all addresses got 4xx errors, we
4122do not want to continue with other messages down the same channel, because that
4123can lead to looping between two or more messages, all with the same,
4124temporarily failing address(es). [The retry information isn't updated yet, so
4125new processes keep on trying.] We probably also don't want to try more of this
4126message's addresses either.
4127
4128If we have started a TLS session, we have to end it before passing the
4129connection to a new process. However, not all servers can handle this (Exim
4130can), so we do not pass such a connection on if the host matches
4131hosts_nopass_tls. */
4132
4133DEBUG(D_transport)
4134 debug_printf("ok=%d send_quit=%d send_rset=%d continue_more=%d "
d093f8e5 4135 "yield=%d first_address is %sNULL\n", sx.ok, sx.send_quit,
8768d548 4136 sx.send_rset, f.continue_more, yield, sx.first_addr ? "not " : "");
0756eb3c 4137
d9c3c8ed 4138if (sx.completed_addr && sx.ok && sx.send_quit)
0756eb3c
PH
4139 {
4140 BOOL more;
a39bd74d
JB
4141 smtp_compare_t t_compare;
4142
4143 t_compare.tblock = tblock;
4144 t_compare.current_sender_address = sender_address;
4145
d9c3c8ed 4146 if ( sx.first_addr != NULL
8768d548 4147 || f.continue_more
875512a3
JH
4148 || (
4149#ifdef SUPPORT_TLS
74f1a423 4150 ( tls_out.active.sock < 0 && !continue_proxy_cipher
ee8b8090 4151 || verify_check_given_host(CUSS &ob->hosts_nopass_tls, host) != OK
5130845b 4152 )
0756eb3c 4153 &&
875512a3 4154#endif
0756eb3c 4155 transport_check_waiting(tblock->name, host->name,
a39bd74d
JB
4156 tblock->connection_max_messages, new_message_id, &more,
4157 (oicf)smtp_are_same_identities, (void*)&t_compare)
5130845b 4158 ) )
0756eb3c
PH
4159 {
4160 uschar *msg;
447d236c 4161 BOOL pass_message;
0756eb3c 4162
d093f8e5 4163 if (sx.send_rset)
251b9eb4 4164 if (! (sx.ok = smtp_write_command(&sx, SCMD_FLUSH, "RSET\r\n") >= 0))
0756eb3c
PH
4165 {
4166 msg = US string_sprintf("send() to %s [%s] failed: %s", host->name,
9e7e0f6a 4167 host->address, strerror(errno));
d093f8e5 4168 sx.send_quit = FALSE;
0756eb3c 4169 }
ee8b8090
JH
4170 else if (! (sx.ok = smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer),
4171 '2', ob->command_timeout)))
0756eb3c
PH
4172 {
4173 int code;
d093f8e5 4174 sx.send_quit = check_response(host, &errno, 0, sx.buffer, &code, &msg,
447d236c 4175 &pass_message);
d093f8e5 4176 if (!sx.send_quit)
0756eb3c 4177 {
c562fd30
JH
4178 DEBUG(D_transport) debug_printf("H=%s [%s] %s\n",
4179 host->name, host->address, msg);
0756eb3c
PH
4180 }
4181 }
0756eb3c
PH
4182
4183 /* Either RSET was not needed, or it succeeded */
4184
d093f8e5 4185 if (sx.ok)
0756eb3c 4186 {
13c7874e 4187#ifdef SUPPORT_TLS
875512a3 4188 int pfd[2];
13c7874e 4189#endif
74f1a423 4190 int socket_fd = sx.cctx.sock;
875512a3
JH
4191
4192
4193 if (sx.first_addr != NULL) /* More addresses still to be sent */
0756eb3c
PH
4194 { /* in this run of the transport */
4195 continue_sequence++; /* Causes * in logging */
4196 goto SEND_MESSAGE;
4197 }
0756eb3c 4198
b7d3afcf
JH
4199 /* Unless caller said it already has more messages listed for this host,
4200 pass the connection on to a new Exim process (below, the call to
4201 transport_pass_socket). If the caller has more ready, just return with
4202 the connection still open. */
4203
a7538db1 4204#ifdef SUPPORT_TLS
74f1a423 4205 if (tls_out.active.sock >= 0)
8768d548 4206 if ( f.continue_more
ee8b8090 4207 || verify_check_given_host(CUSS &ob->hosts_noproxy_tls, host) == OK)
875512a3 4208 {
b7d3afcf
JH
4209 /* Before passing the socket on, or returning to caller with it still
4210 open, we must shut down TLS. Not all MTAs allow for the continuation
4211 of the SMTP session when TLS is shut down. We test for this by sending
4212 a new EHLO. If we don't get a good response, we don't attempt to pass
4213 the socket on. */
875512a3 4214
74f1a423 4215 tls_close(sx.cctx.tls_ctx, TLS_SHUTDOWN_WAIT);
c645dd29 4216 sx.cctx.tls_ctx = NULL;
875512a3
JH
4217 smtp_peer_options = smtp_peer_options_wrap;
4218 sx.ok = !sx.smtps
251b9eb4
JH
4219 && smtp_write_command(&sx, SCMD_FLUSH, "EHLO %s\r\n", sx.helo_data)
4220 >= 0
4221 && smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer),
ee8b8090 4222 '2', ob->command_timeout);
b7d3afcf 4223
8768d548 4224 if (sx.ok && f.continue_more)
b7d3afcf 4225 return yield; /* More addresses for another run */
875512a3
JH
4226 }
4227 else
4228 {
4229 /* Set up a pipe for proxying TLS for the new transport process */
4230
14de8063 4231 smtp_peer_options |= OPTION_TLS;
fa18eebc 4232 if (sx.ok = (socketpair(AF_UNIX, SOCK_STREAM, 0, pfd) == 0))
875512a3
JH
4233 socket_fd = pfd[1];
4234 else
4235 set_errno(sx.first_addr, errno, US"internal allocation problem",
4236 DEFER, FALSE, host
4237# ifdef EXPERIMENTAL_DSN_INFO
4238 , sx.smtp_greeting, sx.helo_response
4239# endif
4240 );
4241 }
b7d3afcf 4242 else
a7538db1 4243#endif
8768d548 4244 if (f.continue_more)
b7d3afcf 4245 return yield; /* More addresses for another run */
0756eb3c 4246
4c04137d 4247 /* If the socket is successfully passed, we mustn't send QUIT (or
0756eb3c
PH
4248 indeed anything!) from here. */
4249
895fbaf2
JH
4250/*XXX DSN_INFO: assume likely to do new HELO; but for greet we'll want to
4251propagate it from the initial
4252*/
d093f8e5 4253 if (sx.ok && transport_pass_socket(tblock->name, host->name,
875512a3
JH
4254 host->address, new_message_id, socket_fd))
4255 {
d093f8e5 4256 sx.send_quit = FALSE;
875512a3 4257
d097cc73
JH
4258 /* We have passed the client socket to a fresh transport process.
4259 If TLS is still active, we need to proxy it for the transport we
875512a3
JH
4260 just passed the baton to. Fork a child to to do it, and return to
4261 get logging done asap. Which way to place the work makes assumptions
4262 about post-fork prioritisation which may not hold on all platforms. */
57cc2785 4263#ifdef SUPPORT_TLS
74f1a423 4264 if (tls_out.active.sock >= 0)
875512a3
JH
4265 {
4266 int pid = fork();
d097cc73 4267 if (pid == 0) /* child; fork again to disconnect totally */
626810b9 4268 {
8768d548 4269 if (f.running_in_test_harness) millisleep(100); /* let parent debug out */
d097cc73 4270 /* does not return */
74f1a423 4271 smtp_proxy_tls(sx.cctx.tls_ctx, sx.buffer, sizeof(sx.buffer), pfd,
ee8b8090 4272 ob->command_timeout);
626810b9 4273 }
d097cc73 4274
875512a3
JH
4275 if (pid > 0) /* parent */
4276 {
b7d3afcf 4277 DEBUG(D_transport) debug_printf("proxy-proc inter-pid %d\n", pid);
e47252f5 4278 close(pfd[0]);
d097cc73 4279 /* tidy the inter-proc to disconn the proxy proc */
60272099 4280 waitpid(pid, NULL, 0);
74f1a423
JH
4281 tls_close(sx.cctx.tls_ctx, TLS_NO_SHUTDOWN);
4282 sx.cctx.tls_ctx = NULL;
4283 (void)close(sx.cctx.sock);
4284 sx.cctx.sock = -1;
875512a3
JH
4285 continue_transport = NULL;
4286 continue_hostname = NULL;
4287 return yield;
4288 }
d097cc73 4289 log_write(0, LOG_PANIC_DIE, "fork failed");
875512a3 4290 }
57cc2785 4291#endif
875512a3 4292 }
0756eb3c
PH
4293 }
4294
4295 /* If RSET failed and there are addresses left, they get deferred. */
875512a3
JH
4296 else
4297 set_errno(sx.first_addr, errno, msg, DEFER, FALSE, host
895fbaf2 4298#ifdef EXPERIMENTAL_DSN_INFO
d093f8e5 4299 , sx.smtp_greeting, sx.helo_response
895fbaf2
JH
4300#endif
4301 );
0756eb3c
PH
4302 }
4303 }
4304
4305/* End off tidily with QUIT unless the connection has died or the socket has
4306been passed to another process. There has been discussion on the net about what
4307to do after sending QUIT. The wording of the RFC suggests that it is necessary
4308to wait for a response, but on the other hand, there isn't anything one can do
4309with an error response, other than log it. Exim used to do that. However,
4310further discussion suggested that it is positively advantageous not to wait for
4311the response, but to close the session immediately. This is supposed to move
4312the TCP/IP TIME_WAIT state from the server to the client, thereby removing some
4313load from the server. (Hosts that are both servers and clients may not see much
4314difference, of course.) Further discussion indicated that this was safe to do
4315on Unix systems which have decent implementations of TCP/IP that leave the
4316connection around for a while (TIME_WAIT) after the application has gone away.
4317This enables the response sent by the server to be properly ACKed rather than
4318timed out, as can happen on broken TCP/IP implementations on other OS.
4319
4320This change is being made on 31-Jul-98. After over a year of trouble-free
4321operation, the old commented-out code was removed on 17-Sep-99. */
4322
4323SEND_QUIT:
a7846940
JH
4324#ifdef TCP_CORK
4325(void) setsockopt(sx.cctx.sock, IPPROTO_TCP, TCP_CORK, US &on, sizeof(on));
4326#endif
251b9eb4 4327if (sx.send_quit) (void)smtp_write_command(&sx, SCMD_FLUSH, "QUIT\r\n");
0756eb3c
PH
4328
4329END_OFF:
4330
4331#ifdef SUPPORT_TLS
74f1a423 4332tls_close(sx.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
c645dd29 4333sx.cctx.tls_ctx = NULL;
0756eb3c
PH
4334#endif
4335
4336/* Close the socket, and return the appropriate value, first setting
0756eb3c
PH
4337works because the NULL setting is passed back to the calling process, and
4338remote_max_parallel is forced to 1 when delivering over an existing connection,
4339
4340If all went well and continue_more is set, we shouldn't actually get here if
4341there are further addresses, as the return above will be taken. However,
4342writing RSET might have failed, or there may be other addresses whose hosts are
4343specified in the transports, and therefore not visible at top level, in which
4344case continue_more won't get set. */
4345
e1d04f48 4346HDEBUG(D_transport|D_acl|D_v) debug_printf_indent(" SMTP(close)>>\n");
d093f8e5 4347if (sx.send_quit)
60d10ce7 4348 {
74f1a423 4349 shutdown(sx.cctx.sock, SHUT_WR);
ee8b8090 4350 millisleep(f.running_in_test_harness ? 200 : 20);
74f1a423 4351 if (fcntl(sx.cctx.sock, F_SETFL, O_NONBLOCK) == 0)
db3f7b69
JH
4352 for (int i = 16; read(sx.cctx.sock, sx.inbuffer, sizeof(sx.inbuffer)) > 0 && i > 0;)
4353 i--; /* drain socket */
60d10ce7 4354 }
74f1a423 4355(void)close(sx.cctx.sock);
a7538db1 4356
0cbf2b82 4357#ifndef DISABLE_EVENT
774ef2d7 4358(void) event_raise(tblock->event_action, US"tcp:close", NULL);
a7538db1
JH
4359#endif
4360
0756eb3c
PH
4361continue_transport = NULL;
4362continue_hostname = NULL;
4363return yield;
4364}
4365
4366
4367
4368
4369/*************************************************
4370* Closedown entry point *
4371*************************************************/
4372
4373/* This function is called when exim is passed an open smtp channel
4374from another incarnation, but the message which it has been asked
4375to deliver no longer exists. The channel is on stdin.
4376
4377We might do fancy things like looking for another message to send down
4378the channel, but if the one we sought has gone, it has probably been
4379delivered by some other process that itself will seek further messages,
4380so just close down our connection.
4381
4382Argument: pointer to the transport instance block
4383Returns: nothing
4384*/
4385
4386void
4387smtp_transport_closedown(transport_instance *tblock)
4388{
ee8b8090 4389smtp_transport_options_block * ob = SOB tblock->options_block;
74f1a423 4390client_conn_ctx cctx;
251b9eb4 4391smtp_context sx;
0756eb3c
PH
4392uschar buffer[256];
4393uschar inbuffer[4096];
4394uschar outbuffer[16];
4395
74f1a423
JH
4396/*XXX really we need an active-smtp-client ctx, rather than assuming stdout */
4397cctx.sock = fileno(stdin);
4398cctx.tls_ctx = cctx.sock == tls_out.active.sock ? tls_out.active.tls_ctx : NULL;
4399
251b9eb4
JH
4400sx.inblock.cctx = &cctx;
4401sx.inblock.buffer = inbuffer;
4402sx.inblock.buffersize = sizeof(inbuffer);
4403sx.inblock.ptr = inbuffer;
4404sx.inblock.ptrend = inbuffer;
4405
4406sx.outblock.cctx = &cctx;
4407sx.outblock.buffersize = sizeof(outbuffer);
4408sx.outblock.buffer = outbuffer;
4409sx.outblock.ptr = outbuffer;
4410sx.outblock.cmd_count = 0;
4411sx.outblock.authenticating = FALSE;
4412
4413(void)smtp_write_command(&sx, SCMD_FLUSH, "QUIT\r\n");
4414(void)smtp_read_response(&sx, buffer, sizeof(buffer), '2', ob->command_timeout);
74f1a423 4415(void)close(cctx.sock);
0756eb3c
PH
4416}
4417
4418
4419
4420/*************************************************
4421* Prepare addresses for delivery *
4422*************************************************/
4423
4424/* This function is called to flush out error settings from previous delivery
4425attempts to other hosts. It also records whether we got here via an MX record
4426or not in the more_errno field of the address. We are interested only in
4427addresses that are still marked DEFER - others may have got delivered to a
4428previously considered IP address. Set their status to PENDING_DEFER to indicate
4429which ones are relevant this time.
4430
4431Arguments:
4432 addrlist the list of addresses
4433 host the host we are delivering to
4434
4435Returns: the first address for this delivery
4436*/
4437
4438static address_item *
4439prepare_addresses(address_item *addrlist, host_item *host)
4440{
4441address_item *first_addr = NULL;
db3f7b69 4442for (address_item * addr = addrlist; addr; addr = addr->next)
168dec3b
JH
4443 if (addr->transport_return == DEFER)
4444 {
7b4c8c1f 4445 if (!first_addr) first_addr = addr;
168dec3b
JH
4446 addr->transport_return = PENDING_DEFER;
4447 addr->basic_errno = 0;
4448 addr->more_errno = (host->mx >= 0)? 'M' : 'A';
4449 addr->message = NULL;
a7538db1 4450#ifdef SUPPORT_TLS
168dec3b
JH
4451 addr->cipher = NULL;
4452 addr->ourcert = NULL;
4453 addr->peercert = NULL;
4454 addr->peerdn = NULL;
4455 addr->ocsp = OCSP_NOT_REQ;
895fbaf2
JH
4456#endif
4457#ifdef EXPERIMENTAL_DSN_INFO
4458 addr->smtp_greeting = NULL;
4459 addr->helo_response = NULL;
a7538db1 4460#endif
168dec3b 4461 }
0756eb3c
PH
4462return first_addr;
4463}
4464
4465
4466
4467/*************************************************
4468* Main entry point *
4469*************************************************/
4470
4471/* See local README for interface details. As this is a remote transport, it is
4472given a chain of addresses to be delivered in one connection, if possible. It
4473always returns TRUE, indicating that each address has its own independent
4474status set, except if there is a setting up problem, in which case it returns
4475FALSE. */
4476
4477BOOL
4478smtp_transport_entry(
4479 transport_instance *tblock, /* data for this instantiation */
4480 address_item *addrlist) /* addresses we are working on */
4481{
a843a57e 4482int defport;
0756eb3c
PH
4483int hosts_defer = 0;
4484int hosts_fail = 0;
4485int hosts_looked_up = 0;
4486int hosts_retry = 0;
4487int hosts_serial = 0;
4488int hosts_total = 0;
8e669ac1 4489int total_hosts_tried = 0;
0756eb3c 4490BOOL expired = TRUE;
0756eb3c
PH
4491uschar *expanded_hosts = NULL;
4492uschar *pistring;
4493uschar *tid = string_sprintf("%s transport", tblock->name);
ee8b8090 4494smtp_transport_options_block *ob = SOB tblock->options_block;
0756eb3c 4495host_item *hostlist = addrlist->host_list;
190404d7 4496host_item *host = NULL;
0756eb3c
PH
4497
4498DEBUG(D_transport)
4499 {
4500 debug_printf("%s transport entered\n", tblock->name);
db3f7b69 4501 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c 4502 debug_printf(" %s\n", addr->address);
7b4c8c1f
JH
4503 if (hostlist)
4504 {
4505 debug_printf("hostlist:\n");
db3f7b69 4506 for (host_item * host = hostlist; host; host = host->next)
f8ea1886 4507 debug_printf(" '%s' IP %s port %d\n", host->name, host->address, host->port);
7b4c8c1f 4508 }
57cc2785
JH
4509 if (continue_hostname)
4510 debug_printf("already connected to %s [%s] (on fd %d)\n",
4511 continue_hostname, continue_host_address,
74f1a423 4512 cutthrough.cctx.sock >= 0 ? cutthrough.cctx.sock : 0);
0756eb3c
PH
4513 }
4514
f6c332bd
PH
4515/* Set the flag requesting that these hosts be added to the waiting
4516database if the delivery fails temporarily or if we are running with
4517queue_smtp or a 2-stage queue run. This gets unset for certain
4518kinds of error, typically those that are specific to the message. */
4519
4520update_waiting = TRUE;
4521
0756eb3c
PH
4522/* If a host list is not defined for the addresses - they must all have the
4523same one in order to be passed to a single transport - or if the transport has
4524a host list with hosts_override set, use the host list supplied with the
4525transport. It is an error for this not to exist. */
4526
8ac90765
JH
4527#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
4528if (tls_requiretls & REQUIRETLS_MSG)
4529 ob->tls_tempfail_tryclear = FALSE; /*XXX surely we should have a local for this
4530 rather than modifying the transport? */
4531#endif
4532
7b4c8c1f 4533if (!hostlist || (ob->hosts_override && ob->hosts))
0756eb3c 4534 {
7b4c8c1f 4535 if (!ob->hosts)
0756eb3c
PH
4536 {
4537 addrlist->message = string_sprintf("%s transport called with no hosts set",
4538 tblock->name);
4539 addrlist->transport_return = PANIC;
4540 return FALSE; /* Only top address has status */
4541 }
4542
4543 DEBUG(D_transport) debug_printf("using the transport's hosts: %s\n",
4544 ob->hosts);
4545
4546 /* If the transport's host list contains no '$' characters, and we are not
4547 randomizing, it is fixed and therefore a chain of hosts can be built once
4548 and for all, and remembered for subsequent use by other calls to this
4549 transport. If, on the other hand, the host list does contain '$', or we are
4550 randomizing its order, we have to rebuild it each time. In the fixed case,
4551 as the hosts string will never be used again, it doesn't matter that we
4552 replace all the : characters with zeros. */
4553
7b4c8c1f 4554 if (!ob->hostlist)
0756eb3c
PH
4555 {
4556 uschar *s = ob->hosts;
4557
4558 if (Ustrchr(s, '$') != NULL)
4559 {
d427a7f9 4560 if (!(expanded_hosts = expand_string(s)))
0756eb3c
PH
4561 {
4562 addrlist->message = string_sprintf("failed to expand list of hosts "
4563 "\"%s\" in %s transport: %s", s, tblock->name, expand_string_message);
8768d548 4564 addrlist->transport_return = f.search_find_defer ? DEFER : PANIC;
0756eb3c
PH
4565 return FALSE; /* Only top address has status */
4566 }
4567 DEBUG(D_transport) debug_printf("expanded list of hosts \"%s\" to "
4568 "\"%s\"\n", s, expanded_hosts);
4569 s = expanded_hosts;
4570 }
4571 else
4572 if (ob->hosts_randomize) s = expanded_hosts = string_copy(s);
4573
4574 host_build_hostlist(&hostlist, s, ob->hosts_randomize);
4575
e276e04b 4576 /* Check that the expansion yielded something useful. */
7b4c8c1f 4577 if (!hostlist)
e276e04b
TF
4578 {
4579 addrlist->message =
4580 string_sprintf("%s transport has empty hosts setting", tblock->name);
4581 addrlist->transport_return = PANIC;
4582 return FALSE; /* Only top address has status */
4583 }
4584
0756eb3c
PH
4585 /* If there was no expansion of hosts, save the host list for
4586 next time. */
4587
d427a7f9 4588 if (!expanded_hosts) ob->hostlist = hostlist;
0756eb3c
PH
4589 }
4590
4591 /* This is not the first time this transport has been run in this delivery;
4592 the host list was built previously. */
4593
55414b25
JH
4594 else
4595 hostlist = ob->hostlist;
0756eb3c
PH
4596 }
4597
4598/* The host list was supplied with the address. If hosts_randomize is set, we
4599must sort it into a random order if it did not come from MX records and has not
4600already been randomized (but don't bother if continuing down an existing
4601connection). */
4602
7b4c8c1f 4603else if (ob->hosts_randomize && hostlist->mx == MX_NONE && !continue_hostname)
0756eb3c
PH
4604 {
4605 host_item *newlist = NULL;
7b4c8c1f 4606 while (hostlist)
0756eb3c
PH
4607 {
4608 host_item *h = hostlist;
4609 hostlist = hostlist->next;
4610
4611 h->sort_key = random_number(100);
4612
7b4c8c1f 4613 if (!newlist)
0756eb3c
PH
4614 {
4615 h->next = NULL;
4616 newlist = h;
4617 }
4618 else if (h->sort_key < newlist->sort_key)
4619 {
4620 h->next = newlist;
4621 newlist = h;
4622 }
4623 else
4624 {
4625 host_item *hh = newlist;
7b4c8c1f 4626 while (hh->next)
0756eb3c
PH
4627 {
4628 if (h->sort_key < hh->next->sort_key) break;
4629 hh = hh->next;
4630 }
4631 h->next = hh->next;
4632 hh->next = h;
4633 }
4634 }
4635
4636 hostlist = addrlist->host_list = newlist;
4637 }
4638
2d280592 4639/* Sort out the default port. */
0756eb3c 4640
a843a57e 4641if (!smtp_get_port(ob->port, addrlist, &defport, tid)) return FALSE;
0756eb3c 4642
0756eb3c
PH
4643/* For each host-plus-IP-address on the list:
4644
4645. If this is a continued delivery and the host isn't the one with the
4646 current connection, skip.
4647
4648. If the status is unusable (i.e. previously failed or retry checked), skip.
4649
4650. If no IP address set, get the address, either by turning the name into
4651 an address, calling gethostbyname if gethostbyname is on, or by calling
4652 the DNS. The DNS may yield multiple addresses, in which case insert the
4653 extra ones into the list.
4654
4655. Get the retry data if not previously obtained for this address and set the
4656 field which remembers the state of this address. Skip if the retry time is
4657 not reached. If not, remember whether retry data was found. The retry string
4658 contains both the name and the IP address.
4659
4660. Scan the list of addresses and mark those whose status is DEFER as
4661 PENDING_DEFER. These are the only ones that will be processed in this cycle
4662 of the hosts loop.
4663
4664. Make a delivery attempt - addresses marked PENDING_DEFER will be tried.
4665 Some addresses may be successfully delivered, others may fail, and yet
4666 others may get temporary errors and so get marked DEFER.
4667
4668. The return from the delivery attempt is OK if a connection was made and a
4669 valid SMTP dialogue was completed. Otherwise it is DEFER.
4670
4671. If OK, add a "remove" retry item for this host/IPaddress, if any.
4672
4673. If fail to connect, or other defer state, add a retry item.
4674
4675. If there are any addresses whose status is still DEFER, carry on to the
4676 next host/IPaddress, unless we have tried the number of hosts given
533244af 4677 by hosts_max_try or hosts_max_try_hardlimit; otherwise return. Note that
8e669ac1
PH
4678 there is some fancy logic for hosts_max_try that means its limit can be
4679 overstepped in some circumstances.
0756eb3c
PH
4680
4681If we get to the end of the list, all hosts have deferred at least one address,
4682or not reached their retry times. If delay_after_cutoff is unset, it requests a
4683delivery attempt to those hosts whose last try was before the arrival time of
4684the current message. To cope with this, we have to go round the loop a second
4685time. After that, set the status and error data for any addresses that haven't
4686had it set already. */
4687
db3f7b69 4688for (int cutoff_retry = 0;
7b4c8c1f 4689 expired && cutoff_retry < (ob->delay_after_cutoff ? 1 : 2);
0756eb3c
PH
4690 cutoff_retry++)
4691 {
4692 host_item *nexthost = NULL;
4693 int unexpired_hosts_tried = 0;
2577f55f 4694 BOOL continue_host_tried = FALSE;
0756eb3c 4695
2577f55f 4696retry_non_continued:
0756eb3c 4697 for (host = hostlist;
7b4c8c1f
JH
4698 host
4699 && unexpired_hosts_tried < ob->hosts_max_try
4700 && total_hosts_tried < ob->hosts_max_try_hardlimit;
0756eb3c
PH
4701 host = nexthost)
4702 {
4703 int rc;
4704 int host_af;
0756eb3c
PH
4705 BOOL host_is_expired = FALSE;
4706 BOOL message_defer = FALSE;
0756eb3c
PH
4707 BOOL some_deferred = FALSE;
4708 address_item *first_addr = NULL;
4709 uschar *interface = NULL;
4710 uschar *retry_host_key = NULL;
4711 uschar *retry_message_key = NULL;
4712 uschar *serialize_key = NULL;
4713
9c4e8f60
PH
4714 /* Default next host is next host. :-) But this can vary if the
4715 hosts_max_try limit is hit (see below). It may also be reset if a host
4716 address is looked up here (in case the host was multihomed). */
4717
4718 nexthost = host->next;
4719
0756eb3c
PH
4720 /* If the address hasn't yet been obtained from the host name, look it up
4721 now, unless the host is already marked as unusable. If it is marked as
4722 unusable, it means that the router was unable to find its IP address (in
4723 the DNS or wherever) OR we are in the 2nd time round the cutoff loop, and
4724 the lookup failed last time. We don't get this far if *all* MX records
4725 point to non-existent hosts; that is treated as a hard error.
4726
4727 We can just skip this host entirely. When the hosts came from the router,
4728 the address will timeout based on the other host(s); when the address is
4729 looked up below, there is an explicit retry record added.
4730
4731 Note that we mustn't skip unusable hosts if the address is not unset; they
4732 may be needed as expired hosts on the 2nd time round the cutoff loop. */
4733
7b4c8c1f 4734 if (!host->address)
0756eb3c 4735 {
322050c2 4736 int new_port, flags;
0756eb3c
PH
4737
4738 if (host->status >= hstatus_unusable)
4739 {
4740 DEBUG(D_transport) debug_printf("%s has no address and is unusable - skipping\n",
4741 host->name);
4742 continue;
4743 }
4744
4745 DEBUG(D_transport) debug_printf("getting address for %s\n", host->name);
4746
7cd1141b
PH
4747 /* The host name is permitted to have an attached port. Find it, and
4748 strip it from the name. Just remember it for now. */
4749
4750 new_port = host_item_get_port(host);
4751
4752 /* Count hosts looked up */
4753
0756eb3c
PH
4754 hosts_looked_up++;
4755
4756 /* Find by name if so configured, or if it's an IP address. We don't
4757 just copy the IP address, because we need the test-for-local to happen. */
4758
66387a73 4759 flags = HOST_FIND_BY_A | HOST_FIND_BY_AAAA;
322050c2
PH
4760 if (ob->dns_qualify_single) flags |= HOST_FIND_QUALIFY_SINGLE;
4761 if (ob->dns_search_parents) flags |= HOST_FIND_SEARCH_PARENTS;
4762
7e66e54d 4763 if (ob->gethostbyname || string_is_ip_address(host->name, NULL) != 0)
55414b25 4764 rc = host_find_byname(host, NULL, flags, NULL, TRUE);
0756eb3c 4765 else
0756eb3c 4766 rc = host_find_bydns(host, NULL, flags, NULL, NULL, NULL,
7cd171b7 4767 &ob->dnssec, /* domains for request/require */
55414b25 4768 NULL, NULL);
0756eb3c 4769
7cd1141b
PH
4770 /* Update the host (and any additional blocks, resulting from
4771 multihoming) with a host-specific port, if any. */
4772
db3f7b69 4773 for (host_item * hh = host; hh != nexthost; hh = hh->next) hh->port = new_port;
7cd1141b 4774
0756eb3c
PH
4775 /* Failure to find the host at this time (usually DNS temporary failure)
4776 is really a kind of routing failure rather than a transport failure.
4777 Therefore we add a retry item of the routing kind, not to stop us trying
4778 to look this name up here again, but to ensure the address gets timed
4779 out if the failures go on long enough. A complete failure at this point
4780 commonly points to a configuration error, but the best action is still
4781 to carry on for the next host. */
4782
2546388c 4783 if (rc == HOST_FIND_AGAIN || rc == HOST_FIND_SECURITY || rc == HOST_FIND_FAILED)
0756eb3c
PH
4784 {
4785 retry_add_item(addrlist, string_sprintf("R:%s", host->name), 0);
4786 expired = FALSE;
4787 if (rc == HOST_FIND_AGAIN) hosts_defer++; else hosts_fail++;
4788 DEBUG(D_transport) debug_printf("rc = %s for %s\n", (rc == HOST_FIND_AGAIN)?
4789 "HOST_FIND_AGAIN" : "HOST_FIND_FAILED", host->name);
4790 host->status = hstatus_unusable;
4791
db3f7b69 4792 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
4793 {
4794 if (addr->transport_return != DEFER) continue;
4795 addr->basic_errno = ERRNO_UNKNOWNHOST;
2546388c
JH
4796 addr->message = string_sprintf(
4797 rc == HOST_FIND_SECURITY
4798 ? "lookup of IP address for %s was insecure"
4799 : "failed to lookup IP address for %s",
4800 host->name);
0756eb3c
PH
4801 }
4802 continue;
4803 }
4804
4805 /* If the host is actually the local host, we may have a problem, or
4806 there may be some cunning configuration going on. In the problem case,
4807 log things and give up. The default transport status is already DEFER. */
4808
4809 if (rc == HOST_FOUND_LOCAL && !ob->allow_localhost)
4810 {
db3f7b69 4811 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
4812 {
4813 addr->basic_errno = 0;
4814 addr->message = string_sprintf("%s transport found host %s to be "
4815 "local", tblock->name, host->name);
4816 }
4817 goto END_TRANSPORT;
4818 }
4819 } /* End of block for IP address lookup */
4820
4821 /* If this is a continued delivery, we are interested only in the host
4822 which matches the name of the existing open channel. The check is put
4823 here after the local host lookup, in case the name gets expanded as a
4824 result of the lookup. Set expired FALSE, to save the outer loop executing
4825 twice. */
4826
2577f55f
JH
4827 if (continue_hostname)
4828 if ( Ustrcmp(continue_hostname, host->name) != 0
4829 || Ustrcmp(continue_host_address, host->address) != 0
4830 )
4831 {
4832 expired = FALSE;
4833 continue; /* With next host */
4834 }
4835 else
4836 continue_host_tried = TRUE;
0756eb3c 4837
9c4e8f60
PH
4838 /* Reset the default next host in case a multihomed host whose addresses
4839 are not looked up till just above added to the host list. */
83364d30
PH
4840
4841 nexthost = host->next;
4842
0756eb3c
PH
4843 /* If queue_smtp is set (-odqs or the first part of a 2-stage run), or the
4844 domain is in queue_smtp_domains, we don't actually want to attempt any
4845 deliveries. When doing a queue run, queue_smtp_domains is always unset. If
4846 there is a lookup defer in queue_smtp_domains, proceed as if the domain
4847 were not in it. We don't want to hold up all SMTP deliveries! Except when
4848 doing a two-stage queue run, don't do this if forcing. */
4849
8768d548 4850 if ((!f.deliver_force || f.queue_2stage) && (f.queue_smtp ||
55414b25
JH
4851 match_isinlist(addrlist->domain,
4852 (const uschar **)&queue_smtp_domains, 0,
cf39cf57 4853 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK))
0756eb3c
PH
4854 {
4855 expired = FALSE;
db3f7b69 4856 for (address_item * addr = addrlist; addr; addr = addr->next)
7b4c8c1f
JH
4857 if (addr->transport_return == DEFER)
4858 addr->message = US"domain matches queue_smtp_domains, or -odqs set";
0756eb3c
PH
4859 continue; /* With next host */
4860 }
4861
4862 /* Count hosts being considered - purely for an intelligent comment
4863 if none are usable. */
4864
4865 hosts_total++;
4866
4867 /* Set $host and $host address now in case they are needed for the
4868 interface expansion or the serialize_hosts check; they remain set if an
4869 actual delivery happens. */
4870
4871 deliver_host = host->name;
4872 deliver_host_address = host->address;
783b385f
JH
4873 lookup_dnssec_authenticated = host->dnssec == DS_YES ? US"yes"
4874 : host->dnssec == DS_NO ? US"no"
4875 : US"";
0756eb3c 4876
7cd1141b
PH
4877 /* Set up a string for adding to the retry key if the port number is not
4878 the standard SMTP port. A host may have its own port setting that overrides
4879 the default. */
4880
7b4c8c1f 4881 pistring = string_sprintf(":%d", host->port == PORT_NONE
a843a57e 4882 ? defport : host->port);
7cd1141b
PH
4883 if (Ustrcmp(pistring, ":25") == 0) pistring = US"";
4884
0756eb3c 4885 /* Select IPv4 or IPv6, and choose an outgoing interface. If the interface
6f6dedcc
JH
4886 string is set, even if constant (as different transports can have different
4887 constant settings), we must add it to the key that is used for retries,
4888 because connections to the same host from a different interface should be
4889 treated separately. */
0756eb3c 4890
7b4c8c1f 4891 host_af = Ustrchr(host->address, ':') == NULL ? AF_INET : AF_INET6;
6f6dedcc 4892 {
9c5e5449
JH
4893 uschar * s = ob->interface;
4894 if (s && *s)
4895 {
4896 if (!smtp_get_interface(s, host_af, addrlist, &interface, tid))
4897 return FALSE;
4898 pistring = string_sprintf("%s/%s", pistring, interface);
4899 }
6f6dedcc 4900 }
0756eb3c
PH
4901
4902 /* The first time round the outer loop, check the status of the host by
4903 inspecting the retry data. The second time round, we are interested only
4904 in expired hosts that haven't been tried since this message arrived. */
4905
4906 if (cutoff_retry == 0)
4907 {
9c695f6d 4908 BOOL incl_ip;
0756eb3c 4909 /* Ensure the status of the address is set by checking retry data if
9c695f6d 4910 necessary. There may be host-specific retry data (applicable to all
0756eb3c
PH
4911 messages) and also data for retries of a specific message at this host.
4912 If either of these retry records are actually read, the keys used are
4913 returned to save recomputing them later. */
4914
9c695f6d
JH
4915 if (exp_bool(addrlist, US"transport", tblock->name, D_transport,
4916 US"retry_include_ip_address", ob->retry_include_ip_address,
4917 ob->expand_retry_include_ip_address, &incl_ip) != OK)
4918 continue; /* with next host */
4919
0756eb3c 4920 host_is_expired = retry_check_address(addrlist->domain, host, pistring,
9c695f6d 4921 incl_ip, &retry_host_key, &retry_message_key);
0756eb3c 4922
875512a3 4923 DEBUG(D_transport) debug_printf("%s [%s]%s retry-status = %s\n", host->name,
8b455685
JH
4924 host->address ? host->address : US"", pistring,
4925 host->status == hstatus_usable ? "usable"
4926 : host->status == hstatus_unusable ? "unusable"
4927 : host->status == hstatus_unusable_expired ? "unusable (expired)" : "?");
0756eb3c
PH
4928
4929 /* Skip this address if not usable at this time, noting if it wasn't
4930 actually expired, both locally and in the address. */
4931
4932 switch (host->status)
4933 {
4934 case hstatus_unusable:
7b4c8c1f
JH
4935 expired = FALSE;
4936 setflag(addrlist, af_retry_skipped);
4937 /* Fall through */
0756eb3c
PH
4938
4939 case hstatus_unusable_expired:
7b4c8c1f
JH
4940 switch (host->why)
4941 {
4942 case hwhy_retry: hosts_retry++; break;
4943 case hwhy_failed: hosts_fail++; break;
2546388c 4944 case hwhy_insecure:
7b4c8c1f
JH
4945 case hwhy_deferred: hosts_defer++; break;
4946 }
4947
4948 /* If there was a retry message key, implying that previously there
4949 was a message-specific defer, we don't want to update the list of
4950 messages waiting for these hosts. */
4951
4952 if (retry_message_key) update_waiting = FALSE;
4953 continue; /* With the next host or IP address */
0756eb3c
PH
4954 }
4955 }
4956
4957 /* Second time round the loop: if the address is set but expired, and
4958 the message is newer than the last try, let it through. */
4959
4960 else
4961 {
7b4c8c1f
JH
4962 if ( !host->address
4963 || host->status != hstatus_unusable_expired
32dfdf8b 4964 || host->last_try > received_time.tv_sec)
0756eb3c 4965 continue;
7b4c8c1f 4966 DEBUG(D_transport) debug_printf("trying expired host %s [%s]%s\n",
0756eb3c
PH
4967 host->name, host->address, pistring);
4968 host_is_expired = TRUE;
4969 }
4970
4971 /* Setting "expired=FALSE" doesn't actually mean not all hosts are expired;
4972 it remains TRUE only if all hosts are expired and none are actually tried.
4973 */
4974
4975 expired = FALSE;
4976
4977 /* If this host is listed as one to which access must be serialized,
4978 see if another Exim process has a connection to it, and if so, skip
4979 this host. If not, update the database to record our connection to it
4980 and remember this for later deletion. Do not do any of this if we are
4981 sending the message down a pre-existing connection. */
4982
7b4c8c1f 4983 if ( !continue_hostname
3fb3231c 4984 && verify_check_given_host(CUSS &ob->serialize_hosts, host) == OK)
0756eb3c
PH
4985 {
4986 serialize_key = string_sprintf("host-serialize-%s", host->name);
e8ae7214 4987 if (!enq_start(serialize_key, 1))
0756eb3c
PH
4988 {
4989 DEBUG(D_transport)
4990 debug_printf("skipping host %s because another Exim process "
4991 "is connected to it\n", host->name);
4992 hosts_serial++;
4993 continue;
4994 }
0756eb3c
PH
4995 }
4996
4997 /* OK, we have an IP address that is not waiting for its retry time to
4998 arrive (it might be expired) OR (second time round the loop) we have an
4999 expired host that hasn't been tried since the message arrived. Have a go
5000 at delivering the message to it. First prepare the addresses by flushing
5001 out the result of previous attempts, and finding the first address that
5002 is still to be delivered. */
5003
5004 first_addr = prepare_addresses(addrlist, host);
5005
5006 DEBUG(D_transport) debug_printf("delivering %s to %s [%s] (%s%s)\n",
5007 message_id, host->name, host->address, addrlist->address,
7b4c8c1f 5008 addrlist->next ? ", ..." : "");
0756eb3c 5009
67ea939c
JH
5010 set_process_info("delivering %s to %s [%s]%s (%s%s)",
5011 message_id, host->name, host->address, pistring, addrlist->address,
7b4c8c1f 5012 addrlist->next ? ", ..." : "");
0756eb3c
PH
5013
5014 /* This is not for real; don't do the delivery. If there are
5015 any remaining hosts, list them. */
5016
8768d548 5017 if (f.dont_deliver)
0756eb3c 5018 {
895fbaf2 5019 set_errno_nohost(addrlist, 0, NULL, OK, FALSE);
db3f7b69 5020 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
5021 {
5022 addr->host_used = host;
5023 addr->special_action = '*';
5024 addr->message = US"delivery bypassed by -N option";
5025 }
5026 DEBUG(D_transport)
5027 {
5028 debug_printf("*** delivery by %s transport bypassed by -N option\n"
5029 "*** host and remaining hosts:\n", tblock->name);
db3f7b69 5030 for (host_item * host2 = host; host2; host2 = host2->next)
0756eb3c 5031 debug_printf(" %s [%s]\n", host2->name,
7b4c8c1f 5032 host2->address ? host2->address : US"unset");
0756eb3c
PH
5033 }
5034 rc = OK;
5035 }
5036
5037 /* This is for real. If the host is expired, we don't count it for
5038 hosts_max_retry. This ensures that all hosts must expire before an address
8e669ac1 5039 is timed out, unless hosts_max_try_hardlimit (which protects against
533244af 5040 lunatic DNS configurations) is reached.
8e669ac1 5041
533244af
PH
5042 If the host is not expired and we are about to hit the hosts_max_retry
5043 limit, check to see if there is a subsequent hosts with a different MX
5044 value. If so, make that the next host, and don't count this one. This is a
5045 heuristic to make sure that different MXs do get tried. With a normal kind
5046 of retry rule, they would get tried anyway when the earlier hosts were
5047 delayed, but if the domain has a "retry every time" type of rule - as is
5048 often used for the the very large ISPs, that won't happen. */
0756eb3c
PH
5049
5050 else
5051 {
d427a7f9
JH
5052 host_item * thost;
5053 /* Make a copy of the host if it is local to this invocation
5054 of the transport. */
5055
5056 if (expanded_hosts)
5057 {
5058 thost = store_get(sizeof(host_item));
5059 *thost = *host;
5060 thost->name = string_copy(host->name);
5061 thost->address = string_copy(host->address);
5062 }
5063 else
5064 thost = host;
5065
0756eb3c
PH
5066 if (!host_is_expired && ++unexpired_hosts_tried >= ob->hosts_max_try)
5067 {
0756eb3c
PH
5068 DEBUG(D_transport)
5069 debug_printf("hosts_max_try limit reached with this host\n");
db3f7b69 5070 for (host_item * h = host; h; h = h->next) if (h->mx != host->mx)
1a47b633
JH
5071 {
5072 nexthost = h;
5073 unexpired_hosts_tried--;
5074 DEBUG(D_transport) debug_printf("however, a higher MX host exists "
5075 "and will be tried\n");
5076 break;
5077 }
0756eb3c
PH
5078 }
5079
5080 /* Attempt the delivery. */
5081
533244af 5082 total_hosts_tried++;
a843a57e 5083 rc = smtp_deliver(addrlist, thost, host_af, defport, interface, tblock,
d427a7f9 5084 &message_defer, FALSE);
0756eb3c
PH
5085
5086 /* Yield is one of:
5087 OK => connection made, each address contains its result;
5088 message_defer is set for message-specific defers (when all
5089 recipients are marked defer)
5090 DEFER => there was a non-message-specific delivery problem;
5091 ERROR => there was a problem setting up the arguments for a filter,
5092 or there was a problem with expanding added headers
5093 */
5094
5095 /* If the result is not OK, there was a non-message-specific problem.
5096 If the result is DEFER, we need to write to the logs saying what happened
5097 for this particular host, except in the case of authentication and TLS
5098 failures, where the log has already been written. If all hosts defer a
5099 general message is written at the end. */
5100
7b4c8c1f
JH
5101 if (rc == DEFER && first_addr->basic_errno != ERRNO_AUTHFAIL
5102 && first_addr->basic_errno != ERRNO_TLSFAILURE)
ec62d0a9 5103 write_logs(host, first_addr->message, first_addr->basic_errno);
0756eb3c 5104
0cbf2b82 5105#ifndef DISABLE_EVENT
d68218c7 5106 if (rc == DEFER)
774ef2d7 5107 deferred_event_raise(first_addr, host);
a7538db1 5108#endif
d68218c7 5109
0756eb3c
PH
5110 /* If STARTTLS was accepted, but there was a failure in setting up the
5111 TLS session (usually a certificate screwup), and the host is not in
5112 hosts_require_tls, and tls_tempfail_tryclear is true, try again, with
5113 TLS forcibly turned off. We have to start from scratch with a new SMTP
5114 connection. That's why the retry is done from here, not from within
5115 smtp_deliver(). [Rejections of STARTTLS itself don't screw up the
5116 session, so the in-clear transmission after those errors, if permitted,
5117 happens inside smtp_deliver().] */
5118
a7538db1 5119#ifdef SUPPORT_TLS
7a31d643
JH
5120 if ( rc == DEFER
5121 && first_addr->basic_errno == ERRNO_TLSFAILURE
5122 && ob->tls_tempfail_tryclear
3fb3231c 5123 && verify_check_given_host(CUSS &ob->hosts_require_tls, host) != OK
7a31d643 5124 )
0756eb3c 5125 {
cf0c6164
JH
5126 log_write(0, LOG_MAIN,
5127 "%s: delivering unencrypted to H=%s [%s] (not in hosts_require_tls)",
5128 first_addr->message, host->name, host->address);
0756eb3c 5129 first_addr = prepare_addresses(addrlist, host);
a843a57e 5130 rc = smtp_deliver(addrlist, thost, host_af, defport, interface, tblock,
d427a7f9 5131 &message_defer, TRUE);
0756eb3c 5132 if (rc == DEFER && first_addr->basic_errno != ERRNO_AUTHFAIL)
ec62d0a9 5133 write_logs(host, first_addr->message, first_addr->basic_errno);
0cbf2b82 5134# ifndef DISABLE_EVENT
d68218c7 5135 if (rc == DEFER)
774ef2d7 5136 deferred_event_raise(first_addr, host);
a7538db1 5137# endif
0756eb3c 5138 }
a1bccd48 5139#endif /*SUPPORT_TLS*/
0756eb3c
PH
5140 }
5141
5142 /* Delivery attempt finished */
5143
67ea939c
JH
5144 set_process_info("delivering %s: just tried %s [%s]%s for %s%s: result %s",
5145 message_id, host->name, host->address, pistring, addrlist->address,
9c5e5449 5146 addrlist->next ? " (& others)" : "", rc_to_string(rc));
0756eb3c
PH
5147
5148 /* Release serialization if set up */
5149
7b4c8c1f 5150 if (serialize_key) enq_end(serialize_key);
0756eb3c
PH
5151
5152 /* If the result is DEFER, or if a host retry record is known to exist, we
5153 need to add an item to the retry chain for updating the retry database
5154 at the end of delivery. We only need to add the item to the top address,
5155 of course. Also, if DEFER, we mark the IP address unusable so as to skip it
5156 for any other delivery attempts using the same address. (It is copied into
5157 the unusable tree at the outer level, so even if different address blocks
5158 contain the same address, it still won't get tried again.) */
5159
7b4c8c1f 5160 if (rc == DEFER || retry_host_key)
0756eb3c 5161 {
7b4c8c1f
JH
5162 int delete_flag = rc != DEFER ? rf_delete : 0;
5163 if (!retry_host_key)
0756eb3c 5164 {
9c695f6d
JH
5165 BOOL incl_ip;
5166 if (exp_bool(addrlist, US"transport", tblock->name, D_transport,
5167 US"retry_include_ip_address", ob->retry_include_ip_address,
5168 ob->expand_retry_include_ip_address, &incl_ip) != OK)
5169 incl_ip = TRUE; /* error; use most-specific retry record */
5170
7b4c8c1f
JH
5171 retry_host_key = incl_ip
5172 ? string_sprintf("T:%S:%s%s", host->name, host->address, pistring)
5173 : string_sprintf("T:%S%s", host->name, pistring);
0756eb3c
PH
5174 }
5175
5176 /* If a delivery of another message over an existing SMTP connection
5177 yields DEFER, we do NOT set up retry data for the host. This covers the
5178 case when there are delays in routing the addresses in the second message
5179 that are so long that the server times out. This is alleviated by not
5180 routing addresses that previously had routing defers when handling an
5181 existing connection, but even so, this case may occur (e.g. if a
5182 previously happily routed address starts giving routing defers). If the
5183 host is genuinely down, another non-continued message delivery will
5184 notice it soon enough. */
5185
7b4c8c1f 5186 if (delete_flag != 0 || !continue_hostname)
0756eb3c
PH
5187 retry_add_item(first_addr, retry_host_key, rf_host | delete_flag);
5188
5189 /* We may have tried an expired host, if its retry time has come; ensure
5190 the status reflects the expiry for the benefit of any other addresses. */
5191
5192 if (rc == DEFER)
5193 {
7b4c8c1f
JH
5194 host->status = host_is_expired
5195 ? hstatus_unusable_expired : hstatus_unusable;
0756eb3c
PH
5196 host->why = hwhy_deferred;
5197 }
5198 }
5199
5200 /* If message_defer is set (host was OK, but every recipient got deferred
5201 because of some message-specific problem), or if that had happened
5202 previously so that a message retry key exists, add an appropriate item
5203 to the retry chain. Note that if there was a message defer but now there is
5204 a host defer, the message defer record gets deleted. That seems perfectly
5205 reasonable. Also, stop the message from being remembered as waiting
f6c332bd 5206 for specific hosts. */
0756eb3c 5207
7b4c8c1f 5208 if (message_defer || retry_message_key)
0756eb3c 5209 {
7b4c8c1f
JH
5210 int delete_flag = message_defer ? 0 : rf_delete;
5211 if (!retry_message_key)
0756eb3c 5212 {
9c695f6d
JH
5213 BOOL incl_ip;
5214 if (exp_bool(addrlist, US"transport", tblock->name, D_transport,
5215 US"retry_include_ip_address", ob->retry_include_ip_address,
5216 ob->expand_retry_include_ip_address, &incl_ip) != OK)
5217 incl_ip = TRUE; /* error; use most-specific retry record */
5218
7b4c8c1f
JH
5219 retry_message_key = incl_ip
5220 ? string_sprintf("T:%S:%s%s:%s", host->name, host->address, pistring,
5221 message_id)
5222 : string_sprintf("T:%S%s:%s", host->name, pistring, message_id);
0756eb3c
PH
5223 }
5224 retry_add_item(addrlist, retry_message_key,
5225 rf_message | rf_host | delete_flag);
f6c332bd 5226 update_waiting = FALSE;
0756eb3c
PH
5227 }
5228
5229 /* Any return other than DEFER (that is, OK or ERROR) means that the
5230 addresses have got their final statuses filled in for this host. In the OK
5231 case, see if any of them are deferred. */
5232
5233 if (rc == OK)
db3f7b69 5234 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
5235 if (addr->transport_return == DEFER)
5236 {
5237 some_deferred = TRUE;
5238 break;
5239 }
0756eb3c
PH
5240
5241 /* If no addresses deferred or the result was ERROR, return. We do this for
5242 ERROR because a failing filter set-up or add_headers expansion is likely to
5243 fail for any host we try. */
5244
5245 if (rc == ERROR || (rc == OK && !some_deferred))
5246 {
5247 DEBUG(D_transport) debug_printf("Leaving %s transport\n", tblock->name);
5248 return TRUE; /* Each address has its status */
5249 }
5250
5251 /* If the result was DEFER or some individual addresses deferred, let
5252 the loop run to try other hosts with the deferred addresses, except for the
5253 case when we were trying to deliver down an existing channel and failed.
5254 Don't try any other hosts in this case. */
5255
7b4c8c1f 5256 if (continue_hostname) break;
0756eb3c
PH
5257
5258 /* If the whole delivery, or some individual addresses, were deferred and
5259 there are more hosts that could be tried, do not count this host towards
5260 the hosts_max_try limit if the age of the message is greater than the
5261 maximum retry time for this host. This means we may try try all hosts,
5262 ignoring the limit, when messages have been around for some time. This is
5263 important because if we don't try all hosts, the address will never time
533244af 5264 out. NOTE: this does not apply to hosts_max_try_hardlimit. */
0756eb3c 5265
7b4c8c1f 5266 if ((rc == DEFER || some_deferred) && nexthost)
0756eb3c
PH
5267 {
5268 BOOL timedout;
5269 retry_config *retry = retry_find_config(host->name, NULL, 0, 0);
5270
7b4c8c1f 5271 if (retry && retry->rules)
0756eb3c
PH
5272 {
5273 retry_rule *last_rule;
5274 for (last_rule = retry->rules;
7b4c8c1f 5275 last_rule->next;
0756eb3c 5276 last_rule = last_rule->next);
32dfdf8b 5277 timedout = time(NULL) - received_time.tv_sec > last_rule->timeout;
0756eb3c
PH
5278 }
5279 else timedout = TRUE; /* No rule => timed out */
5280
5281 if (timedout)
5282 {
5283 unexpired_hosts_tried--;
5284 DEBUG(D_transport) debug_printf("temporary delivery error(s) override "
5285 "hosts_max_try (message older than host's retry time)\n");
5286 }
5287 }
06f37c80
JH
5288
5289 DEBUG(D_transport)
5290 {
5291 if (unexpired_hosts_tried >= ob->hosts_max_try)
5292 debug_printf("reached transport hosts_max_try limit %d\n",
5293 ob->hosts_max_try);
5294 if (total_hosts_tried >= ob->hosts_max_try_hardlimit)
5295 debug_printf("reached transport hosts_max_try_hardlimit limit %d\n",
5296 ob->hosts_max_try_hardlimit);
5297 }
5298
8008accd 5299 if (f.running_in_test_harness) millisleep(500); /* let server debug out */
0756eb3c
PH
5300 } /* End of loop for trying multiple hosts. */
5301
2577f55f
JH
5302 /* If we failed to find a matching host in the list, for an already-open
5303 connection, just close it and start over with the list. This can happen
5304 for routing that changes from run to run, or big multi-IP sites with
5305 round-robin DNS. */
5306
5307 if (continue_hostname && !continue_host_tried)
5308 {
74f1a423 5309 int fd = cutthrough.cctx.sock >= 0 ? cutthrough.cctx.sock : 0;
2577f55f
JH
5310
5311 DEBUG(D_transport) debug_printf("no hosts match already-open connection\n");
5312#ifdef SUPPORT_TLS
74f1a423
JH
5313 /* A TLS conn could be open for a cutthrough, but not for a plain continued-
5314 transport */
5315/*XXX doublecheck that! */
5316
5317 if (cutthrough.cctx.sock >= 0 && cutthrough.is_tls)
2577f55f 5318 {
74f1a423
JH
5319 (void) tls_write(cutthrough.cctx.tls_ctx, US"QUIT\r\n", 6, FALSE);
5320 tls_close(cutthrough.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
5321 cutthrough.cctx.tls_ctx = NULL;
5322 cutthrough.is_tls = FALSE;
2577f55f
JH
5323 }
5324 else
5325#else
5326 (void) write(fd, US"QUIT\r\n", 6);
5327#endif
5328 (void) close(fd);
74f1a423 5329 cutthrough.cctx.sock = -1;
2577f55f
JH
5330 continue_hostname = NULL;
5331 goto retry_non_continued;
5332 }
5333
0756eb3c
PH
5334 /* This is the end of the loop that repeats iff expired is TRUE and
5335 ob->delay_after_cutoff is FALSE. The second time round we will
5336 try those hosts that haven't been tried since the message arrived. */
5337
5338 DEBUG(D_transport)
5339 {
5340 debug_printf("all IP addresses skipped or deferred at least one address\n");
5341 if (expired && !ob->delay_after_cutoff && cutoff_retry == 0)
5342 debug_printf("retrying IP addresses not tried since message arrived\n");
5343 }
5344 }
5345
5346
5347/* Get here if all IP addresses are skipped or defer at least one address. In
5348MUA wrapper mode, this will happen only for connection or other non-message-
5349specific failures. Force the delivery status for all addresses to FAIL. */
5350
5351if (mua_wrapper)
5352 {
db3f7b69 5353 for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
5354 addr->transport_return = FAIL;
5355 goto END_TRANSPORT;
5356 }
5357
5358/* In the normal, non-wrapper case, add a standard message to each deferred
5359address if there hasn't been an error, that is, if it hasn't actually been
5360tried this time. The variable "expired" will be FALSE if any deliveries were
5361actually tried, or if there was at least one host that was not expired. That
5362is, it is TRUE only if no deliveries were tried and all hosts were expired. If
5363a delivery has been tried, an error code will be set, and the failing of the
5364message is handled by the retry code later.
5365
5366If queue_smtp is set, or this transport was called to send a subsequent message
5367down an existing TCP/IP connection, and something caused the host not to be
5368found, we end up here, but can detect these cases and handle them specially. */
5369
db3f7b69 5370for (address_item * addr = addrlist; addr; addr = addr->next)
0756eb3c
PH
5371 {
5372 /* If host is not NULL, it means that we stopped processing the host list
533244af
PH
5373 because of hosts_max_try or hosts_max_try_hardlimit. In the former case, this
5374 means we need to behave as if some hosts were skipped because their retry
5375 time had not come. Specifically, this prevents the address from timing out.
8e669ac1 5376 However, if we have hit hosts_max_try_hardlimit, we want to behave as if all
533244af 5377 hosts were tried. */
0756eb3c 5378
c3f2eb9a 5379 if (host)
533244af
PH
5380 if (total_hosts_tried >= ob->hosts_max_try_hardlimit)
5381 {
5382 DEBUG(D_transport)
5383 debug_printf("hosts_max_try_hardlimit reached: behave as if all "
5384 "hosts were tried\n");
5385 }
5386 else
8e669ac1 5387 {
533244af
PH
5388 DEBUG(D_transport)
5389 debug_printf("hosts_max_try limit caused some hosts to be skipped\n");
5390 setflag(addr, af_retry_skipped);
8e669ac1 5391 }
0756eb3c 5392
8768d548 5393 if (f.queue_smtp) /* no deliveries attempted */
0756eb3c
PH
5394 {
5395 addr->transport_return = DEFER;
5396 addr->basic_errno = 0;
5397 addr->message = US"SMTP delivery explicitly queued";
5398 }
5399
c3f2eb9a
JH
5400 else if ( addr->transport_return == DEFER
5401 && (addr->basic_errno == ERRNO_UNKNOWNERROR || addr->basic_errno == 0)
5402 && !addr->message
5403 )
0756eb3c
PH
5404 {
5405 addr->basic_errno = ERRNO_HRETRY;
c3f2eb9a 5406 if (continue_hostname)
0756eb3c 5407 addr->message = US"no host found for existing SMTP connection";
0756eb3c
PH
5408 else if (expired)
5409 {
fffffe4c 5410 setflag(addr, af_pass_message); /* This is not a security risk */
c3f2eb9a
JH
5411 addr->message = string_sprintf(
5412 "all hosts%s have been failing for a long time %s",
5413 addr->domain ? string_sprintf(" for '%s'", addr->domain) : US"",
5414 ob->delay_after_cutoff
5415 ? US"(and retry time not reached)"
5416 : US"and were last tried after this message arrived");
0756eb3c
PH
5417
5418 /* If we are already using fallback hosts, or there are no fallback hosts
5419 defined, convert the result to FAIL to cause a bounce. */
5420
c3f2eb9a 5421 if (addr->host_list == addr->fallback_hosts || !addr->fallback_hosts)
0756eb3c
PH
5422 addr->transport_return = FAIL;
5423 }
5424 else
5425 {
93a680e4 5426 const char * s;
0756eb3c 5427 if (hosts_retry == hosts_total)
93a680e4 5428 s = "retry time not reached for any host%s";
0756eb3c 5429 else if (hosts_fail == hosts_total)
93a680e4 5430 s = "all host address lookups%s failed permanently";
0756eb3c 5431 else if (hosts_defer == hosts_total)
93a680e4 5432 s = "all host address lookups%s failed temporarily";
0756eb3c 5433 else if (hosts_serial == hosts_total)
93a680e4 5434 s = "connection limit reached for all hosts%s";
0756eb3c 5435 else if (hosts_fail+hosts_defer == hosts_total)
93a680e4 5436 s = "all host address lookups%s failed";
3cf01803 5437 else
93a680e4 5438 s = "some host address lookups failed and retry time "
3cf01803
JH
5439 "not reached for other hosts or connection limit reached%s";
5440
5441 addr->message = string_sprintf(s,
5442 addr->domain ? string_sprintf(" for '%s'", addr->domain) : US"");
0756eb3c
PH
5443 }
5444 }
5445 }
5446
5447/* Update the database which keeps information about which messages are waiting
f6c332bd
PH
5448for which hosts to become available. For some message-specific errors, the
5449update_waiting flag is turned off because we don't want follow-on deliveries in
ea722490 5450those cases. If this transport instance is explicitly limited to one message
8b260705
PP
5451per connection then follow-on deliveries are not possible and there's no need
5452to create/update the per-transport wait-<transport_name> database. */
0756eb3c 5453
ea722490
JH
5454if (update_waiting && tblock->connection_max_messages != 1)
5455 transport_update_waiting(hostlist, tblock->name);
0756eb3c
PH
5456
5457END_TRANSPORT:
5458
5459DEBUG(D_transport) debug_printf("Leaving %s transport\n", tblock->name);
5460
5461return TRUE; /* Each address has its status */
5462}
5463
d185889f 5464#endif /*!MACRO_PREDEF*/
578897ea
JH
5465/* vi: aw ai sw=2
5466*/
0756eb3c 5467/* End of transport/smtp.c */