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