39b8c411abe688239360b08557af2f99870c3a00
[users/heiko/exim.git] / src / src / transport.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* Copyright (c) The Exim Maintainers 2020 */
7 /* See the file NOTICE for conditions of use and distribution. */
8
9 /* General functions concerned with transportation, and generic options for all
10 transports. */
11
12
13 #include "exim.h"
14
15 /* Generic options for transports, all of which live inside transport_instance
16 data blocks and which therefore have the opt_public flag set. Note that there
17 are other options living inside this structure which can be set only from
18 certain transports. */
19 #define LOFF(field) OPT_OFF(transport_instance, field)
20
21 optionlist optionlist_transports[] = {
22   /*    name            type                                    value */
23   { "*expand_group",    opt_stringptr|opt_hidden|opt_public,
24                  LOFF(expand_gid) },
25   { "*expand_user",     opt_stringptr|opt_hidden|opt_public,
26                  LOFF(expand_uid) },
27   { "*headers_rewrite_flags", opt_int|opt_public|opt_hidden,
28                  LOFF(rewrite_existflags) },
29   { "*headers_rewrite_rules", opt_void|opt_public|opt_hidden,
30                  LOFF(rewrite_rules) },
31   { "*set_group",       opt_bool|opt_hidden|opt_public,
32                  LOFF(gid_set) },
33   { "*set_user",        opt_bool|opt_hidden|opt_public,
34                  LOFF(uid_set) },
35   { "body_only",        opt_bool|opt_public,
36                  LOFF(body_only) },
37   { "current_directory", opt_stringptr|opt_public,
38                  LOFF(current_dir) },
39   { "debug_print",      opt_stringptr | opt_public,
40                  LOFF(debug_string) },
41   { "delivery_date_add", opt_bool|opt_public,
42                  LOFF(delivery_date_add) },
43   { "disable_logging",  opt_bool|opt_public,
44                  LOFF(disable_logging) },
45   { "driver",           opt_stringptr|opt_public,
46                  LOFF(driver_name) },
47   { "envelope_to_add",   opt_bool|opt_public,
48                  LOFF(envelope_to_add) },
49 #ifndef DISABLE_EVENT
50   { "event_action",     opt_stringptr | opt_public,
51                  LOFF(event_action) },
52 #endif
53   { "group",             opt_expand_gid|opt_public,
54                  LOFF(gid) },
55   { "headers_add",      opt_stringptr|opt_public|opt_rep_str,
56                  LOFF(add_headers) },
57   { "headers_only",     opt_bool|opt_public,
58                  LOFF(headers_only) },
59   { "headers_remove",   opt_stringptr|opt_public|opt_rep_str,
60                  LOFF(remove_headers) },
61   { "headers_rewrite",  opt_rewrite|opt_public,
62                  LOFF(headers_rewrite) },
63   { "home_directory",   opt_stringptr|opt_public,
64                  LOFF(home_dir) },
65   { "initgroups",       opt_bool|opt_public,
66                  LOFF(initgroups) },
67   { "max_parallel",     opt_stringptr|opt_public,
68                  LOFF(max_parallel) },
69   { "message_size_limit", opt_stringptr|opt_public,
70                  LOFF(message_size_limit) },
71   { "rcpt_include_affixes", opt_bool|opt_public,
72                  LOFF(rcpt_include_affixes) },
73   { "retry_use_local_part", opt_bool|opt_public,
74                  LOFF(retry_use_local_part) },
75   { "return_path",      opt_stringptr|opt_public,
76                  LOFF(return_path) },
77   { "return_path_add",   opt_bool|opt_public,
78                  LOFF(return_path_add) },
79   { "shadow_condition", opt_stringptr|opt_public,
80                  LOFF(shadow_condition) },
81   { "shadow_transport", opt_stringptr|opt_public,
82                  LOFF(shadow) },
83   { "transport_filter", opt_stringptr|opt_public,
84                  LOFF(filter_command) },
85   { "transport_filter_timeout", opt_time|opt_public,
86                  LOFF(filter_timeout) },
87   { "user",             opt_expand_uid|opt_public,
88                  LOFF(uid) }
89 };
90
91 int optionlist_transports_size = nelem(optionlist_transports);
92
93 #ifdef MACRO_PREDEF
94
95 # include "macro_predef.h"
96
97 void
98 options_transports(void)
99 {
100 uschar buf[64];
101
102 options_from_list(optionlist_transports, nelem(optionlist_transports), US"TRANSPORTS", NULL);
103
104 for (transport_info * ti = transports_available; ti->driver_name[0]; ti++)
105   {
106   spf(buf, sizeof(buf), US"_DRIVER_TRANSPORT_%T", ti->driver_name);
107   builtin_macro_create(buf);
108   options_from_list(ti->options, (unsigned)*ti->options_count, US"TRANSPORT", ti->driver_name);
109   }
110 }
111
112 #else   /*!MACRO_PREDEF*/
113
114 /* Structure for keeping list of addresses that have been added to
115 Envelope-To:, in order to avoid duplication. */
116
117 struct aci {
118   struct aci *next;
119   address_item *ptr;
120   };
121
122
123 /* Static data for write_chunk() */
124
125 static uschar *chunk_ptr;           /* chunk pointer */
126 static uschar *nl_check;            /* string to look for at line start */
127 static int     nl_check_length;     /* length of same */
128 static uschar *nl_escape;           /* string to insert */
129 static int     nl_escape_length;    /* length of same */
130 static int     nl_partial_match;    /* length matched at chunk end */
131
132
133 /*************************************************
134 *             Initialize transport list           *
135 *************************************************/
136
137 /* Read the transports section of the configuration file, and set up a chain of
138 transport instances according to its contents. Each transport has generic
139 options and may also have its own private options. This function is only ever
140 called when transports == NULL. We use generic code in readconf to do most of
141 the work. */
142
143 void
144 transport_init(void)
145 {
146 readconf_driver_init(US"transport",
147   (driver_instance **)(&transports),     /* chain anchor */
148   (driver_info *)transports_available,   /* available drivers */
149   sizeof(transport_info),                /* size of info block */
150   &transport_defaults,                   /* default values for generic options */
151   sizeof(transport_instance),            /* size of instance block */
152   optionlist_transports,                 /* generic options */
153   optionlist_transports_size);
154
155 /* Now scan the configured transports and check inconsistencies. A shadow
156 transport is permitted only for local transports. */
157
158 for (transport_instance * t = transports; t; t = t->next)
159   {
160   if (!t->info->local && t->shadow)
161     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
162       "shadow transport not allowed on non-local transport %s", t->name);
163
164   if (t->body_only && t->headers_only)
165     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
166       "%s transport: body_only and headers_only are mutually exclusive",
167       t->name);
168   }
169 }
170
171
172
173 /*************************************************
174 *             Write block of data                *
175 *************************************************/
176
177 static int
178 tpt_write(int fd, uschar * block, int len, BOOL more, int options)
179 {
180 return
181 #ifndef DISABLE_TLS
182   tls_out.active.sock == fd
183     ? tls_write(tls_out.active.tls_ctx, block, len, more) :
184 #endif
185 #ifdef MSG_MORE
186   more && !(options & topt_not_socket) ? send(fd, block, len, MSG_MORE) :
187 #endif
188   write(fd, block, len);
189 }
190
191 /* Subroutine called by write_chunk() and at the end of the message actually
192 to write a data block. Also called directly by some transports to write
193 additional data to the file descriptor (e.g. prefix, suffix).
194
195 If a transport wants data transfers to be timed, it sets a non-zero value in
196 transport_write_timeout. A non-zero transport_write_timeout causes a timer to
197 be set for each block of data written from here. If time runs out, then write()
198 fails and provokes an error return. The caller can then inspect sigalrm_seen to
199 check for a timeout.
200
201 On some systems, if a quota is exceeded during the write, the yield is the
202 number of bytes written rather than an immediate error code. This also happens
203 on some systems in other cases, for example a pipe that goes away because the
204 other end's process terminates (Linux). On other systems, (e.g. Solaris 2) you
205 get the error codes the first time.
206
207 The write() function is also interruptible; the Solaris 2.6 man page says:
208
209      If write() is interrupted by a signal before it writes any
210      data, it will return -1 with errno set to EINTR.
211
212      If write() is interrupted by a signal after it successfully
213      writes some data, it will return the number of bytes written.
214
215 To handle these cases, we want to restart the write() to output the remainder
216 of the data after a non-negative return from write(), except after a timeout.
217 In the error cases (EDQUOT, EPIPE) no bytes get written the second time, and a
218 proper error then occurs. In principle, after an interruption, the second
219 write() could suffer the same fate, but we do not want to continue for
220 evermore, so stick a maximum repetition count on the loop to act as a
221 longstop.
222
223 Arguments:
224   tctx      transport context: file descriptor or string to write to
225   block     block of bytes to write
226   len       number of bytes to write
227   more      further data expected soon
228
229 Returns:    TRUE on success, FALSE on failure (with errno preserved);
230               transport_count is incremented by the number of bytes written
231 */
232
233 static BOOL
234 transport_write_block_fd(transport_ctx * tctx, uschar * block, int len, BOOL more)
235 {
236 int rc, save_errno;
237 int local_timeout = transport_write_timeout;
238 int connretry = 1;
239 int fd = tctx->u.fd;
240
241 /* This loop is for handling incomplete writes and other retries. In most
242 normal cases, it is only ever executed once. */
243
244 for (int i = 0; i < 100; i++)
245   {
246   DEBUG(D_transport)
247     debug_printf("writing data block fd=%d size=%d timeout=%d%s\n",
248       fd, len, local_timeout, more ? " (more expected)" : "");
249
250   /* When doing TCP Fast Open we may get this far before the 3-way handshake
251   is complete, and write returns ENOTCONN.  Detect that, wait for the socket
252   to become writable, and retry once only. */
253
254   for(;;)
255     {
256     fd_set fds;
257     /* This code makes use of alarm() in order to implement the timeout. This
258     isn't a very tidy way of doing things. Using non-blocking I/O with select()
259     provides a neater approach. However, I don't know how to do this when TLS is
260     in use. */
261
262     if (transport_write_timeout <= 0)   /* No timeout wanted */
263       {
264       rc = tpt_write(fd, block, len, more, tctx->options);
265       save_errno = errno;
266       }
267     else                                /* Timeout wanted. */
268       {
269       sigalrm_seen = FALSE;
270       ALARM(local_timeout);
271         rc = tpt_write(fd, block, len, more, tctx->options);
272         save_errno = errno;
273       local_timeout = ALARM_CLR(0);
274       if (sigalrm_seen)
275         {
276         errno = ETIMEDOUT;
277         return FALSE;
278         }
279       }
280
281     if (rc >= 0 || errno != ENOTCONN || connretry <= 0)
282       break;
283
284     FD_ZERO(&fds); FD_SET(fd, &fds);
285     select(fd+1, NULL, &fds, NULL, NULL);       /* could set timout? */
286     connretry--;
287     }
288
289   /* Hopefully, the most common case is success, so test that first. */
290
291   if (rc == len) { transport_count += len; return TRUE; }
292
293   /* A non-negative return code is an incomplete write. Try again for the rest
294   of the block. If we have exactly hit the timeout, give up. */
295
296   if (rc >= 0)
297     {
298     len -= rc;
299     block += rc;
300     transport_count += rc;
301     DEBUG(D_transport) debug_printf("write incomplete (%d)\n", rc);
302     goto CHECK_TIMEOUT;   /* A few lines below */
303     }
304
305   /* A negative return code with an EINTR error is another form of
306   incomplete write, zero bytes having been written */
307
308   if (save_errno == EINTR)
309     {
310     DEBUG(D_transport)
311       debug_printf("write interrupted before anything written\n");
312     goto CHECK_TIMEOUT;   /* A few lines below */
313     }
314
315   /* A response of EAGAIN from write() is likely only in the case of writing
316   to a FIFO that is not swallowing the data as fast as Exim is writing it. */
317
318   if (save_errno == EAGAIN)
319     {
320     DEBUG(D_transport)
321       debug_printf("write temporarily locked out, waiting 1 sec\n");
322     sleep(1);
323
324     /* Before continuing to try another write, check that we haven't run out of
325     time. */
326
327     CHECK_TIMEOUT:
328     if (transport_write_timeout > 0 && local_timeout <= 0)
329       {
330       errno = ETIMEDOUT;
331       return FALSE;
332       }
333     continue;
334     }
335
336   /* Otherwise there's been an error */
337
338   DEBUG(D_transport) debug_printf("writing error %d: %s\n", save_errno,
339     strerror(save_errno));
340   errno = save_errno;
341   return FALSE;
342   }
343
344 /* We've tried and tried and tried but still failed */
345
346 errno = ERRNO_WRITEINCOMPLETE;
347 return FALSE;
348 }
349
350
351 BOOL
352 transport_write_block(transport_ctx * tctx, uschar *block, int len, BOOL more)
353 {
354 if (!(tctx->options & topt_output_string))
355   return transport_write_block_fd(tctx, block, len, more);
356
357 /* Write to expanding-string.  NOTE: not NUL-terminated */
358
359 if (!tctx->u.msg)
360   tctx->u.msg = string_get(1024);
361
362 tctx->u.msg = string_catn(tctx->u.msg, block, len);
363 return TRUE;
364 }
365
366
367
368
369 /*************************************************
370 *             Write formatted string             *
371 *************************************************/
372
373 /* This is called by various transports. It is a convenience function.
374
375 Arguments:
376   fd          file descriptor
377   format      string format
378   ...         arguments for format
379
380 Returns:      the yield of transport_write_block()
381 */
382
383 BOOL
384 transport_write_string(int fd, const char *format, ...)
385 {
386 transport_ctx tctx = {{0}};
387 gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer };
388 va_list ap;
389
390 /* Use taint-unchecked routines for writing into big_buffer, trusting
391 that the result will never be expanded. */
392
393 va_start(ap, format);
394 if (!string_vformat(&gs, SVFMT_TAINT_NOCHK, format, ap))
395   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "overlong formatted string in transport");
396 va_end(ap);
397 tctx.u.fd = fd;
398 return transport_write_block(&tctx, gs.s, gs.ptr, FALSE);
399 }
400
401
402
403
404 void
405 transport_write_reset(int options)
406 {
407 if (!(options & topt_continuation)) chunk_ptr = deliver_out_buffer;
408 nl_partial_match = -1;
409 nl_check_length = nl_escape_length = 0;
410 }
411
412
413
414 /*************************************************
415 *              Write character chunk             *
416 *************************************************/
417
418 /* Subroutine used by transport_write_message() to scan character chunks for
419 newlines and act appropriately. The object is to minimise the number of writes.
420 The output byte stream is buffered up in deliver_out_buffer, which is written
421 only when it gets full, thus minimizing write operations and TCP packets.
422
423 Static data is used to handle the case when the last character of the previous
424 chunk was NL, or matched part of the data that has to be escaped.
425
426 Arguments:
427   tctx       transport context - processing to be done during output,
428                 and file descriptor to write to
429   chunk      pointer to data to write
430   len        length of data to write
431
432 In addition, the static nl_xxx variables must be set as required.
433
434 Returns:     TRUE on success, FALSE on failure (with errno preserved)
435 */
436
437 BOOL
438 write_chunk(transport_ctx * tctx, uschar *chunk, int len)
439 {
440 uschar *start = chunk;
441 uschar *end = chunk + len;
442 int mlen = DELIVER_OUT_BUFFER_SIZE - nl_escape_length - 2;
443
444 /* The assumption is made that the check string will never stretch over move
445 than one chunk since the only time there are partial matches is when copying
446 the body in large buffers. There is always enough room in the buffer for an
447 escape string, since the loop below ensures this for each character it
448 processes, and it won't have stuck in the escape string if it left a partial
449 match. */
450
451 if (nl_partial_match >= 0)
452   {
453   if (nl_check_length > 0 && len >= nl_check_length &&
454       Ustrncmp(start, nl_check + nl_partial_match,
455         nl_check_length - nl_partial_match) == 0)
456     {
457     Ustrncpy(chunk_ptr, nl_escape, nl_escape_length);
458     chunk_ptr += nl_escape_length;
459     start += nl_check_length - nl_partial_match;
460     }
461
462   /* The partial match was a false one. Insert the characters carried over
463   from the previous chunk. */
464
465   else if (nl_partial_match > 0)
466     {
467     Ustrncpy(chunk_ptr, nl_check, nl_partial_match);
468     chunk_ptr += nl_partial_match;
469     }
470
471   nl_partial_match = -1;
472   }
473
474 /* Now process the characters in the chunk. Whenever we hit a newline we check
475 for possible escaping. The code for the non-NL route should be as fast as
476 possible. */
477
478 for (uschar * ptr = start; ptr < end; ptr++)
479   {
480   int ch, len;
481
482   /* Flush the buffer if it has reached the threshold - we want to leave enough
483   room for the next uschar, plus a possible extra CR for an LF, plus the escape
484   string. */
485
486   if ((len = chunk_ptr - deliver_out_buffer) > mlen)
487     {
488     DEBUG(D_transport) debug_printf("flushing headers buffer\n");
489
490     /* If CHUNKING, prefix with BDAT (size) NON-LAST.  Also, reap responses
491     from previous SMTP commands. */
492
493     if (tctx->options & topt_use_bdat  &&  tctx->chunk_cb)
494       {
495       if (  tctx->chunk_cb(tctx, (unsigned)len, 0) != OK
496          || !transport_write_block(tctx, deliver_out_buffer, len, FALSE)
497          || tctx->chunk_cb(tctx, 0, tc_reap_prev) != OK
498          )
499         return FALSE;
500       }
501     else
502       if (!transport_write_block(tctx, deliver_out_buffer, len, FALSE))
503         return FALSE;
504     chunk_ptr = deliver_out_buffer;
505     }
506
507   /* Remove CR before NL if required */
508
509   if (  *ptr == '\r' && ptr[1] == '\n'
510      && !(tctx->options & topt_use_crlf)
511      && f.spool_file_wireformat
512      )
513     ptr++;
514
515   if ((ch = *ptr) == '\n')
516     {
517     int left = end - ptr - 1;  /* count of chars left after NL */
518
519     /* Insert CR before NL if required */
520
521     if (tctx->options & topt_use_crlf && !f.spool_file_wireformat)
522       *chunk_ptr++ = '\r';
523     *chunk_ptr++ = '\n';
524     transport_newlines++;
525
526     /* The check_string test (formerly "from hack") replaces the specific
527     string at the start of a line with an escape string (e.g. "From " becomes
528     ">From " or "." becomes "..". It is a case-sensitive test. The length
529     check above ensures there is always enough room to insert this string. */
530
531     if (nl_check_length > 0)
532       {
533       if (left >= nl_check_length &&
534           Ustrncmp(ptr+1, nl_check, nl_check_length) == 0)
535         {
536         Ustrncpy(chunk_ptr, nl_escape, nl_escape_length);
537         chunk_ptr += nl_escape_length;
538         ptr += nl_check_length;
539         }
540
541       /* Handle the case when there isn't enough left to match the whole
542       check string, but there may be a partial match. We remember how many
543       characters matched, and finish processing this chunk. */
544
545       else if (left <= 0) nl_partial_match = 0;
546
547       else if (Ustrncmp(ptr+1, nl_check, left) == 0)
548         {
549         nl_partial_match = left;
550         ptr = end;
551         }
552       }
553     }
554
555   /* Not a NL character */
556
557   else *chunk_ptr++ = ch;
558   }
559
560 return TRUE;
561 }
562
563
564
565
566 /*************************************************
567 *        Generate address for RCPT TO            *
568 *************************************************/
569
570 /* This function puts together an address for RCPT to, using the caseful
571 version of the local part and the caseful version of the domain. If there is no
572 prefix or suffix, or if affixes are to be retained, we can just use the
573 original address. Otherwise, if there is a prefix but no suffix we can use a
574 pointer into the original address. If there is a suffix, however, we have to
575 build a new string.
576
577 Arguments:
578   addr              the address item
579   include_affixes   TRUE if affixes are to be included
580
581 Returns:            a string
582 */
583
584 uschar *
585 transport_rcpt_address(address_item *addr, BOOL include_affixes)
586 {
587 uschar *at;
588 int plen, slen;
589
590 if (include_affixes)
591   {
592   setflag(addr, af_include_affixes);  /* Affects logged => line */
593   return addr->address;
594   }
595
596 if (!addr->suffix)
597   {
598   if (!addr->prefix) return addr->address;
599   return addr->address + Ustrlen(addr->prefix);
600   }
601
602 at = Ustrrchr(addr->address, '@');
603 plen = addr->prefix ? Ustrlen(addr->prefix) : 0;
604 slen = Ustrlen(addr->suffix);
605
606 return string_sprintf("%.*s@%s", (int)(at - addr->address - plen - slen),
607    addr->address + plen, at + 1);
608 }
609
610
611 /*************************************************
612 *  Output Envelope-To: address & scan duplicates *
613 *************************************************/
614
615 /* This function is called from internal_transport_write_message() below, when
616 generating an Envelope-To: header line. It checks for duplicates of the given
617 address and its ancestors. When one is found, this function calls itself
618 recursively, to output the envelope address of the duplicate.
619
620 We want to avoid duplication in the list, which can arise for example when
621 A->B,C and then both B and C alias to D. This can also happen when there are
622 unseen drivers in use. So a list of addresses that have been output is kept in
623 the plist variable.
624
625 It is also possible to have loops in the address ancestry/duplication graph,
626 for example if there are two top level addresses A and B and we have A->B,C and
627 B->A. To break the loop, we use a list of processed addresses in the dlist
628 variable.
629
630 After handling duplication, this function outputs the progenitor of the given
631 address.
632
633 Arguments:
634   p         the address we are interested in
635   pplist    address of anchor of the list of addresses not to output
636   pdlist    address of anchor of the list of processed addresses
637   first     TRUE if this is the first address; set it FALSE afterwards
638   tctx      transport context - processing to be done during output
639               and the file descriptor to write to
640
641 Returns:    FALSE if writing failed
642 */
643
644 static BOOL
645 write_env_to(address_item *p, struct aci **pplist, struct aci **pdlist,
646   BOOL *first, transport_ctx * tctx)
647 {
648 address_item *pp;
649 struct aci *ppp;
650
651 /* Do nothing if we have already handled this address. If not, remember it
652 so that we don't handle it again. */
653
654 for (ppp = *pdlist; ppp; ppp = ppp->next) if (p == ppp->ptr) return TRUE;
655
656 ppp = store_get(sizeof(struct aci), FALSE);
657 ppp->next = *pdlist;
658 *pdlist = ppp;
659 ppp->ptr = p;
660
661 /* Now scan up the ancestry, checking for duplicates at each generation. */
662
663 for (pp = p;; pp = pp->parent)
664   {
665   address_item *dup;
666   for (dup = addr_duplicate; dup; dup = dup->next)
667     if (dup->dupof == pp)   /* a dup of our address */
668       if (!write_env_to(dup, pplist, pdlist, first, tctx))
669         return FALSE;
670   if (!pp->parent) break;
671   }
672
673 /* Check to see if we have already output the progenitor. */
674
675 for (ppp = *pplist; ppp; ppp = ppp->next) if (pp == ppp->ptr) break;
676 if (ppp) return TRUE;
677
678 /* Remember what we have output, and output it. */
679
680 ppp = store_get(sizeof(struct aci), FALSE);
681 ppp->next = *pplist;
682 *pplist = ppp;
683 ppp->ptr = pp;
684
685 if (!*first && !write_chunk(tctx, US",\n ", 3)) return FALSE;
686 *first = FALSE;
687 return write_chunk(tctx, pp->address, Ustrlen(pp->address));
688 }
689
690
691
692
693 /* Add/remove/rewrite headers, and send them plus the empty-line separator.
694
695 Globals:
696   header_list
697
698 Arguments:
699   addr                  (chain of) addresses (for extra headers), or NULL;
700                           only the first address is used
701   tctx                  transport context
702   sendfn                function for output (transport or verify)
703
704 Returns:                TRUE on success; FALSE on failure.
705 */
706 BOOL
707 transport_headers_send(transport_ctx * tctx,
708   BOOL (*sendfn)(transport_ctx * tctx, uschar * s, int len))
709 {
710 const uschar *list;
711 transport_instance * tblock = tctx ? tctx->tblock : NULL;
712 address_item * addr = tctx ? tctx->addr : NULL;
713
714 /* Then the message's headers. Don't write any that are flagged as "old";
715 that means they were rewritten, or are a record of envelope rewriting, or
716 were removed (e.g. Bcc). If remove_headers is not null, skip any headers that
717 match any entries therein.  It is a colon-sep list; expand the items
718 separately and squash any empty ones.
719 Then check addr->prop.remove_headers too, provided that addr is not NULL. */
720
721 for (header_line * h = header_list; h; h = h->next) if (h->type != htype_old)
722   {
723   BOOL include_header = TRUE;
724
725   list = tblock ? tblock->remove_headers : NULL;
726   for (int i = 0; i < 2; i++)    /* For remove_headers && addr->prop.remove_headers */
727     {
728     if (list)
729       {
730       int sep = ':';         /* This is specified as a colon-separated list */
731       uschar *s, *ss;
732       while ((s = string_nextinlist(&list, &sep, NULL, 0)))
733         {
734         int len;
735
736         if (i == 0)
737           if (!(s = expand_string(s)) && !f.expand_string_forcedfail)
738             {
739             errno = ERRNO_CHHEADER_FAIL;
740             return FALSE;
741             }
742         len = s ? Ustrlen(s) : 0;
743         if (len && s[len-1] == '*')     /* trailing glob */
744           {
745           if (strncmpic(h->text, s, len-1) == 0) break;
746           }
747         else
748           {
749           if (strncmpic(h->text, s, len) != 0) continue;
750           ss = h->text + len;
751           while (*ss == ' ' || *ss == '\t') ss++;
752           if (*ss == ':') break;
753           }
754         }
755       if (s) { include_header = FALSE; break; }
756       }
757     if (addr) list = addr->prop.remove_headers;
758     }
759
760   /* If this header is to be output, try to rewrite it if there are rewriting
761   rules. */
762
763   if (include_header)
764     {
765     if (tblock && tblock->rewrite_rules)
766       {
767       rmark reset_point = store_mark();
768       header_line *hh;
769
770       if ((hh = rewrite_header(h, NULL, NULL, tblock->rewrite_rules,
771                   tblock->rewrite_existflags, FALSE)))
772         {
773         if (!sendfn(tctx, hh->text, hh->slen)) return FALSE;
774         store_reset(reset_point);
775         continue;     /* With the next header line */
776         }
777       }
778
779     /* Either no rewriting rules, or it didn't get rewritten */
780
781     if (!sendfn(tctx, h->text, h->slen)) return FALSE;
782     }
783
784   /* Header removed */
785
786   else
787     DEBUG(D_transport) debug_printf("removed header line:\n%s---\n", h->text);
788   }
789
790 /* Add on any address-specific headers. If there are multiple addresses,
791 they will all have the same headers in order to be batched. The headers
792 are chained in reverse order of adding (so several addresses from the
793 same alias might share some of them) but we want to output them in the
794 opposite order. This is a bit tedious, but there shouldn't be very many
795 of them. We just walk the list twice, reversing the pointers each time,
796 but on the second time, write out the items.
797
798 Headers added to an address by a router are guaranteed to end with a newline.
799 */
800
801 if (addr)
802   {
803   header_line *hprev = addr->prop.extra_headers;
804   header_line *hnext, * h;
805   for (int i = 0; i < 2; i++)
806     for (h = hprev, hprev = NULL; h; h = hnext)
807       {
808       hnext = h->next;
809       h->next = hprev;
810       hprev = h;
811       if (i == 1)
812         {
813         if (!sendfn(tctx, h->text, h->slen)) return FALSE;
814         DEBUG(D_transport)
815           debug_printf("added header line(s):\n%s---\n", h->text);
816         }
817       }
818   }
819
820 /* If a string containing additional headers exists it is a newline-sep
821 list.  Expand each item and write out the result.  This is done last so that
822 if it (deliberately or accidentally) isn't in header format, it won't mess
823 up any other headers. An empty string or a forced expansion failure are
824 noops. An added header string from a transport may not end with a newline;
825 add one if it does not. */
826
827 if (tblock && (list = CUS tblock->add_headers))
828   {
829   int sep = '\n';
830   uschar * s;
831
832   while ((s = string_nextinlist(&list, &sep, NULL, 0)))
833     if ((s = expand_string(s)))
834       {
835       int len = Ustrlen(s);
836       if (len > 0)
837         {
838         if (!sendfn(tctx, s, len)) return FALSE;
839         if (s[len-1] != '\n' && !sendfn(tctx, US"\n", 1))
840           return FALSE;
841         DEBUG(D_transport)
842           {
843           debug_printf("added header line:\n%s", s);
844           if (s[len-1] != '\n') debug_printf("\n");
845           debug_printf("---\n");
846           }
847         }
848       }
849     else if (!f.expand_string_forcedfail)
850       { errno = ERRNO_CHHEADER_FAIL; return FALSE; }
851   }
852
853 /* Separate headers from body with a blank line */
854
855 return sendfn(tctx, US"\n", 1);
856 }
857
858
859 /*************************************************
860 *                Write the message               *
861 *************************************************/
862
863 /* This function writes the message to the given file descriptor. The headers
864 are in the in-store data structure, and the rest of the message is in the open
865 file descriptor deliver_datafile. Make sure we start it at the beginning.
866
867 . If add_return_path is TRUE, a "return-path:" header is added to the message,
868   containing the envelope sender's address.
869
870 . If add_envelope_to is TRUE, a "envelope-to:" header is added to the message,
871   giving the top-level envelope address that caused this delivery to happen.
872
873 . If add_delivery_date is TRUE, a "delivery-date:" header is added to the
874   message. It gives the time and date that delivery took place.
875
876 . If check_string is not null, the start of each line is checked for that
877   string. If it is found, it is replaced by escape_string. This used to be
878   the "from hack" for files, and "smtp_dots" for escaping SMTP dots.
879
880 . If use_crlf is true, newlines are turned into CRLF (SMTP output).
881
882 The yield is TRUE if all went well, and FALSE if not. Exit *immediately* after
883 any writing or reading error, leaving the code in errno intact. Error exits
884 can include timeouts for certain transports, which are requested by setting
885 transport_write_timeout non-zero.
886
887 Arguments:
888   tctx
889     (fd, msg)           Either an fd, to write the message to,
890                         or a string: if null write message to allocated space
891                         otherwire take content as headers.
892     addr                (chain of) addresses (for extra headers), or NULL;
893                           only the first address is used
894     tblock              optional transport instance block (NULL signifies NULL/0):
895       add_headers           a string containing one or more headers to add; it is
896                             expanded, and must be in correct RFC 822 format as
897                             it is transmitted verbatim; NULL => no additions,
898                             and so does empty string or forced expansion fail
899       remove_headers        a colon-separated list of headers to remove, or NULL
900       rewrite_rules         chain of header rewriting rules
901       rewrite_existflags    flags for the rewriting rules
902     options               bit-wise options:
903       add_return_path       if TRUE, add a "return-path" header
904       add_envelope_to       if TRUE, add a "envelope-to" header
905       add_delivery_date     if TRUE, add a "delivery-date" header
906       use_crlf              if TRUE, turn NL into CR LF
907       end_dot               if TRUE, send a terminating "." line at the end
908       no_flush              if TRUE, do not flush at end
909       no_headers            if TRUE, omit the headers
910       no_body               if TRUE, omit the body
911     check_string          a string to check for at the start of lines, or NULL
912     escape_string         a string to insert in front of any check string
913   size_limit              if > 0, this is a limit to the size of message written;
914                             it is used when returning messages to their senders,
915                             and is approximate rather than exact, owing to chunk
916                             buffering
917
918 Returns:                TRUE on success; FALSE (with errno) on failure.
919                         In addition, the global variable transport_count
920                         is incremented by the number of bytes written.
921 */
922
923 static BOOL
924 internal_transport_write_message(transport_ctx * tctx, int size_limit)
925 {
926 int len, size = 0;
927
928 /* Initialize pointer in output buffer. */
929
930 transport_write_reset(tctx->options);
931
932 /* Set up the data for start-of-line data checking and escaping */
933
934 if (tctx->check_string && tctx->escape_string)
935   {
936   nl_check = tctx->check_string;
937   nl_check_length = Ustrlen(nl_check);
938   nl_escape = tctx->escape_string;
939   nl_escape_length = Ustrlen(nl_escape);
940   }
941
942 /* Whether the escaping mechanism is applied to headers or not is controlled by
943 an option (set for SMTP, not otherwise). Negate the length if not wanted till
944 after the headers. */
945
946 if (!(tctx->options & topt_escape_headers))
947   nl_check_length = -nl_check_length;
948
949 /* Write the headers if required, including any that have to be added. If there
950 are header rewriting rules, apply them.  The datasource is not the -D spoolfile
951 so temporarily hide the global that adjusts for its format. */
952
953 if (!(tctx->options & topt_no_headers))
954   {
955   BOOL save_wireformat = f.spool_file_wireformat;
956   f.spool_file_wireformat = FALSE;
957
958   /* Add return-path: if requested. */
959
960   if (tctx->options & topt_add_return_path)
961     {
962     uschar buffer[ADDRESS_MAXLENGTH + 20];
963     int n = sprintf(CS buffer, "Return-path: <%.*s>\n", ADDRESS_MAXLENGTH,
964       return_path);
965     if (!write_chunk(tctx, buffer, n)) goto bad;
966     }
967
968   /* Add envelope-to: if requested */
969
970   if (tctx->options & topt_add_envelope_to)
971     {
972     BOOL first = TRUE;
973     struct aci *plist = NULL;
974     struct aci *dlist = NULL;
975     rmark reset_point = store_mark();
976
977     if (!write_chunk(tctx, US"Envelope-to: ", 13)) goto bad;
978
979     /* Pick up from all the addresses. The plist and dlist variables are
980     anchors for lists of addresses already handled; they have to be defined at
981     this level because write_env_to() calls itself recursively. */
982
983     for (address_item * p = tctx->addr; p; p = p->next)
984       if (!write_env_to(p, &plist, &dlist, &first, tctx))
985         goto bad;
986
987     /* Add a final newline and reset the store used for tracking duplicates */
988
989     if (!write_chunk(tctx, US"\n", 1)) goto bad;
990     store_reset(reset_point);
991     }
992
993   /* Add delivery-date: if requested. */
994
995   if (tctx->options & topt_add_delivery_date)
996     {
997     uschar * s = tod_stamp(tod_full);
998
999     if (  !write_chunk(tctx, US"Delivery-date: ", 15)
1000        || !write_chunk(tctx, s, Ustrlen(s))
1001        || !write_chunk(tctx, US"\n", 1)) goto bad;
1002     }
1003
1004   /* Then the message's headers. Don't write any that are flagged as "old";
1005   that means they were rewritten, or are a record of envelope rewriting, or
1006   were removed (e.g. Bcc). If remove_headers is not null, skip any headers that
1007   match any entries therein. Then check addr->prop.remove_headers too, provided that
1008   addr is not NULL. */
1009
1010   if (!transport_headers_send(tctx, &write_chunk))
1011     {
1012 bad:
1013     f.spool_file_wireformat = save_wireformat;
1014     return FALSE;
1015     }
1016
1017   f.spool_file_wireformat = save_wireformat;
1018   }
1019
1020 /* When doing RFC3030 CHUNKING output, work out how much data would be in a
1021 last-BDAT, consisting of the current write_chunk() output buffer fill
1022 (optimally, all of the headers - but it does not matter if we already had to
1023 flush that buffer with non-last BDAT prependix) plus the amount of body data
1024 (as expanded for CRLF lines).  Then create and write BDAT(s), and ensure
1025 that further use of write_chunk() will not prepend BDATs.
1026 The first BDAT written will also first flush any outstanding MAIL and RCPT
1027 commands which were buffered thans to PIPELINING.
1028 Commands go out (using a send()) from a different buffer to data (using a
1029 write()).  They might not end up in the same TCP segment, which is
1030 suboptimal. */
1031
1032 if (tctx->options & topt_use_bdat)
1033   {
1034   off_t fsize;
1035   int hsize;
1036
1037   if ((hsize = chunk_ptr - deliver_out_buffer) < 0)
1038     hsize = 0;
1039   if (!(tctx->options & topt_no_body))
1040     {
1041     if ((fsize = lseek(deliver_datafile, 0, SEEK_END)) < 0) return FALSE;
1042     fsize -= SPOOL_DATA_START_OFFSET;
1043     if (size_limit > 0  &&  fsize > size_limit)
1044       fsize = size_limit;
1045     size = hsize + fsize;
1046     if (tctx->options & topt_use_crlf  &&  !f.spool_file_wireformat)
1047       size += body_linecount;   /* account for CRLF-expansion */
1048
1049     /* With topt_use_bdat we never do dot-stuffing; no need to
1050     account for any expansion due to that. */
1051     }
1052
1053   /* If the message is large, emit first a non-LAST chunk with just the
1054   headers, and reap the command responses.  This lets us error out early
1055   on RCPT rejects rather than sending megabytes of data.  Include headers
1056   on the assumption they are cheap enough and some clever implementations
1057   might errorcheck them too, on-the-fly, and reject that chunk. */
1058
1059   if (size > DELIVER_OUT_BUFFER_SIZE && hsize > 0)
1060     {
1061     DEBUG(D_transport)
1062       debug_printf("sending small initial BDAT; hsize=%d\n", hsize);
1063     if (  tctx->chunk_cb(tctx, hsize, 0) != OK
1064        || !transport_write_block(tctx, deliver_out_buffer, hsize, FALSE)
1065        || tctx->chunk_cb(tctx, 0, tc_reap_prev) != OK
1066        )
1067       return FALSE;
1068     chunk_ptr = deliver_out_buffer;
1069     size -= hsize;
1070     }
1071
1072   /* Emit a LAST datachunk command, and unmark the context for further
1073   BDAT commands. */
1074
1075   if (tctx->chunk_cb(tctx, size, tc_chunk_last) != OK)
1076     return FALSE;
1077   tctx->options &= ~topt_use_bdat;
1078   }
1079
1080 /* If the body is required, ensure that the data for check strings (formerly
1081 the "from hack") is enabled by negating the length if necessary. (It will be
1082 negative in cases where it isn't to apply to the headers). Then ensure the body
1083 is positioned at the start of its file (following the message id), then write
1084 it, applying the size limit if required. */
1085
1086 /* If we have a wireformat -D file (CRNL lines, non-dotstuffed, no ending dot)
1087 and we want to send a body without dotstuffing or ending-dot, in-clear,
1088 then we can just dump it using sendfile.
1089 This should get used for CHUNKING output and also for writing the -K file for
1090 dkim signing,  when we had CHUNKING input.  */
1091
1092 #ifdef OS_SENDFILE
1093 if (  f.spool_file_wireformat
1094    && !(tctx->options & (topt_no_body | topt_end_dot))
1095    && !nl_check_length
1096    && tls_out.active.sock != tctx->u.fd
1097    )
1098   {
1099   ssize_t copied = 0;
1100   off_t offset = SPOOL_DATA_START_OFFSET;
1101
1102   /* Write out any header data in the buffer */
1103
1104   if ((len = chunk_ptr - deliver_out_buffer) > 0)
1105     {
1106     if (!transport_write_block(tctx, deliver_out_buffer, len, TRUE))
1107       return FALSE;
1108     size -= len;
1109     }
1110
1111   DEBUG(D_transport) debug_printf("using sendfile for body\n");
1112
1113   while(size > 0)
1114     {
1115     if ((copied = os_sendfile(tctx->u.fd, deliver_datafile, &offset, size)) <= 0) break;
1116     size -= copied;
1117     }
1118   return copied >= 0;
1119   }
1120 #else
1121 DEBUG(D_transport) debug_printf("cannot use sendfile for body: no support\n");
1122 #endif
1123
1124 DEBUG(D_transport)
1125   if (!(tctx->options & topt_no_body))
1126     debug_printf("cannot use sendfile for body: %s\n",
1127       !f.spool_file_wireformat ? "spoolfile not wireformat"
1128       : tctx->options & topt_end_dot ? "terminating dot wanted"
1129       : nl_check_length ? "dot- or From-stuffing wanted"
1130       : "TLS output wanted");
1131
1132 if (!(tctx->options & topt_no_body))
1133   {
1134   unsigned long size = size_limit > 0 ? size_limit : ULONG_MAX;
1135
1136   nl_check_length = abs(nl_check_length);
1137   nl_partial_match = 0;
1138   if (lseek(deliver_datafile, SPOOL_DATA_START_OFFSET, SEEK_SET) < 0)
1139     return FALSE;
1140   while (  (len = MIN(DELIVER_IN_BUFFER_SIZE, size)) > 0
1141         && (len = read(deliver_datafile, deliver_in_buffer, len)) > 0)
1142     {
1143     if (!write_chunk(tctx, deliver_in_buffer, len))
1144       return FALSE;
1145     size -= len;
1146     }
1147
1148   /* A read error on the body will have left len == -1 and errno set. */
1149
1150   if (len != 0) return FALSE;
1151   }
1152
1153 /* Finished with the check string, and spool-format consideration */
1154
1155 nl_check_length = nl_escape_length = 0;
1156 f.spool_file_wireformat = FALSE;
1157
1158 /* If requested, add a terminating "." line (SMTP output). */
1159
1160 if (tctx->options & topt_end_dot && !write_chunk(tctx, US".\n", 2))
1161   return FALSE;
1162
1163 /* Write out any remaining data in the buffer before returning. */
1164
1165 return (len = chunk_ptr - deliver_out_buffer) <= 0
1166   || transport_write_block(tctx, deliver_out_buffer, len,
1167                             !!(tctx->options & topt_no_flush));
1168 }
1169
1170
1171
1172
1173 /*************************************************
1174 *    External interface to write the message     *
1175 *************************************************/
1176
1177 /* If there is no filtering required, call the internal function above to do
1178 the real work, passing over all the arguments from this function. Otherwise,
1179 set up a filtering process, fork another process to call the internal function
1180 to write to the filter, and in this process just suck from the filter and write
1181 down the fd in the transport context. At the end, tidy up the pipes and the
1182 processes.
1183
1184 Arguments:     as for internal_transport_write_message() above
1185
1186 Returns:       TRUE on success; FALSE (with errno) for any failure
1187                transport_count is incremented by the number of bytes written
1188 */
1189
1190 BOOL
1191 transport_write_message(transport_ctx * tctx, int size_limit)
1192 {
1193 BOOL last_filter_was_NL = TRUE;
1194 BOOL save_spool_file_wireformat = f.spool_file_wireformat;
1195 BOOL yield;
1196 int rc, len, fd_read, fd_write, save_errno;
1197 int pfd[2] = {-1, -1};
1198 pid_t filter_pid, write_pid;
1199
1200 f.transport_filter_timed_out = FALSE;
1201
1202 /* If there is no filter command set up, call the internal function that does
1203 the actual work, passing it the incoming fd, and return its result. */
1204
1205 if (  !transport_filter_argv
1206    || !*transport_filter_argv
1207    || !**transport_filter_argv
1208    )
1209   return internal_transport_write_message(tctx, size_limit);
1210
1211 /* Otherwise the message must be written to a filter process and read back
1212 before being written to the incoming fd. First set up the special processing to
1213 be done during the copying. */
1214
1215 nl_partial_match = -1;
1216
1217 if (tctx->check_string && tctx->escape_string)
1218   {
1219   nl_check = tctx->check_string;
1220   nl_check_length = Ustrlen(nl_check);
1221   nl_escape = tctx->escape_string;
1222   nl_escape_length = Ustrlen(nl_escape);
1223   }
1224 else nl_check_length = nl_escape_length = 0;
1225
1226 /* Start up a subprocess to run the command. Ensure that our main fd will
1227 be closed when the subprocess execs, but remove the flag afterwards.
1228 (Otherwise, if this is a TCP/IP socket, it can't get passed on to another
1229 process to deliver another message.) We get back stdin/stdout file descriptors.
1230 If the process creation failed, give an error return. */
1231
1232 fd_read = -1;
1233 fd_write = -1;
1234 save_errno = 0;
1235 yield = FALSE;
1236 write_pid = (pid_t)(-1);
1237
1238   {
1239   int bits = fcntl(tctx->u.fd, F_GETFD);
1240   (void) fcntl(tctx->u.fd, F_SETFD, bits | FD_CLOEXEC);
1241   filter_pid = child_open(USS transport_filter_argv, NULL, 077,
1242                           &fd_write, &fd_read, FALSE, US"transport-filter");
1243   (void) fcntl(tctx->u.fd, F_SETFD, bits & ~FD_CLOEXEC);
1244   }
1245 if (filter_pid < 0) goto TIDY_UP;      /* errno set */
1246
1247 DEBUG(D_transport)
1248   debug_printf("process %d running as transport filter: fd_write=%d fd_read=%d\n",
1249     (int)filter_pid, fd_write, fd_read);
1250
1251 /* Fork subprocess to write the message to the filter, and return the result
1252 via a(nother) pipe. While writing to the filter, we do not do the CRLF,
1253 smtp dots, or check string processing. */
1254
1255 if (pipe(pfd) != 0) goto TIDY_UP;      /* errno set */
1256 if ((write_pid = exim_fork(US"tpt-filter-writer")) == 0)
1257   {
1258   BOOL rc;
1259   (void)close(fd_read);
1260   (void)close(pfd[pipe_read]);
1261   nl_check_length = nl_escape_length = 0;
1262
1263   tctx->u.fd = fd_write;
1264   tctx->check_string = tctx->escape_string = NULL;
1265   tctx->options &= ~(topt_use_crlf | topt_end_dot | topt_use_bdat | topt_no_flush);
1266
1267   rc = internal_transport_write_message(tctx, size_limit);
1268
1269   save_errno = errno;
1270   if (  write(pfd[pipe_write], (void *)&rc, sizeof(BOOL))
1271         != sizeof(BOOL)
1272      || write(pfd[pipe_write], (void *)&save_errno, sizeof(int))
1273         != sizeof(int)
1274      || write(pfd[pipe_write], (void *)&tctx->addr->more_errno, sizeof(int))
1275         != sizeof(int)
1276      || write(pfd[pipe_write], (void *)&tctx->addr->delivery_time, sizeof(struct timeval))
1277         != sizeof(struct timeval)
1278      )
1279     rc = FALSE; /* compiler quietening */
1280   exim_underbar_exit(EXIT_SUCCESS);
1281   }
1282 save_errno = errno;
1283
1284 /* Parent process: close our copy of the writing subprocess' pipes. */
1285
1286 (void)close(pfd[pipe_write]);
1287 (void)close(fd_write);
1288 fd_write = -1;
1289
1290 /* Writing process creation failed */
1291
1292 if (write_pid < 0)
1293   {
1294   errno = save_errno;    /* restore */
1295   goto TIDY_UP;
1296   }
1297
1298 /* When testing, let the subprocess get going */
1299
1300 testharness_pause_ms(250);
1301
1302 DEBUG(D_transport)
1303   debug_printf("process %d writing to transport filter\n", (int)write_pid);
1304
1305 /* Copy the message from the filter to the output fd. A read error leaves len
1306 == -1 and errno set. We need to apply a timeout to the read, to cope with
1307 the case when the filter gets stuck, but it can be quite a long one. The
1308 default is 5m, but this is now configurable. */
1309
1310 DEBUG(D_transport) debug_printf("copying from the filter\n");
1311
1312 /* Copy the output of the filter, remembering if the last character was NL. If
1313 no data is returned, that counts as "ended with NL" (default setting of the
1314 variable is TRUE).  The output should always be unix-format as we converted
1315 any wireformat source on writing input to the filter. */
1316
1317 f.spool_file_wireformat = FALSE;
1318 chunk_ptr = deliver_out_buffer;
1319
1320 for (;;)
1321   {
1322   sigalrm_seen = FALSE;
1323   ALARM(transport_filter_timeout);
1324   len = read(fd_read, deliver_in_buffer, DELIVER_IN_BUFFER_SIZE);
1325   ALARM_CLR(0);
1326   if (sigalrm_seen)
1327     {
1328     DEBUG(D_transport) debug_printf("timed out reading from filter\n");
1329     errno = ETIMEDOUT;
1330     f.transport_filter_timed_out = TRUE;
1331     goto TIDY_UP;
1332     }
1333
1334   /* If the read was successful, write the block down the original fd,
1335   remembering whether it ends in \n or not. */
1336
1337   if (len > 0)
1338     {
1339     if (!write_chunk(tctx, deliver_in_buffer, len)) goto TIDY_UP;
1340     last_filter_was_NL = (deliver_in_buffer[len-1] == '\n');
1341     }
1342
1343   /* Otherwise, break the loop. If we have hit EOF, set yield = TRUE. */
1344
1345   else
1346     {
1347     if (len == 0) yield = TRUE;
1348     break;
1349     }
1350   }
1351
1352 /* Tidying up code. If yield = FALSE there has been an error and errno is set
1353 to something. Ensure the pipes are all closed and the processes are removed. If
1354 there has been an error, kill the processes before waiting for them, just to be
1355 sure. Also apply a paranoia timeout. */
1356
1357 TIDY_UP:
1358 f.spool_file_wireformat = save_spool_file_wireformat;
1359 save_errno = errno;
1360
1361 (void)close(fd_read);
1362 if (fd_write > 0) (void)close(fd_write);
1363
1364 if (!yield)
1365   {
1366   if (filter_pid > 0) kill(filter_pid, SIGKILL);
1367   if (write_pid > 0)  kill(write_pid, SIGKILL);
1368   }
1369
1370 /* Wait for the filter process to complete. */
1371
1372 DEBUG(D_transport) debug_printf("waiting for filter process\n");
1373 if (filter_pid > 0 && (rc = child_close(filter_pid, 30)) != 0 && yield)
1374   {
1375   yield = FALSE;
1376   save_errno = ERRNO_FILTER_FAIL;
1377   tctx->addr->more_errno = rc;
1378   DEBUG(D_transport) debug_printf("filter process returned %d\n", rc);
1379   }
1380
1381 /* Wait for the writing process to complete. If it ends successfully,
1382 read the results from its pipe, provided we haven't already had a filter
1383 process failure. */
1384
1385 DEBUG(D_transport) debug_printf("waiting for writing process\n");
1386 if (write_pid > 0)
1387   {
1388   rc = child_close(write_pid, 30);
1389   if (yield)
1390     if (rc == 0)
1391       {
1392       BOOL ok;
1393       if (read(pfd[pipe_read], (void *)&ok, sizeof(BOOL)) != sizeof(BOOL))
1394         {
1395         DEBUG(D_transport)
1396           debug_printf("pipe read from writing process: %s\n", strerror(errno));
1397         save_errno = ERRNO_FILTER_FAIL;
1398         yield = FALSE;
1399         }
1400       else if (!ok)
1401         {
1402         int dummy = read(pfd[pipe_read], (void *)&save_errno, sizeof(int));
1403         dummy = read(pfd[pipe_read], (void *)&tctx->addr->more_errno, sizeof(int));
1404         dummy = read(pfd[pipe_read], (void *)&tctx->addr->delivery_time, sizeof(struct timeval));
1405         yield = FALSE;
1406         }
1407       }
1408     else
1409       {
1410       yield = FALSE;
1411       save_errno = ERRNO_FILTER_FAIL;
1412       tctx->addr->more_errno = rc;
1413       DEBUG(D_transport) debug_printf("writing process returned %d\n", rc);
1414       }
1415   }
1416 (void)close(pfd[pipe_read]);
1417
1418 /* If there have been no problems we can now add the terminating "." if this is
1419 SMTP output, turning off escaping beforehand. If the last character from the
1420 filter was not NL, insert a NL to make the SMTP protocol work. */
1421
1422 if (yield)
1423   {
1424   nl_check_length = nl_escape_length = 0;
1425   f.spool_file_wireformat = FALSE;
1426   if (  tctx->options & topt_end_dot
1427      && ( last_filter_was_NL
1428         ? !write_chunk(tctx, US".\n", 2)
1429         : !write_chunk(tctx, US"\n.\n", 3)
1430      )  )
1431     yield = FALSE;
1432
1433   /* Write out any remaining data in the buffer. */
1434
1435   else
1436     yield = (len = chunk_ptr - deliver_out_buffer) <= 0
1437           || transport_write_block(tctx, deliver_out_buffer, len, FALSE);
1438   }
1439 else
1440   errno = save_errno;      /* From some earlier error */
1441
1442 DEBUG(D_transport)
1443   {
1444   debug_printf("end of filtering transport writing: yield=%d\n", yield);
1445   if (!yield)
1446     debug_printf(" errno=%d more_errno=%d\n", errno, tctx->addr->more_errno);
1447   }
1448
1449 return yield;
1450 }
1451
1452
1453
1454
1455
1456 /*************************************************
1457 *            Update waiting database             *
1458 *************************************************/
1459
1460 /* This is called when an address is deferred by remote transports that are
1461 capable of sending more than one message over one connection. A database is
1462 maintained for each transport, keeping track of which messages are waiting for
1463 which hosts. The transport can then consult this when eventually a successful
1464 delivery happens, and if it finds that another message is waiting for the same
1465 host, it can fire up a new process to deal with it using the same connection.
1466
1467 The database records are keyed by host name. They can get full if there are
1468 lots of messages waiting, and so there is a continuation mechanism for them.
1469
1470 Each record contains a list of message ids, packed end to end without any
1471 zeros. Each one is MESSAGE_ID_LENGTH bytes long. The count field says how many
1472 in this record, and the sequence field says if there are any other records for
1473 this host. If the sequence field is 0, there are none. If it is 1, then another
1474 record with the name <hostname>:0 exists; if it is 2, then two other records
1475 with sequence numbers 0 and 1 exist, and so on.
1476
1477 Currently, an exhaustive search of all continuation records has to be done to
1478 determine whether to add a message id to a given record. This shouldn't be
1479 too bad except in extreme cases. I can't figure out a *simple* way of doing
1480 better.
1481
1482 Old records should eventually get swept up by the exim_tidydb utility.
1483
1484 Arguments:
1485   hostlist  list of hosts that this message could be sent to
1486   tpname    name of the transport
1487
1488 Returns:    nothing
1489 */
1490
1491 void
1492 transport_update_waiting(host_item *hostlist, uschar *tpname)
1493 {
1494 const uschar *prevname = US"";
1495 open_db dbblock;
1496 open_db *dbm_file;
1497
1498 DEBUG(D_transport) debug_printf("updating wait-%s database\n", tpname);
1499
1500 /* Open the database for this transport */
1501
1502 if (!(dbm_file = dbfn_open(string_sprintf("wait-%.200s", tpname),
1503                       O_RDWR, &dbblock, TRUE, TRUE)))
1504   return;
1505
1506 /* Scan the list of hosts for which this message is waiting, and ensure
1507 that the message id is in each host record. */
1508
1509 for (host_item * host = hostlist; host; host = host->next)
1510   {
1511   BOOL already = FALSE;
1512   dbdata_wait *host_record;
1513   int host_length;
1514   uschar buffer[256];
1515
1516   /* Skip if this is the same host as we just processed; otherwise remember
1517   the name for next time. */
1518
1519   if (Ustrcmp(prevname, host->name) == 0) continue;
1520   prevname = host->name;
1521
1522   /* Look up the host record; if there isn't one, make an empty one. */
1523
1524   if (!(host_record = dbfn_read(dbm_file, host->name)))
1525     {
1526     host_record = store_get(sizeof(dbdata_wait) + MESSAGE_ID_LENGTH, FALSE);
1527     host_record->count = host_record->sequence = 0;
1528     }
1529
1530   /* Compute the current length */
1531
1532   host_length = host_record->count * MESSAGE_ID_LENGTH;
1533
1534   /* Search the record to see if the current message is already in it. */
1535
1536   for (uschar * s = host_record->text; s < host_record->text + host_length;
1537        s += MESSAGE_ID_LENGTH)
1538     if (Ustrncmp(s, message_id, MESSAGE_ID_LENGTH) == 0)
1539       { already = TRUE; break; }
1540
1541   /* If we haven't found this message in the main record, search any
1542   continuation records that exist. */
1543
1544   for (int i = host_record->sequence - 1; i >= 0 && !already; i--)
1545     {
1546     dbdata_wait *cont;
1547     sprintf(CS buffer, "%.200s:%d", host->name, i);
1548     if ((cont = dbfn_read(dbm_file, buffer)))
1549       {
1550       int clen = cont->count * MESSAGE_ID_LENGTH;
1551       for (uschar * s = cont->text; s < cont->text + clen; s += MESSAGE_ID_LENGTH)
1552         if (Ustrncmp(s, message_id, MESSAGE_ID_LENGTH) == 0)
1553           { already = TRUE; break; }
1554       }
1555     }
1556
1557   /* If this message is already in a record, no need to update. */
1558
1559   if (already)
1560     {
1561     DEBUG(D_transport) debug_printf("already listed for %s\n", host->name);
1562     continue;
1563     }
1564
1565
1566   /* If this record is full, write it out with a new name constructed
1567   from the sequence number, increase the sequence number, and empty
1568   the record.  If we're doing a two-phase queue run initial phase, ping the
1569   daemon to consider running a delivery on this host. */
1570
1571   if (host_record->count >= WAIT_NAME_MAX)
1572     {
1573     sprintf(CS buffer, "%.200s:%d", host->name, host_record->sequence);
1574     dbfn_write(dbm_file, buffer, host_record, sizeof(dbdata_wait) + host_length);
1575 #ifndef DISABLE_QUEUE_RAMP
1576     if (f.queue_2stage && queue_fast_ramp && !queue_run_in_order)
1577       queue_notify_daemon(message_id);
1578 #endif
1579     host_record->sequence++;
1580     host_record->count = 0;
1581     host_length = 0;
1582     }
1583
1584   /* If this record is not full, increase the size of the record to
1585   allow for one new message id. */
1586
1587   else
1588     {
1589     dbdata_wait *newr =
1590       store_get(sizeof(dbdata_wait) + host_length + MESSAGE_ID_LENGTH, FALSE);
1591     memcpy(newr, host_record, sizeof(dbdata_wait) + host_length);
1592     host_record = newr;
1593     }
1594
1595   /* Now add the new name on the end */
1596
1597   memcpy(host_record->text + host_length, message_id, MESSAGE_ID_LENGTH);
1598   host_record->count++;
1599   host_length += MESSAGE_ID_LENGTH;
1600
1601   /* Update the database */
1602
1603   dbfn_write(dbm_file, host->name, host_record, sizeof(dbdata_wait) + host_length);
1604   DEBUG(D_transport) debug_printf("added %.*s to queue for %s\n",
1605                                   MESSAGE_ID_LENGTH, message_id, host->name);
1606   }
1607
1608 /* All now done */
1609
1610 dbfn_close(dbm_file);
1611 }
1612
1613
1614
1615
1616 /*************************************************
1617 *         Test for waiting messages              *
1618 *************************************************/
1619
1620 /* This function is called by a remote transport which uses the previous
1621 function to remember which messages are waiting for which remote hosts. It's
1622 called after a successful delivery and its job is to check whether there is
1623 another message waiting for the same host. However, it doesn't do this if the
1624 current continue sequence is greater than the maximum supplied as an argument,
1625 or greater than the global connection_max_messages, which, if set, overrides.
1626
1627 Arguments:
1628   transport_name     name of the transport
1629   hostname           name of the host
1630   local_message_max  maximum number of messages down one connection
1631                        as set by the caller transport
1632   new_message_id     set to the message id of a waiting message
1633   oicf_func          function to call to validate if it is ok to send
1634                      to this message_id from the current instance.
1635   oicf_data          opaque data for oicf_func
1636
1637 Returns:             TRUE if new_message_id set; FALSE otherwise
1638 */
1639
1640 typedef struct msgq_s
1641 {
1642     uschar  message_id [MESSAGE_ID_LENGTH + 1];
1643     BOOL    bKeep;
1644 } msgq_t;
1645
1646 BOOL
1647 transport_check_waiting(const uschar *transport_name, const uschar *hostname,
1648   int local_message_max, uschar *new_message_id, oicf oicf_func, void *oicf_data)
1649 {
1650 dbdata_wait *host_record;
1651 int host_length;
1652 open_db dbblock;
1653 open_db *dbm_file;
1654
1655 int         i;
1656 struct stat statbuf;
1657
1658 DEBUG(D_transport)
1659   {
1660   debug_printf("transport_check_waiting entered\n");
1661   debug_printf("  sequence=%d local_max=%d global_max=%d\n",
1662     continue_sequence, local_message_max, connection_max_messages);
1663   acl_level++;
1664   }
1665
1666 /* Do nothing if we have hit the maximum number that can be send down one
1667 connection. */
1668
1669 if (connection_max_messages >= 0) local_message_max = connection_max_messages;
1670 if (local_message_max > 0 && continue_sequence >= local_message_max)
1671   {
1672   DEBUG(D_transport)
1673     debug_printf_indent("max messages for one connection reached: returning\n");
1674   goto retfalse;
1675   }
1676
1677 /* Open the waiting information database. */
1678
1679 if (!(dbm_file = dbfn_open(string_sprintf("wait-%.200s", transport_name),
1680                           O_RDWR, &dbblock, TRUE, TRUE)))
1681   goto retfalse;
1682
1683 /* See if there is a record for this host; if not, there's nothing to do. */
1684
1685 if (!(host_record = dbfn_read(dbm_file, hostname)))
1686   {
1687   dbfn_close(dbm_file);
1688   DEBUG(D_transport) debug_printf_indent("no messages waiting for %s\n", hostname);
1689   goto retfalse;
1690   }
1691
1692 /* If the data in the record looks corrupt, just log something and
1693 don't try to use it. */
1694
1695 if (host_record->count > WAIT_NAME_MAX)
1696   {
1697   dbfn_close(dbm_file);
1698   log_write(0, LOG_MAIN|LOG_PANIC, "smtp-wait database entry for %s has bad "
1699     "count=%d (max=%d)", hostname, host_record->count, WAIT_NAME_MAX);
1700   goto retfalse;
1701   }
1702
1703 /* Scan the message ids in the record from the end towards the beginning,
1704 until one is found for which a spool file actually exists. If the record gets
1705 emptied, delete it and continue with any continuation records that may exist.
1706 */
1707
1708 /* For Bug 1141, I refactored this major portion of the routine, it is risky
1709 but the 1 off will remain without it.  This code now allows me to SKIP over
1710 a message I do not want to send out on this run.  */
1711
1712 host_length = host_record->count * MESSAGE_ID_LENGTH;
1713
1714 while (1)
1715   {
1716   msgq_t      *msgq;
1717   int         msgq_count = 0;
1718   int         msgq_actual = 0;
1719   BOOL        bFound = FALSE;
1720   BOOL        bContinuation = FALSE;
1721
1722   /* create an array to read entire message queue into memory for processing  */
1723
1724   msgq = store_get(sizeof(msgq_t) * host_record->count, FALSE);
1725   msgq_count = host_record->count;
1726   msgq_actual = msgq_count;
1727
1728   for (i = 0; i < host_record->count; ++i)
1729     {
1730     msgq[i].bKeep = TRUE;
1731
1732     Ustrncpy_nt(msgq[i].message_id, host_record->text + (i * MESSAGE_ID_LENGTH), 
1733       MESSAGE_ID_LENGTH);
1734     msgq[i].message_id[MESSAGE_ID_LENGTH] = 0;
1735     }
1736
1737   /* first thing remove current message id if it exists */
1738   /*XXX but what if it has un-sent addrs? */
1739
1740   for (i = 0; i < msgq_count; ++i)
1741     if (Ustrcmp(msgq[i].message_id, message_id) == 0)
1742       {
1743       msgq[i].bKeep = FALSE;
1744       break;
1745       }
1746
1747   /* now find the next acceptable message_id */
1748
1749   for (i = msgq_count - 1; i >= 0; --i) if (msgq[i].bKeep)
1750     {
1751     uschar subdir[2];
1752     uschar * mid = msgq[i].message_id;
1753
1754     set_subdir_str(subdir, mid, 0);
1755     if (Ustat(spool_fname(US"input", subdir, mid, US"-D"), &statbuf) != 0)
1756       msgq[i].bKeep = FALSE;
1757     else if (!oicf_func || oicf_func(mid, oicf_data))
1758       {
1759       Ustrcpy_nt(new_message_id, mid);
1760       msgq[i].bKeep = FALSE;
1761       bFound = TRUE;
1762       break;
1763       }
1764     }
1765
1766   /* re-count */
1767   for (msgq_actual = 0, i = 0; i < msgq_count; ++i)
1768     if (msgq[i].bKeep)
1769       msgq_actual++;
1770
1771   /* reassemble the host record, based on removed message ids, from in
1772   memory queue  */
1773
1774   if (msgq_actual <= 0)
1775     {
1776     host_length = 0;
1777     host_record->count = 0;
1778     }
1779   else
1780     {
1781     host_length = msgq_actual * MESSAGE_ID_LENGTH;
1782     host_record->count = msgq_actual;
1783
1784     if (msgq_actual < msgq_count)
1785       {
1786       int new_count;
1787       for (new_count = 0, i = 0; i < msgq_count; ++i)
1788         if (msgq[i].bKeep)
1789           Ustrncpy(&host_record->text[new_count++ * MESSAGE_ID_LENGTH],
1790             msgq[i].message_id, MESSAGE_ID_LENGTH);
1791
1792       host_record->text[new_count * MESSAGE_ID_LENGTH] = 0;
1793       }
1794     }
1795
1796   /* Check for a continuation record. */
1797
1798   while (host_length <= 0)
1799     {
1800     dbdata_wait * newr = NULL;
1801     uschar buffer[256];
1802
1803     /* Search for a continuation */
1804
1805     for (int i = host_record->sequence - 1; i >= 0 && !newr; i--)
1806       {
1807       sprintf(CS buffer, "%.200s:%d", hostname, i);
1808       newr = dbfn_read(dbm_file, buffer);
1809       }
1810
1811     /* If no continuation, delete the current and break the loop */
1812
1813     if (!newr)
1814       {
1815       dbfn_delete(dbm_file, hostname);
1816       break;
1817       }
1818
1819     /* Else replace the current with the continuation */
1820
1821     dbfn_delete(dbm_file, buffer);
1822     host_record = newr;
1823     host_length = host_record->count * MESSAGE_ID_LENGTH;
1824
1825     bContinuation = TRUE;
1826     }
1827
1828   if (bFound)           /* Usual exit from main loop */
1829     break;
1830
1831   /* If host_length <= 0 we have emptied a record and not found a good message,
1832   and there are no continuation records. Otherwise there is a continuation
1833   record to process. */
1834
1835   if (host_length <= 0)
1836     {
1837     dbfn_close(dbm_file);
1838     DEBUG(D_transport) debug_printf_indent("waiting messages already delivered\n");
1839     goto retfalse;
1840     }
1841
1842   /* we were not able to find an acceptable message, nor was there a
1843    * continuation record.  So bug out, outer logic will clean this up.
1844    */
1845
1846   if (!bContinuation)
1847     {
1848     Ustrcpy(new_message_id, message_id);
1849     dbfn_close(dbm_file);
1850     goto retfalse;
1851     }
1852   }             /* we need to process a continuation record */
1853
1854 /* Control gets here when an existing message has been encountered; its
1855 id is in new_message_id, and host_length is the revised length of the
1856 host record. If it is zero, the record has been removed. Update the
1857 record if required, close the database, and return TRUE. */
1858
1859 if (host_length > 0)
1860   {
1861   host_record->count = host_length/MESSAGE_ID_LENGTH;
1862   dbfn_write(dbm_file, hostname, host_record, (int)sizeof(dbdata_wait) + host_length);
1863   }
1864
1865 dbfn_close(dbm_file);
1866 DEBUG(D_transport) {acl_level--; debug_printf("transport_check_waiting: TRUE\n"); }
1867 return TRUE;
1868
1869 retfalse:
1870 DEBUG(D_transport) {acl_level--; debug_printf("transport_check_waiting: FALSE\n"); }
1871 return FALSE;
1872 }
1873
1874 /*************************************************
1875 *    Deliver waiting message down same socket    *
1876 *************************************************/
1877
1878 /* Just the regain-root-privilege exec portion */
1879 void
1880 transport_do_pass_socket(const uschar *transport_name, const uschar *hostname,
1881   const uschar *hostaddress, uschar *id, int socket_fd)
1882 {
1883 int i = 27;
1884 const uschar **argv;
1885
1886 /* Set up the calling arguments; use the standard function for the basics,
1887 but we have a number of extras that may be added. */
1888
1889 argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, &i, FALSE, 0);
1890
1891 if (f.smtp_authenticated)                       argv[i++] = US"-MCA";
1892 if (smtp_peer_options & OPTION_CHUNKING)        argv[i++] = US"-MCK";
1893 if (smtp_peer_options & OPTION_DSN)             argv[i++] = US"-MCD";
1894 if (smtp_peer_options & OPTION_PIPE)            argv[i++] = US"-MCP";
1895 if (smtp_peer_options & OPTION_SIZE)            argv[i++] = US"-MCS";
1896 #ifndef DISABLE_TLS
1897 if (smtp_peer_options & OPTION_TLS)
1898   if (tls_out.active.sock >= 0 || continue_proxy_cipher)
1899     {
1900     argv[i++] = US"-MCt";
1901     argv[i++] = sending_ip_address;
1902     argv[i++] = string_sprintf("%d", sending_port);
1903     argv[i++] = tls_out.active.sock >= 0 ? tls_out.cipher : continue_proxy_cipher;
1904
1905     if (tls_out.sni)
1906       {
1907       argv[i++] =
1908 #ifdef SUPPORT_DANE
1909         tls_out.dane_verified ? US"-MCr" :
1910 #endif
1911         US"-MCs";
1912       argv[i++] = tls_out.sni;
1913       }
1914     }
1915   else
1916     argv[i++] = US"-MCT";
1917 #endif
1918
1919 if (queue_run_pid != (pid_t)0)
1920   {
1921   argv[i++] = US"-MCQ";
1922   argv[i++] = string_sprintf("%d", queue_run_pid);
1923   argv[i++] = string_sprintf("%d", queue_run_pipe);
1924   }
1925
1926 #ifdef SUPPORT_SOCKS
1927 if (proxy_session)
1928   {
1929   argv[i++] = US"-MCp";
1930   argv[i++] = proxy_local_address;
1931   argv[i++] = string_sprintf("%d", proxy_local_port);
1932   argv[i++] = proxy_external_address;
1933   argv[i++] = string_sprintf("%d", proxy_external_port);
1934   }
1935 #endif
1936
1937 argv[i++] = US"-MC";
1938 argv[i++] = US transport_name;
1939 argv[i++] = US hostname;
1940 argv[i++] = US hostaddress;
1941 argv[i++] = string_sprintf("%d", continue_sequence + 1);
1942 argv[i++] = id;
1943 argv[i++] = NULL;
1944
1945 /* Arrange for the channel to be on stdin. */
1946
1947 if (socket_fd != 0)
1948   {
1949   (void)dup2(socket_fd, 0);
1950   (void)close(socket_fd);
1951   }
1952
1953 DEBUG(D_exec) debug_print_argv(argv);
1954 exim_nullstd();                          /* Ensure std{out,err} exist */
1955 execv(CS argv[0], (char *const *)argv);
1956
1957 DEBUG(D_any) debug_printf("execv failed: %s\n", strerror(errno));
1958 _exit(errno);         /* Note: must be _exit(), NOT exit() */
1959 }
1960
1961
1962
1963 /* Fork a new exim process to deliver the message, and do a re-exec, both to
1964 get a clean delivery process, and to regain root privilege in cases where it
1965 has been given away.
1966
1967 Arguments:
1968   transport_name  to pass to the new process
1969   hostname        ditto
1970   hostaddress     ditto
1971   id              the new message to process
1972   socket_fd       the connected socket
1973
1974 Returns:          FALSE if fork fails; TRUE otherwise
1975 */
1976
1977 BOOL
1978 transport_pass_socket(const uschar *transport_name, const uschar *hostname,
1979   const uschar *hostaddress, uschar *id, int socket_fd)
1980 {
1981 pid_t pid;
1982 int status;
1983
1984 DEBUG(D_transport) debug_printf("transport_pass_socket entered\n");
1985
1986 if ((pid = exim_fork(US"continued-transport-interproc")) == 0)
1987   {
1988   /* Disconnect entirely from the parent process. If we are running in the
1989   test harness, wait for a bit to allow the previous process time to finish,
1990   write the log, etc., so that the output is always in the same order for
1991   automatic comparison. */
1992
1993   if ((pid = exim_fork(US"continued-transport")) != 0)
1994     _exit(EXIT_SUCCESS);
1995   testharness_pause_ms(1000);
1996
1997   transport_do_pass_socket(transport_name, hostname, hostaddress,
1998     id, socket_fd);
1999   }
2000
2001 /* If the process creation succeeded, wait for the first-level child, which
2002 immediately exits, leaving the second level process entirely disconnected from
2003 this one. */
2004
2005 if (pid > 0)
2006   {
2007   int rc;
2008   while ((rc = wait(&status)) != pid && (rc >= 0 || errno != ECHILD));
2009   return TRUE;
2010   }
2011 else
2012   {
2013   DEBUG(D_transport) debug_printf("transport_pass_socket failed to fork: %s\n",
2014     strerror(errno));
2015   return FALSE;
2016   }
2017 }
2018
2019
2020
2021 /*************************************************
2022 *          Set up direct (non-shell) command     *
2023 *************************************************/
2024
2025 /* This function is called when a command line is to be parsed and executed
2026 directly, without the use of /bin/sh. It is called by the pipe transport,
2027 the queryprogram router, and also from the main delivery code when setting up a
2028 transport filter process. The code for ETRN also makes use of this; in that
2029 case, no addresses are passed.
2030
2031 Arguments:
2032   argvptr            pointer to anchor for argv vector
2033   cmd                points to the command string (modified IN PLACE)
2034   expand_arguments   true if expansion is to occur
2035   expand_failed      error value to set if expansion fails; not relevant if
2036                      addr == NULL
2037   addr               chain of addresses, or NULL
2038   etext              text for use in error messages
2039   errptr             where to put error message if addr is NULL;
2040                      otherwise it is put in the first address
2041
2042 Returns:             TRUE if all went well; otherwise an error will be
2043                      set in the first address and FALSE returned
2044 */
2045
2046 BOOL
2047 transport_set_up_command(const uschar ***argvptr, uschar *cmd,
2048   BOOL expand_arguments, int expand_failed, address_item *addr,
2049   uschar *etext, uschar **errptr)
2050 {
2051 const uschar **argv;
2052 uschar *s, *ss;
2053 int address_count = 0;
2054 int argcount = 0;
2055 int max_args;
2056
2057 /* Get store in which to build an argument list. Count the number of addresses
2058 supplied, and allow for that many arguments, plus an additional 60, which
2059 should be enough for anybody. Multiple addresses happen only when the local
2060 delivery batch option is set. */
2061
2062 for (address_item * ad = addr; ad; ad = ad->next) address_count++;
2063 max_args = address_count + 60;
2064 *argvptr = argv = store_get((max_args+1)*sizeof(uschar *), FALSE);
2065
2066 /* Split the command up into arguments terminated by white space. Lose
2067 trailing space at the start and end. Double-quoted arguments can contain \\ and
2068 \" escapes and so can be handled by the standard function; single-quoted
2069 arguments are verbatim. Copy each argument into a new string. */
2070
2071 s = cmd;
2072 while (isspace(*s)) s++;
2073
2074 for (; *s != 0 && argcount < max_args; argcount++)
2075   {
2076   if (*s == '\'')
2077     {
2078     ss = s + 1;
2079     while (*ss != 0 && *ss != '\'') ss++;
2080     argv[argcount] = ss = store_get(ss - s++, is_tainted(cmd));
2081     while (*s != 0 && *s != '\'') *ss++ = *s++;
2082     if (*s != 0) s++;
2083     *ss++ = 0;
2084     }
2085   else
2086     argv[argcount] = string_dequote(CUSS &s);
2087   while (isspace(*s)) s++;
2088   }
2089
2090 argv[argcount] = US 0;
2091
2092 /* If *s != 0 we have run out of argument slots. */
2093
2094 if (*s != 0)
2095   {
2096   uschar *msg = string_sprintf("Too many arguments in command \"%s\" in "
2097     "%s", cmd, etext);
2098   if (addr != NULL)
2099     {
2100     addr->transport_return = FAIL;
2101     addr->message = msg;
2102     }
2103   else *errptr = msg;
2104   return FALSE;
2105   }
2106
2107 /* Expand each individual argument if required. Expansion happens for pipes set
2108 up in filter files and with directly-supplied commands. It does not happen if
2109 the pipe comes from a traditional .forward file. A failing expansion is a big
2110 disaster if the command came from Exim's configuration; if it came from a user
2111 it is just a normal failure. The expand_failed value is used as the error value
2112 to cater for these two cases.
2113
2114 An argument consisting just of the text "$pipe_addresses" is treated specially.
2115 It is not passed to the general expansion function. Instead, it is replaced by
2116 a number of arguments, one for each address. This avoids problems with shell
2117 metacharacters and spaces in addresses.
2118
2119 If the parent of the top address has an original part of "system-filter", this
2120 pipe was set up by the system filter, and we can permit the expansion of
2121 $recipients. */
2122
2123 DEBUG(D_transport)
2124   {
2125   debug_printf("direct command:\n");
2126   for (int i = 0; argv[i]; i++)
2127     debug_printf("  argv[%d] = '%s'\n", i, string_printing(argv[i]));
2128   }
2129
2130 if (expand_arguments)
2131   {
2132   BOOL allow_dollar_recipients = addr != NULL &&
2133     addr->parent != NULL &&
2134     Ustrcmp(addr->parent->address, "system-filter") == 0;
2135
2136   for (int i = 0; argv[i] != US 0; i++)
2137     {
2138
2139     /* Handle special fudge for passing an address list */
2140
2141     if (addr != NULL &&
2142         (Ustrcmp(argv[i], "$pipe_addresses") == 0 ||
2143          Ustrcmp(argv[i], "${pipe_addresses}") == 0))
2144       {
2145       int additional;
2146
2147       if (argcount + address_count - 1 > max_args)
2148         {
2149         addr->transport_return = FAIL;
2150         addr->message = string_sprintf("Too many arguments to command \"%s\" "
2151           "in %s", cmd, etext);
2152         return FALSE;
2153         }
2154
2155       additional = address_count - 1;
2156       if (additional > 0)
2157         memmove(argv + i + 1 + additional, argv + i + 1,
2158           (argcount - i)*sizeof(uschar *));
2159
2160       for (address_item * ad = addr; ad; ad = ad->next)
2161         {
2162         argv[i++] = ad->address;
2163         argcount++;
2164         }
2165
2166       /* Subtract one since we replace $pipe_addresses */
2167       argcount--;
2168       i--;
2169       }
2170
2171       /* Handle special case of $address_pipe when af_force_command is set */
2172
2173     else if (addr != NULL && testflag(addr,af_force_command) &&
2174         (Ustrcmp(argv[i], "$address_pipe") == 0 ||
2175          Ustrcmp(argv[i], "${address_pipe}") == 0))
2176       {
2177       int address_pipe_argcount = 0;
2178       int address_pipe_max_args;
2179       uschar **address_pipe_argv;
2180       BOOL tainted;
2181
2182       /* We can never have more then the argv we will be loading into */
2183       address_pipe_max_args = max_args - argcount + 1;
2184
2185       DEBUG(D_transport)
2186         debug_printf("address_pipe_max_args=%d\n", address_pipe_max_args);
2187
2188       /* We allocate an additional for (uschar *)0 */
2189       address_pipe_argv = store_get((address_pipe_max_args+1)*sizeof(uschar *), FALSE);
2190
2191       /* +1 because addr->local_part[0] == '|' since af_force_command is set */
2192       s = expand_string(addr->local_part + 1);
2193       tainted = is_tainted(s);
2194
2195       if (s == NULL || *s == '\0')
2196         {
2197         addr->transport_return = FAIL;
2198         addr->message = string_sprintf("Expansion of \"%s\" "
2199            "from command \"%s\" in %s failed: %s",
2200            (addr->local_part + 1), cmd, etext, expand_string_message);
2201         return FALSE;
2202         }
2203
2204       while (isspace(*s)) s++; /* strip leading space */
2205
2206       while (*s != 0 && address_pipe_argcount < address_pipe_max_args)
2207         {
2208         if (*s == '\'')
2209           {
2210           ss = s + 1;
2211           while (*ss != 0 && *ss != '\'') ss++;
2212           address_pipe_argv[address_pipe_argcount++] = ss = store_get(ss - s++, tainted);
2213           while (*s != 0 && *s != '\'') *ss++ = *s++;
2214           if (*s != 0) s++;
2215           *ss++ = 0;
2216           }
2217         else address_pipe_argv[address_pipe_argcount++] =
2218               string_copy(string_dequote(CUSS &s));
2219         while (isspace(*s)) s++; /* strip space after arg */
2220         }
2221
2222       address_pipe_argv[address_pipe_argcount] = US 0;
2223
2224       /* If *s != 0 we have run out of argument slots. */
2225       if (*s != 0)
2226         {
2227         uschar *msg = string_sprintf("Too many arguments in $address_pipe "
2228           "\"%s\" in %s", addr->local_part + 1, etext);
2229         if (addr != NULL)
2230           {
2231           addr->transport_return = FAIL;
2232           addr->message = msg;
2233           }
2234         else *errptr = msg;
2235         return FALSE;
2236         }
2237
2238       /* address_pipe_argcount - 1
2239        * because we are replacing $address_pipe in the argument list
2240        * with the first thing it expands to */
2241       if (argcount + address_pipe_argcount - 1 > max_args)
2242         {
2243         addr->transport_return = FAIL;
2244         addr->message = string_sprintf("Too many arguments to command "
2245           "\"%s\" after expanding $address_pipe in %s", cmd, etext);
2246         return FALSE;
2247         }
2248
2249       /* If we are not just able to replace the slot that contained
2250        * $address_pipe (address_pipe_argcount == 1)
2251        * We have to move the existing argv by address_pipe_argcount - 1
2252        * Visually if address_pipe_argcount == 2:
2253        * [argv 0][argv 1][argv 2($address_pipe)][argv 3][0]
2254        * [argv 0][argv 1][ap_arg0][ap_arg1][old argv 3][0]
2255        */
2256       if (address_pipe_argcount > 1)
2257         memmove(
2258           /* current position + additional args */
2259           argv + i + address_pipe_argcount,
2260           /* current position + 1 (for the (uschar *)0 at the end) */
2261           argv + i + 1,
2262           /* -1 for the (uschar *)0 at the end)*/
2263           (argcount - i)*sizeof(uschar *)
2264         );
2265
2266       /* Now we fill in the slots we just moved argv out of
2267        * [argv 0][argv 1][argv 2=pipeargv[0]][argv 3=pipeargv[1]][old argv 3][0]
2268        */
2269       for (int address_pipe_i = 0;
2270            address_pipe_argv[address_pipe_i] != US 0;
2271            address_pipe_i++)
2272         {
2273         argv[i++] = address_pipe_argv[address_pipe_i];
2274         argcount++;
2275         }
2276
2277       /* Subtract one since we replace $address_pipe */
2278       argcount--;
2279       i--;
2280       }
2281
2282     /* Handle normal expansion string */
2283
2284     else
2285       {
2286       const uschar *expanded_arg;
2287       f.enable_dollar_recipients = allow_dollar_recipients;
2288       expanded_arg = expand_cstring(argv[i]);
2289       f.enable_dollar_recipients = FALSE;
2290
2291       if (!expanded_arg)
2292         {
2293         uschar *msg = string_sprintf("Expansion of \"%s\" "
2294           "from command \"%s\" in %s failed: %s",
2295           argv[i], cmd, etext, expand_string_message);
2296         if (addr)
2297           {
2298           addr->transport_return = expand_failed;
2299           addr->message = msg;
2300           }
2301         else *errptr = msg;
2302         return FALSE;
2303         }
2304       argv[i] = expanded_arg;
2305       }
2306     }
2307
2308   DEBUG(D_transport)
2309     {
2310     debug_printf("direct command after expansion:\n");
2311     for (int i = 0; argv[i] != US 0; i++)
2312       debug_printf("  argv[%d] = %s\n", i, string_printing(argv[i]));
2313     }
2314   }
2315
2316 return TRUE;
2317 }
2318
2319 #endif  /*!MACRO_PREDEF*/
2320 /* vi: aw ai sw=2
2321 */
2322 /* End of transport.c */