deliver.c revision 363466
1/*
2 * Copyright (c) 1998-2010, 2012 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
5 * Copyright (c) 1988, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * By using this file, you agree to the terms and conditions set
9 * forth in the LICENSE file which can be found at the top level of
10 * the sendmail distribution.
11 *
12 */
13
14#include <sendmail.h>
15#include <sm/time.h>
16
17SM_RCSID("@(#)$Id: deliver.c,v 8.1030 2013-11-22 20:51:55 ca Exp $")
18
19#if HASSETUSERCONTEXT
20# include <login_cap.h>
21#endif
22
23#if NETINET || NETINET6
24# include <arpa/inet.h>
25#endif
26
27#if STARTTLS || SASL
28# include "sfsasl.h"
29# include "tls.h"
30#endif
31
32static int	deliver __P((ENVELOPE *, ADDRESS *));
33static void	dup_queue_file __P((ENVELOPE *, ENVELOPE *, int));
34static void	mailfiletimeout __P((int));
35static void	endwaittimeout __P((int));
36static int	parse_hostsignature __P((char *, char **, MAILER *));
37static void	sendenvelope __P((ENVELOPE *, int));
38static int	coloncmp __P((const char *, const char *));
39
40#if STARTTLS
41# include <openssl/err.h>
42# if DANE
43static int	starttls __P((MAILER *, MCI *, ENVELOPE *, dane_vrfy_ctx_P));
44# else
45static int	starttls __P((MAILER *, MCI *, ENVELOPE *));
46# endif
47static int	endtlsclt __P((MCI *));
48#endif /* STARTTLS */
49#if STARTTLS || SASL
50static bool	iscltflgset __P((ENVELOPE *, int));
51#endif
52
53#if _FFR_OCC
54# include <ratectrl.h>
55#endif
56
57/*
58**  SENDALL -- actually send all the messages.
59**
60**	Parameters:
61**		e -- the envelope to send.
62**		mode -- the delivery mode to use.  If SM_DEFAULT, use
63**			the current e->e_sendmode.
64**
65**	Returns:
66**		none.
67**
68**	Side Effects:
69**		Scans the send lists and sends everything it finds.
70**		Delivers any appropriate error messages.
71**		If we are running in a non-interactive mode, takes the
72**			appropriate action.
73*/
74
75void
76sendall(e, mode)
77	ENVELOPE *e;
78	int mode;
79{
80	register ADDRESS *q;
81	char *owner;
82	int otherowners;
83	int save_errno;
84	register ENVELOPE *ee;
85	ENVELOPE *splitenv = NULL;
86	int oldverbose = Verbose;
87	bool somedeliveries = false, expensive = false;
88	pid_t pid;
89
90	/*
91	**  If this message is to be discarded, don't bother sending
92	**  the message at all.
93	*/
94
95	if (bitset(EF_DISCARD, e->e_flags))
96	{
97		if (tTd(13, 1))
98			sm_dprintf("sendall: discarding id %s\n", e->e_id);
99		e->e_flags |= EF_CLRQUEUE;
100		if (LogLevel > 9)
101			logundelrcpts(e, "discarded", 9, true);
102		else if (LogLevel > 4)
103			sm_syslog(LOG_INFO, e->e_id, "discarded");
104		markstats(e, NULL, STATS_REJECT);
105		return;
106	}
107
108	/*
109	**  If we have had global, fatal errors, don't bother sending
110	**  the message at all if we are in SMTP mode.  Local errors
111	**  (e.g., a single address failing) will still cause the other
112	**  addresses to be sent.
113	*/
114
115	if (bitset(EF_FATALERRS, e->e_flags) &&
116	    (OpMode == MD_SMTP || OpMode == MD_DAEMON))
117	{
118		e->e_flags |= EF_CLRQUEUE;
119		return;
120	}
121
122	/* determine actual delivery mode */
123	if (mode == SM_DEFAULT)
124	{
125		mode = e->e_sendmode;
126		if (mode != SM_VERIFY && mode != SM_DEFER &&
127		    shouldqueue(e->e_msgpriority, e->e_ctime))
128			mode = SM_QUEUE;
129	}
130
131	if (tTd(13, 1))
132	{
133		sm_dprintf("\n===== SENDALL: mode %c, id %s, e_from ",
134			mode, e->e_id);
135		printaddr(sm_debug_file(), &e->e_from, false);
136		sm_dprintf("\te_flags = ");
137		printenvflags(e);
138		sm_dprintf("sendqueue:\n");
139		printaddr(sm_debug_file(), e->e_sendqueue, true);
140	}
141
142	/*
143	**  Do any preprocessing necessary for the mode we are running.
144	**	Check to make sure the hop count is reasonable.
145	**	Delete sends to the sender in mailing lists.
146	*/
147
148	CurEnv = e;
149	if (tTd(62, 1))
150		checkfds(NULL);
151
152	if (e->e_hopcount > MaxHopCount)
153	{
154		char *recip;
155
156		if (e->e_sendqueue != NULL &&
157		    e->e_sendqueue->q_paddr != NULL)
158			recip = e->e_sendqueue->q_paddr;
159		else
160			recip = "(nobody)";
161
162		errno = 0;
163		queueup(e, WILL_BE_QUEUED(mode), false);
164		e->e_flags |= EF_FATALERRS|EF_PM_NOTIFY|EF_CLRQUEUE;
165		ExitStat = EX_UNAVAILABLE;
166		syserr("554 5.4.6 Too many hops %d (%d max): from %s via %s, to %s",
167		       e->e_hopcount, MaxHopCount, e->e_from.q_paddr,
168		       RealHostName == NULL ? "localhost" : RealHostName,
169		       recip);
170		for (q = e->e_sendqueue; q != NULL; q = q->q_next)
171		{
172			if (QS_IS_DEAD(q->q_state))
173				continue;
174			q->q_state = QS_BADADDR;
175			q->q_status = "5.4.6";
176			q->q_rstatus = "554 5.4.6 Too many hops";
177		}
178		return;
179	}
180
181	/*
182	**  Do sender deletion.
183	**
184	**	If the sender should be queued up, skip this.
185	**	This can happen if the name server is hosed when you
186	**	are trying to send mail.  The result is that the sender
187	**	is instantiated in the queue as a recipient.
188	*/
189
190	if (!bitset(EF_METOO, e->e_flags) &&
191	    !QS_IS_QUEUEUP(e->e_from.q_state))
192	{
193		if (tTd(13, 5))
194		{
195			sm_dprintf("sendall: QS_SENDER ");
196			printaddr(sm_debug_file(), &e->e_from, false);
197		}
198		e->e_from.q_state = QS_SENDER;
199		(void) recipient(&e->e_from, &e->e_sendqueue, 0, e);
200	}
201
202	/*
203	**  Handle alias owners.
204	**
205	**	We scan up the q_alias chain looking for owners.
206	**	We discard owners that are the same as the return path.
207	*/
208
209	for (q = e->e_sendqueue; q != NULL; q = q->q_next)
210	{
211		register struct address *a;
212
213		for (a = q; a != NULL && a->q_owner == NULL; a = a->q_alias)
214			continue;
215		if (a != NULL)
216			q->q_owner = a->q_owner;
217
218		if (q->q_owner != NULL &&
219		    !QS_IS_DEAD(q->q_state) &&
220		    strcmp(q->q_owner, e->e_from.q_paddr) == 0)
221			q->q_owner = NULL;
222	}
223
224	if (tTd(13, 25))
225	{
226		sm_dprintf("\nAfter first owner pass, sendq =\n");
227		printaddr(sm_debug_file(), e->e_sendqueue, true);
228	}
229
230	owner = "";
231	otherowners = 1;
232	while (owner != NULL && otherowners > 0)
233	{
234		if (tTd(13, 28))
235			sm_dprintf("owner = \"%s\", otherowners = %d\n",
236				   owner, otherowners);
237		owner = NULL;
238		otherowners = bitset(EF_SENDRECEIPT, e->e_flags) ? 1 : 0;
239
240		for (q = e->e_sendqueue; q != NULL; q = q->q_next)
241		{
242			if (tTd(13, 30))
243			{
244				sm_dprintf("Checking ");
245				printaddr(sm_debug_file(), q, false);
246			}
247			if (QS_IS_DEAD(q->q_state))
248			{
249				if (tTd(13, 30))
250					sm_dprintf("    ... QS_IS_DEAD\n");
251				continue;
252			}
253			if (tTd(13, 29) && !tTd(13, 30))
254			{
255				sm_dprintf("Checking ");
256				printaddr(sm_debug_file(), q, false);
257			}
258
259			if (q->q_owner != NULL)
260			{
261				if (owner == NULL)
262				{
263					if (tTd(13, 40))
264						sm_dprintf("    ... First owner = \"%s\"\n",
265							   q->q_owner);
266					owner = q->q_owner;
267				}
268				else if (owner != q->q_owner)
269				{
270					if (strcmp(owner, q->q_owner) == 0)
271					{
272						if (tTd(13, 40))
273							sm_dprintf("    ... Same owner = \"%s\"\n",
274								   owner);
275
276						/* make future comparisons cheap */
277						q->q_owner = owner;
278					}
279					else
280					{
281						if (tTd(13, 40))
282							sm_dprintf("    ... Another owner \"%s\"\n",
283								   q->q_owner);
284						otherowners++;
285					}
286					owner = q->q_owner;
287				}
288				else if (tTd(13, 40))
289					sm_dprintf("    ... Same owner = \"%s\"\n",
290						   owner);
291			}
292			else
293			{
294				if (tTd(13, 40))
295					sm_dprintf("    ... Null owner\n");
296				otherowners++;
297			}
298
299			if (QS_IS_BADADDR(q->q_state))
300			{
301				if (tTd(13, 30))
302					sm_dprintf("    ... QS_IS_BADADDR\n");
303				continue;
304			}
305
306			if (QS_IS_QUEUEUP(q->q_state))
307			{
308				MAILER *m = q->q_mailer;
309
310				/*
311				**  If we have temporary address failures
312				**  (e.g., dns failure) and a fallback MX is
313				**  set, send directly to the fallback MX host.
314				*/
315
316				if (FallbackMX != NULL &&
317				    !wordinclass(FallbackMX, 'w') &&
318				    mode != SM_VERIFY &&
319				    !bitnset(M_NOMX, m->m_flags) &&
320				    strcmp(m->m_mailer, "[IPC]") == 0 &&
321				    m->m_argv[0] != NULL &&
322				    strcmp(m->m_argv[0], "TCP") == 0)
323				{
324					int len;
325					char *p;
326
327					if (tTd(13, 30))
328						sm_dprintf("    ... FallbackMX\n");
329
330					len = strlen(FallbackMX) + 1;
331					p = sm_rpool_malloc_x(e->e_rpool, len);
332					(void) sm_strlcpy(p, FallbackMX, len);
333					q->q_state = QS_OK;
334					q->q_host = p;
335				}
336				else
337				{
338					if (tTd(13, 30))
339						sm_dprintf("    ... QS_IS_QUEUEUP\n");
340					continue;
341				}
342			}
343
344			/*
345			**  If this mailer is expensive, and if we don't
346			**  want to make connections now, just mark these
347			**  addresses and return.  This is useful if we
348			**  want to batch connections to reduce load.  This
349			**  will cause the messages to be queued up, and a
350			**  daemon will come along to send the messages later.
351			*/
352
353			if (NoConnect && !Verbose &&
354			    bitnset(M_EXPENSIVE, q->q_mailer->m_flags))
355			{
356				if (tTd(13, 30))
357					sm_dprintf("    ... expensive\n");
358				q->q_state = QS_QUEUEUP;
359				expensive = true;
360			}
361			else if (bitnset(M_HOLD, q->q_mailer->m_flags) &&
362				 QueueLimitId == NULL &&
363				 QueueLimitSender == NULL &&
364				 QueueLimitRecipient == NULL)
365			{
366				if (tTd(13, 30))
367					sm_dprintf("    ... hold\n");
368				q->q_state = QS_QUEUEUP;
369				expensive = true;
370			}
371			else if (QueueMode != QM_QUARANTINE &&
372				 e->e_quarmsg != NULL)
373			{
374				if (tTd(13, 30))
375					sm_dprintf("    ... quarantine: %s\n",
376						   e->e_quarmsg);
377				q->q_state = QS_QUEUEUP;
378				expensive = true;
379			}
380			else
381			{
382				if (tTd(13, 30))
383					sm_dprintf("    ... deliverable\n");
384				somedeliveries = true;
385			}
386		}
387
388		if (owner != NULL && otherowners > 0)
389		{
390			/*
391			**  Split this envelope into two.
392			*/
393
394			ee = (ENVELOPE *) sm_rpool_malloc_x(e->e_rpool,
395							    sizeof(*ee));
396			STRUCTCOPY(*e, *ee);
397			ee->e_message = NULL;
398			ee->e_id = NULL;
399			assign_queueid(ee);
400
401			if (tTd(13, 1))
402				sm_dprintf("sendall: split %s into %s, owner = \"%s\", otherowners = %d\n",
403					   e->e_id, ee->e_id, owner,
404					   otherowners);
405
406			ee->e_header = copyheader(e->e_header, ee->e_rpool);
407			ee->e_sendqueue = copyqueue(e->e_sendqueue,
408						    ee->e_rpool);
409			ee->e_errorqueue = copyqueue(e->e_errorqueue,
410						     ee->e_rpool);
411			ee->e_flags = e->e_flags & ~(EF_INQUEUE|EF_CLRQUEUE|EF_FATALERRS|EF_SENDRECEIPT|EF_RET_PARAM);
412			ee->e_flags |= EF_NORECEIPT;
413			setsender(owner, ee, NULL, '\0', true);
414			if (tTd(13, 5))
415			{
416				sm_dprintf("sendall(split): QS_SENDER ");
417				printaddr(sm_debug_file(), &ee->e_from, false);
418			}
419			ee->e_from.q_state = QS_SENDER;
420			ee->e_dfp = NULL;
421			ee->e_lockfp = NULL;
422			ee->e_xfp = NULL;
423			ee->e_qgrp = e->e_qgrp;
424			ee->e_qdir = e->e_qdir;
425			ee->e_errormode = EM_MAIL;
426			ee->e_sibling = splitenv;
427			ee->e_statmsg = NULL;
428			if (e->e_quarmsg != NULL)
429				ee->e_quarmsg = sm_rpool_strdup_x(ee->e_rpool,
430								  e->e_quarmsg);
431			splitenv = ee;
432
433			for (q = e->e_sendqueue; q != NULL; q = q->q_next)
434			{
435				if (q->q_owner == owner)
436				{
437					q->q_state = QS_CLONED;
438					if (tTd(13, 6))
439						sm_dprintf("\t... stripping %s from original envelope\n",
440							   q->q_paddr);
441				}
442			}
443			for (q = ee->e_sendqueue; q != NULL; q = q->q_next)
444			{
445				if (q->q_owner != owner)
446				{
447					q->q_state = QS_CLONED;
448					if (tTd(13, 6))
449						sm_dprintf("\t... dropping %s from cloned envelope\n",
450							   q->q_paddr);
451				}
452				else
453				{
454					/* clear DSN parameters */
455					q->q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS);
456					q->q_flags |= DefaultNotify & ~QPINGONSUCCESS;
457					if (tTd(13, 6))
458						sm_dprintf("\t... moving %s to cloned envelope\n",
459							   q->q_paddr);
460				}
461			}
462
463			if (mode != SM_VERIFY && bitset(EF_HAS_DF, e->e_flags))
464				dup_queue_file(e, ee, DATAFL_LETTER);
465
466			/*
467			**  Give the split envelope access to the parent
468			**  transcript file for errors obtained while
469			**  processing the recipients (done before the
470			**  envelope splitting).
471			*/
472
473			if (e->e_xfp != NULL)
474				ee->e_xfp = sm_io_dup(e->e_xfp);
475
476			/* failed to dup e->e_xfp, start a new transcript */
477			if (ee->e_xfp == NULL)
478				openxscript(ee);
479
480			if (mode != SM_VERIFY && LogLevel > 4)
481				sm_syslog(LOG_INFO, e->e_id,
482					  "%s: clone: owner=%s",
483					  ee->e_id, owner);
484		}
485	}
486
487	if (owner != NULL)
488	{
489		setsender(owner, e, NULL, '\0', true);
490		if (tTd(13, 5))
491		{
492			sm_dprintf("sendall(owner): QS_SENDER ");
493			printaddr(sm_debug_file(), &e->e_from, false);
494		}
495		e->e_from.q_state = QS_SENDER;
496		e->e_errormode = EM_MAIL;
497		e->e_flags |= EF_NORECEIPT;
498		e->e_flags &= ~EF_FATALERRS;
499	}
500
501	/* if nothing to be delivered, just queue up everything */
502	if (!somedeliveries && !WILL_BE_QUEUED(mode) &&
503	    mode != SM_VERIFY)
504	{
505		time_t now;
506
507		if (tTd(13, 29))
508			sm_dprintf("No deliveries: auto-queueing\n");
509		mode = SM_QUEUE;
510		now = curtime();
511
512		/* treat this as a delivery in terms of counting tries */
513		e->e_dtime = now;
514		if (!expensive)
515			e->e_ntries++;
516		for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
517		{
518			ee->e_dtime = now;
519			if (!expensive)
520				ee->e_ntries++;
521		}
522	}
523
524	if ((WILL_BE_QUEUED(mode) || mode == SM_FORK ||
525	     (mode != SM_VERIFY &&
526	      (SuperSafe == SAFE_REALLY ||
527	       SuperSafe == SAFE_REALLY_POSTMILTER))) &&
528	    (!bitset(EF_INQUEUE, e->e_flags) || splitenv != NULL))
529	{
530		bool msync;
531
532		/*
533		**  Be sure everything is instantiated in the queue.
534		**  Split envelopes first in case the machine crashes.
535		**  If the original were done first, we may lose
536		**  recipients.
537		*/
538
539#if !HASFLOCK
540		msync = false;
541#else
542		msync = mode == SM_FORK;
543#endif
544
545		for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
546			queueup(ee, WILL_BE_QUEUED(mode), msync);
547		queueup(e, WILL_BE_QUEUED(mode), msync);
548	}
549
550	if (tTd(62, 10))
551		checkfds("after envelope splitting");
552
553	/*
554	**  If we belong in background, fork now.
555	*/
556
557	if (tTd(13, 20))
558	{
559		sm_dprintf("sendall: final mode = %c\n", mode);
560		if (tTd(13, 21))
561		{
562			sm_dprintf("\n================ Final Send Queue(s) =====================\n");
563			sm_dprintf("\n  *** Envelope %s, e_from=%s ***\n",
564				   e->e_id, e->e_from.q_paddr);
565			printaddr(sm_debug_file(), e->e_sendqueue, true);
566			for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
567			{
568				sm_dprintf("\n  *** Envelope %s, e_from=%s ***\n",
569					   ee->e_id, ee->e_from.q_paddr);
570				printaddr(sm_debug_file(), ee->e_sendqueue, true);
571			}
572			sm_dprintf("==========================================================\n\n");
573		}
574	}
575	switch (mode)
576	{
577	  case SM_VERIFY:
578		Verbose = 2;
579		break;
580
581	  case SM_QUEUE:
582	  case SM_DEFER:
583#if HASFLOCK
584  queueonly:
585#endif
586		if (e->e_nrcpts > 0)
587			e->e_flags |= EF_INQUEUE;
588		(void) dropenvelope(e, splitenv != NULL, true);
589		for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
590		{
591			if (ee->e_nrcpts > 0)
592				ee->e_flags |= EF_INQUEUE;
593			(void) dropenvelope(ee, false, true);
594		}
595		return;
596
597	  case SM_FORK:
598		if (e->e_xfp != NULL)
599			(void) sm_io_flush(e->e_xfp, SM_TIME_DEFAULT);
600
601#if !HASFLOCK
602		/*
603		**  Since fcntl locking has the interesting semantic that
604		**  the lock is owned by a process, not by an open file
605		**  descriptor, we have to flush this to the queue, and
606		**  then restart from scratch in the child.
607		*/
608
609		{
610			/* save id for future use */
611			char *qid = e->e_id;
612
613			/* now drop the envelope in the parent */
614			e->e_flags |= EF_INQUEUE;
615			(void) dropenvelope(e, splitenv != NULL, false);
616
617			/* arrange to reacquire lock after fork */
618			e->e_id = qid;
619		}
620
621		for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
622		{
623			/* save id for future use */
624			char *qid = ee->e_id;
625
626			/* drop envelope in parent */
627			ee->e_flags |= EF_INQUEUE;
628			(void) dropenvelope(ee, false, false);
629
630			/* and save qid for reacquisition */
631			ee->e_id = qid;
632		}
633
634#endif /* !HASFLOCK */
635
636		/*
637		**  Since the delivery may happen in a child and the parent
638		**  does not wait, the parent may close the maps thereby
639		**  removing any shared memory used by the map.  Therefore,
640		**  close the maps now so the child will dynamically open
641		**  them if necessary.
642		*/
643
644		closemaps(false);
645
646		pid = fork();
647		if (pid < 0)
648		{
649			syserr("deliver: fork 1");
650#if HASFLOCK
651			goto queueonly;
652#else /* HASFLOCK */
653			e->e_id = NULL;
654			for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
655				ee->e_id = NULL;
656			return;
657#endif /* HASFLOCK */
658		}
659		else if (pid > 0)
660		{
661#if HASFLOCK
662			/* be sure we leave the temp files to our child */
663			/* close any random open files in the envelope */
664			closexscript(e);
665			if (e->e_dfp != NULL)
666				(void) sm_io_close(e->e_dfp, SM_TIME_DEFAULT);
667			e->e_dfp = NULL;
668			e->e_flags &= ~EF_HAS_DF;
669
670			/* can't call unlockqueue to avoid unlink of xfp */
671			if (e->e_lockfp != NULL)
672				(void) sm_io_close(e->e_lockfp, SM_TIME_DEFAULT);
673			else
674				syserr("%s: sendall: null lockfp", e->e_id);
675			e->e_lockfp = NULL;
676#endif /* HASFLOCK */
677
678			/* make sure the parent doesn't own the envelope */
679			e->e_id = NULL;
680
681#if USE_DOUBLE_FORK
682			/* catch intermediate zombie */
683			(void) waitfor(pid);
684#endif
685			return;
686		}
687
688		/* Reset global flags */
689		RestartRequest = NULL;
690		RestartWorkGroup = false;
691		ShutdownRequest = NULL;
692		PendingSignal = 0;
693
694		/*
695		**  Initialize exception stack and default exception
696		**  handler for child process.
697		*/
698
699		sm_exc_newthread(fatal_error);
700
701		/*
702		**  Since we have accepted responsbility for the message,
703		**  change the SIGTERM handler.  intsig() (the old handler)
704		**  would remove the envelope if this was a command line
705		**  message submission.
706		*/
707
708		(void) sm_signal(SIGTERM, SIG_DFL);
709
710#if USE_DOUBLE_FORK
711		/* double fork to avoid zombies */
712		pid = fork();
713		if (pid > 0)
714			exit(EX_OK);
715		save_errno = errno;
716#endif /* USE_DOUBLE_FORK */
717
718		CurrentPid = getpid();
719
720		/* be sure we are immune from the terminal */
721		disconnect(2, e);
722		clearstats();
723
724		/* prevent parent from waiting if there was an error */
725		if (pid < 0)
726		{
727			errno = save_errno;
728			syserr("deliver: fork 2");
729#if HASFLOCK
730			e->e_flags |= EF_INQUEUE;
731#else
732			e->e_id = NULL;
733#endif
734			finis(true, true, ExitStat);
735		}
736
737		/* be sure to give error messages in child */
738		QuickAbort = false;
739
740		/*
741		**  Close any cached connections.
742		**
743		**	We don't send the QUIT protocol because the parent
744		**	still knows about the connection.
745		**
746		**	This should only happen when delivering an error
747		**	message.
748		*/
749
750		mci_flush(false, NULL);
751
752#if HASFLOCK
753		break;
754#else /* HASFLOCK */
755
756		/*
757		**  Now reacquire and run the various queue files.
758		*/
759
760		for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
761		{
762			ENVELOPE *sibling = ee->e_sibling;
763
764			(void) dowork(ee->e_qgrp, ee->e_qdir, ee->e_id,
765				      false, false, ee);
766			ee->e_sibling = sibling;
767		}
768		(void) dowork(e->e_qgrp, e->e_qdir, e->e_id,
769			      false, false, e);
770		finis(true, true, ExitStat);
771#endif /* HASFLOCK */
772	}
773
774	sendenvelope(e, mode);
775	(void) dropenvelope(e, true, true);
776	for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
777	{
778		CurEnv = ee;
779		if (mode != SM_VERIFY)
780			openxscript(ee);
781		sendenvelope(ee, mode);
782		(void) dropenvelope(ee, true, true);
783	}
784	CurEnv = e;
785
786	Verbose = oldverbose;
787	if (mode == SM_FORK)
788		finis(true, true, ExitStat);
789}
790
791static void
792sendenvelope(e, mode)
793	register ENVELOPE *e;
794	int mode;
795{
796	register ADDRESS *q;
797	bool didany;
798
799	if (tTd(13, 10))
800		sm_dprintf("sendenvelope(%s) e_flags=0x%lx\n",
801			   e->e_id == NULL ? "[NOQUEUE]" : e->e_id,
802			   e->e_flags);
803	if (LogLevel > 80)
804		sm_syslog(LOG_DEBUG, e->e_id,
805			  "sendenvelope, flags=0x%lx",
806			  e->e_flags);
807
808	/*
809	**  If we have had global, fatal errors, don't bother sending
810	**  the message at all if we are in SMTP mode.  Local errors
811	**  (e.g., a single address failing) will still cause the other
812	**  addresses to be sent.
813	*/
814
815	if (bitset(EF_FATALERRS, e->e_flags) &&
816	    (OpMode == MD_SMTP || OpMode == MD_DAEMON))
817	{
818		e->e_flags |= EF_CLRQUEUE;
819		return;
820	}
821
822	/*
823	**  Don't attempt deliveries if we want to bounce now
824	**  or if deliver-by time is exceeded.
825	*/
826
827	if (!bitset(EF_RESPONSE, e->e_flags) &&
828	    (TimeOuts.to_q_return[e->e_timeoutclass] == NOW ||
829	     (IS_DLVR_RETURN(e) && e->e_deliver_by > 0 &&
830	      curtime() > e->e_ctime + e->e_deliver_by)))
831		return;
832
833	/*
834	**  Run through the list and send everything.
835	**
836	**	Set EF_GLOBALERRS so that error messages during delivery
837	**	result in returned mail.
838	*/
839
840	e->e_nsent = 0;
841	e->e_flags |= EF_GLOBALERRS;
842
843	macdefine(&e->e_macro, A_PERM, macid("{envid}"), e->e_envid);
844	macdefine(&e->e_macro, A_PERM, macid("{bodytype}"), e->e_bodytype);
845	didany = false;
846
847	if (!bitset(EF_SPLIT, e->e_flags))
848	{
849		ENVELOPE *oldsib;
850		ENVELOPE *ee;
851
852		/*
853		**  Save old sibling and set it to NULL to avoid
854		**  queueing up the same envelopes again.
855		**  This requires that envelopes in that list have
856		**  been take care of before (or at some other place).
857		*/
858
859		oldsib = e->e_sibling;
860		e->e_sibling = NULL;
861		if (!split_by_recipient(e) &&
862		    bitset(EF_FATALERRS, e->e_flags))
863		{
864			if (OpMode == MD_SMTP || OpMode == MD_DAEMON)
865				e->e_flags |= EF_CLRQUEUE;
866			return;
867		}
868		for (ee = e->e_sibling; ee != NULL; ee = ee->e_sibling)
869			queueup(ee, false, true);
870
871		/* clean up */
872		for (ee = e->e_sibling; ee != NULL; ee = ee->e_sibling)
873		{
874			/* now unlock the job */
875			closexscript(ee);
876			unlockqueue(ee);
877
878			/* this envelope is marked unused */
879			if (ee->e_dfp != NULL)
880			{
881				(void) sm_io_close(ee->e_dfp, SM_TIME_DEFAULT);
882				ee->e_dfp = NULL;
883			}
884			ee->e_id = NULL;
885			ee->e_flags &= ~EF_HAS_DF;
886		}
887		e->e_sibling = oldsib;
888	}
889
890	/* now run through the queue */
891	for (q = e->e_sendqueue; q != NULL; q = q->q_next)
892	{
893#if XDEBUG
894		char wbuf[MAXNAME + 20];
895
896		(void) sm_snprintf(wbuf, sizeof(wbuf), "sendall(%.*s)",
897				   MAXNAME, q->q_paddr);
898		checkfd012(wbuf);
899#endif /* XDEBUG */
900		if (mode == SM_VERIFY)
901		{
902			e->e_to = q->q_paddr;
903			if (QS_IS_SENDABLE(q->q_state))
904			{
905				if (q->q_host != NULL && q->q_host[0] != '\0')
906					message("deliverable: mailer %s, host %s, user %s",
907						q->q_mailer->m_name,
908						q->q_host,
909						q->q_user);
910				else
911					message("deliverable: mailer %s, user %s",
912						q->q_mailer->m_name,
913						q->q_user);
914			}
915		}
916		else if (QS_IS_OK(q->q_state))
917		{
918			/*
919			**  Checkpoint the send list every few addresses
920			*/
921
922			if (CheckpointInterval > 0 &&
923			    e->e_nsent >= CheckpointInterval)
924			{
925				queueup(e, false, false);
926				e->e_nsent = 0;
927			}
928			(void) deliver(e, q);
929			didany = true;
930		}
931	}
932	if (didany)
933	{
934		e->e_dtime = curtime();
935		e->e_ntries++;
936	}
937
938#if XDEBUG
939	checkfd012("end of sendenvelope");
940#endif
941}
942
943#if REQUIRES_DIR_FSYNC
944/*
945**  SYNC_DIR -- fsync a directory based on a filename
946**
947**	Parameters:
948**		filename -- path of file
949**		panic -- panic?
950**
951**	Returns:
952**		none
953*/
954
955void
956sync_dir(filename, panic)
957	char *filename;
958	bool panic;
959{
960	int dirfd;
961	char *dirp;
962	char dir[MAXPATHLEN];
963
964	if (!RequiresDirfsync)
965		return;
966
967	/* filesystems which require the directory be synced */
968	dirp = strrchr(filename, '/');
969	if (dirp != NULL)
970	{
971		if (sm_strlcpy(dir, filename, sizeof(dir)) >= sizeof(dir))
972			return;
973		dir[dirp - filename] = '\0';
974		dirp = dir;
975	}
976	else
977		dirp = ".";
978	dirfd = open(dirp, O_RDONLY, 0700);
979	if (tTd(40,32))
980		sm_syslog(LOG_INFO, NOQID, "sync_dir: %s: fsync(%d)",
981			  dirp, dirfd);
982	if (dirfd >= 0)
983	{
984		if (fsync(dirfd) < 0)
985		{
986			if (panic)
987				syserr("!sync_dir: cannot fsync directory %s",
988				       dirp);
989			else if (LogLevel > 1)
990				sm_syslog(LOG_ERR, NOQID,
991					  "sync_dir: cannot fsync directory %s: %s",
992					  dirp, sm_errstring(errno));
993		}
994		(void) close(dirfd);
995	}
996}
997#endif /* REQUIRES_DIR_FSYNC */
998/*
999**  DUP_QUEUE_FILE -- duplicate a queue file into a split queue
1000**
1001**	Parameters:
1002**		e -- the existing envelope
1003**		ee -- the new envelope
1004**		type -- the queue file type (e.g., DATAFL_LETTER)
1005**
1006**	Returns:
1007**		none
1008*/
1009
1010static void
1011dup_queue_file(e, ee, type)
1012	ENVELOPE *e, *ee;
1013	int type;
1014{
1015	char f1buf[MAXPATHLEN], f2buf[MAXPATHLEN];
1016
1017	ee->e_dfp = NULL;
1018	ee->e_xfp = NULL;
1019
1020	/*
1021	**  Make sure both are in the same directory.
1022	*/
1023
1024	(void) sm_strlcpy(f1buf, queuename(e, type), sizeof(f1buf));
1025	(void) sm_strlcpy(f2buf, queuename(ee, type), sizeof(f2buf));
1026
1027	/* Force the df to disk if it's not there yet */
1028	if (type == DATAFL_LETTER && e->e_dfp != NULL &&
1029	    sm_io_setinfo(e->e_dfp, SM_BF_COMMIT, NULL) < 0 &&
1030	    errno != EINVAL)
1031	{
1032		syserr("!dup_queue_file: can't commit %s", f1buf);
1033		/* NOTREACHED */
1034	}
1035
1036	if (link(f1buf, f2buf) < 0)
1037	{
1038		int save_errno = errno;
1039
1040		syserr("sendall: link(%s, %s)", f1buf, f2buf);
1041		if (save_errno == EEXIST)
1042		{
1043			if (unlink(f2buf) < 0)
1044			{
1045				syserr("!sendall: unlink(%s): permanent",
1046				       f2buf);
1047				/* NOTREACHED */
1048			}
1049			if (link(f1buf, f2buf) < 0)
1050			{
1051				syserr("!sendall: link(%s, %s): permanent",
1052				       f1buf, f2buf);
1053				/* NOTREACHED */
1054			}
1055		}
1056	}
1057	SYNC_DIR(f2buf, true);
1058}
1059/*
1060**  DOFORK -- do a fork, retrying a couple of times on failure.
1061**
1062**	This MUST be a macro, since after a vfork we are running
1063**	two processes on the same stack!!!
1064**
1065**	Parameters:
1066**		none.
1067**
1068**	Returns:
1069**		From a macro???  You've got to be kidding!
1070**
1071**	Side Effects:
1072**		Modifies the ==> LOCAL <== variable 'pid', leaving:
1073**			pid of child in parent, zero in child.
1074**			-1 on unrecoverable error.
1075**
1076**	Notes:
1077**		I'm awfully sorry this looks so awful.  That's
1078**		vfork for you.....
1079*/
1080
1081#define NFORKTRIES	5
1082
1083#ifndef FORK
1084# define FORK	fork
1085#endif
1086
1087#define DOFORK(fORKfN) \
1088{\
1089	register int i;\
1090\
1091	for (i = NFORKTRIES; --i >= 0; )\
1092	{\
1093		pid = fORKfN();\
1094		if (pid >= 0)\
1095			break;\
1096		if (i > 0)\
1097			(void) sleep((unsigned) NFORKTRIES - i);\
1098	}\
1099}
1100/*
1101**  DOFORK -- simple fork interface to DOFORK.
1102**
1103**	Parameters:
1104**		none.
1105**
1106**	Returns:
1107**		pid of child in parent.
1108**		zero in child.
1109**		-1 on error.
1110**
1111**	Side Effects:
1112**		returns twice, once in parent and once in child.
1113*/
1114
1115pid_t
1116dofork()
1117{
1118	register pid_t pid = -1;
1119
1120	DOFORK(fork);
1121	return pid;
1122}
1123
1124/*
1125**  COLONCMP -- compare host-signatures up to first ':' or EOS
1126**
1127**	This takes two strings which happen to be host-signatures and
1128**	compares them. If the lowest preference portions of the MX-RR's
1129**	match (up to ':' or EOS, whichever is first), then we have
1130**	match. This is used for coattail-piggybacking messages during
1131**	message delivery.
1132**	If the signatures are the same up to the first ':' the remainder of
1133**	the signatures are then compared with a normal strcmp(). This saves
1134**	re-examining the first part of the signatures.
1135**
1136**	Parameters:
1137**		a - first host-signature
1138**		b - second host-signature
1139**
1140**	Returns:
1141**		HS_MATCH_NO -- no "match".
1142**		HS_MATCH_FIRST -- "match" for the first MX preference
1143**			(up to the first colon (':')).
1144**		HS_MATCH_FULL -- match for the entire MX record.
1145**
1146**	Side Effects:
1147**		none.
1148*/
1149
1150#define HS_MATCH_NO	0
1151#define HS_MATCH_FIRST	1
1152#define HS_MATCH_FULL	2
1153
1154static int
1155coloncmp(a, b)
1156	register const char *a;
1157	register const char *b;
1158{
1159	int ret = HS_MATCH_NO;
1160	int braclev = 0;
1161
1162	while (*a == *b++)
1163	{
1164		/* Need to account for IPv6 bracketed addresses */
1165		if (*a == '[')
1166			braclev++;
1167		else if (*a == ']' && braclev > 0)
1168			braclev--;
1169		else if (*a == ':' && braclev <= 0)
1170		{
1171			ret = HS_MATCH_FIRST;
1172			a++;
1173			break;
1174		}
1175		else if (*a == '\0')
1176			return HS_MATCH_FULL; /* a full match */
1177		a++;
1178	}
1179	if (ret == HS_MATCH_NO &&
1180	    braclev <= 0 &&
1181	    ((*a == '\0' && *(b - 1) == ':') ||
1182	     (*a == ':' && *(b - 1) == '\0')))
1183		return HS_MATCH_FIRST;
1184	if (ret == HS_MATCH_FIRST && strcmp(a, b) == 0)
1185		return HS_MATCH_FULL;
1186
1187	return ret;
1188}
1189
1190/*
1191**  SHOULD_TRY_FBSH -- Should try FallbackSmartHost?
1192**
1193**	Parameters:
1194**		e -- envelope
1195**		tried_fallbacksmarthost -- has been tried already? (in/out)
1196**		hostbuf -- buffer for hostname (expand FallbackSmartHost) (out)
1197**		hbsz -- size of hostbuf
1198**		status -- current delivery status
1199**
1200**	Returns:
1201**		true iff FallbackSmartHost should be tried.
1202*/
1203
1204static bool should_try_fbsh __P((ENVELOPE *, bool *, char *, size_t, int));
1205
1206static bool
1207should_try_fbsh(e, tried_fallbacksmarthost, hostbuf, hbsz, status)
1208	ENVELOPE *e;
1209	bool *tried_fallbacksmarthost;
1210	char *hostbuf;
1211	size_t hbsz;
1212	int status;
1213{
1214	/*
1215	**  If the host was not found or a temporary failure occurred
1216	**  and a FallbackSmartHost is defined (and we have not yet
1217	**  tried it), then make one last try with it as the host.
1218	*/
1219
1220	if ((status == EX_NOHOST || status == EX_TEMPFAIL) &&
1221	    FallbackSmartHost != NULL && !*tried_fallbacksmarthost)
1222	{
1223		*tried_fallbacksmarthost = true;
1224		expand(FallbackSmartHost, hostbuf, hbsz, e);
1225		if (!wordinclass(hostbuf, 'w'))
1226		{
1227			if (tTd(11, 1))
1228				sm_dprintf("one last try with FallbackSmartHost %s\n",
1229					   hostbuf);
1230			return true;
1231		}
1232	}
1233	return false;
1234}
1235
1236/*
1237**  DELIVER -- Deliver a message to a list of addresses.
1238**
1239**	This routine delivers to everyone on the same host as the
1240**	user on the head of the list.  It is clever about mailers
1241**	that don't handle multiple users.  It is NOT guaranteed
1242**	that it will deliver to all these addresses however -- so
1243**	deliver should be called once for each address on the list.
1244**	Deliver tries to be as opportunistic as possible about piggybacking
1245**	messages. Some definitions to make understanding easier follow below.
1246**	Piggybacking occurs when an existing connection to a mail host can
1247**	be used to send the same message to more than one recipient at the
1248**	same time. So "no piggybacking" means one message for one recipient
1249**	per connection. "Intentional piggybacking" happens when the
1250**	recipients' host address (not the mail host address) is used to
1251**	attempt piggybacking. Recipients with the same host address
1252**	have the same mail host. "Coincidental piggybacking" relies on
1253**	piggybacking based on all the mail host addresses in the MX-RR. This
1254**	is "coincidental" in the fact it could not be predicted until the
1255**	MX Resource Records for the hosts were obtained and examined. For
1256**	example (preference order and equivalence is important, not values):
1257**		domain1 IN MX 10 mxhost-A
1258**			IN MX 20 mxhost-B
1259**		domain2 IN MX  4 mxhost-A
1260**			IN MX  8 mxhost-B
1261**	Domain1 and domain2 can piggyback the same message to mxhost-A or
1262**	mxhost-B (if mxhost-A cannot be reached).
1263**	"Coattail piggybacking" relaxes the strictness of "coincidental
1264**	piggybacking" in the hope that most significant (lowest value)
1265**	MX preference host(s) can create more piggybacking. For example
1266**	(again, preference order and equivalence is important, not values):
1267**		domain3 IN MX 100 mxhost-C
1268**			IN MX 100 mxhost-D
1269**			IN MX 200 mxhost-E
1270**		domain4 IN MX  50 mxhost-C
1271**			IN MX  50 mxhost-D
1272**			IN MX  80 mxhost-F
1273**	A message for domain3 and domain4 can piggyback to mxhost-C if mxhost-C
1274**	is available. Same with mxhost-D because in both RR's the preference
1275**	value is the same as mxhost-C, respectively.
1276**	So deliver attempts coattail piggybacking when possible. If the
1277**	first MX preference level hosts cannot be used then the piggybacking
1278**	reverts to coincidental piggybacking. Using the above example you
1279**	cannot deliver to mxhost-F for domain3 regardless of preference value.
1280**	("Coattail" from "riding on the coattails of your predecessor" meaning
1281**	gaining benefit from a predecessor effort with no or little addition
1282**	effort. The predecessor here being the preceding MX RR).
1283**
1284**	Parameters:
1285**		e -- the envelope to deliver.
1286**		firstto -- head of the address list to deliver to.
1287**
1288**	Returns:
1289**		zero -- successfully delivered.
1290**		else -- some failure, see ExitStat for more info.
1291**
1292**	Side Effects:
1293**		The standard input is passed off to someone.
1294*/
1295
1296static int
1297deliver(e, firstto)
1298	register ENVELOPE *e;
1299	ADDRESS *firstto;
1300{
1301	char *host;			/* host being sent to */
1302	char *user;			/* user being sent to */
1303	char **pvp;
1304	register char **mvp;
1305	register char *p;
1306	register MAILER *m;		/* mailer for this recipient */
1307	ADDRESS *volatile ctladdr;
1308#if HASSETUSERCONTEXT
1309	ADDRESS *volatile contextaddr = NULL;
1310#endif
1311	register MCI *volatile mci;
1312	register ADDRESS *SM_NONVOLATILE to = firstto;
1313	volatile bool clever = false;	/* running user smtp to this mailer */
1314	ADDRESS *volatile tochain = NULL; /* users chain in this mailer call */
1315	int rcode;			/* response code */
1316	SM_NONVOLATILE int lmtp_rcode = EX_OK;
1317	SM_NONVOLATILE int nummxhosts = 0; /* number of MX hosts available */
1318	SM_NONVOLATILE int hostnum = 0;	/* current MX host index */
1319	char *firstsig;			/* signature of firstto */
1320	volatile pid_t pid = -1;
1321	char *volatile curhost;
1322	SM_NONVOLATILE unsigned short port = 0;
1323	SM_NONVOLATILE time_t enough = 0;
1324#if NETUNIX
1325	char *SM_NONVOLATILE mux_path = NULL;	/* path to UNIX domain socket */
1326#endif
1327	time_t xstart;
1328	bool suidwarn;
1329	bool anyok;			/* at least one address was OK */
1330	SM_NONVOLATILE bool goodmxfound = false; /* at least one MX was OK */
1331	bool ovr;
1332	bool quarantine;
1333#if STARTTLS
1334	/* 0: try TLS, 1: try without TLS again, >1: don't try again */
1335	int tlsstate;
1336# if DANE
1337	dane_vrfy_ctx_T	dane_vrfy_ctx;
1338	STAB *ste;
1339# endif
1340#endif
1341#if STARTTLS || SASL
1342	int dotpos;
1343
1344# define RM_TRAIL_DOT(name)				\
1345	do {						\
1346		dotpos = strlen(name) - 1;		\
1347		if (dotpos >= 0)			\
1348		{					\
1349			if (name[dotpos] == '.')	\
1350				name[dotpos] = '\0';	\
1351			else				\
1352				dotpos = -1;		\
1353		}					\
1354	} while (0)
1355
1356# define FIX_TRAIL_DOT(name)				\
1357	do {						\
1358		if (dotpos >= 0)			\
1359			name[dotpos] = '.';		\
1360	} while (0)
1361
1362#endif
1363	int strsize;
1364	int rcptcount;
1365	int ret;
1366	static int tobufsize = 0;
1367	static char *tobuf = NULL;
1368	char *rpath;	/* translated return path */
1369	int mpvect[2];
1370	int rpvect[2];
1371	char *mxhosts[MAXMXHOSTS + 1];
1372	char *pv[MAXPV + 1];
1373	char buf[MAXNAME + 1];
1374	char cbuf[MAXPATHLEN];
1375
1376	errno = 0;
1377	SM_REQUIRE(firstto != NULL);	/* same as to */
1378	if (!QS_IS_OK(to->q_state))
1379		return 0;
1380
1381	suidwarn = geteuid() == 0;
1382
1383	SM_REQUIRE(e != NULL);
1384	m = to->q_mailer;
1385	host = to->q_host;
1386	CurEnv = e;			/* just in case */
1387	e->e_statmsg = NULL;
1388	SmtpError[0] = '\0';
1389	xstart = curtime();
1390#if STARTTLS
1391	tlsstate = 0;
1392# if DANE
1393	memset(&dane_vrfy_ctx, '\0', sizeof(dane_vrfy_ctx));
1394	ste = NULL;
1395# endif
1396#endif
1397
1398	if (tTd(10, 1))
1399		sm_dprintf("\n--deliver, id=%s, mailer=%s, host=`%s', first user=`%s'\n",
1400			e->e_id, m->m_name, host, to->q_user);
1401	if (tTd(10, 100))
1402		printopenfds(false);
1403
1404	/*
1405	**  Clear {client_*} macros if this is a bounce message to
1406	**  prevent rejection by check_compat ruleset.
1407	*/
1408
1409	if (bitset(EF_RESPONSE, e->e_flags))
1410	{
1411		macdefine(&e->e_macro, A_PERM, macid("{client_name}"), "");
1412		macdefine(&e->e_macro, A_PERM, macid("{client_ptr}"), "");
1413		macdefine(&e->e_macro, A_PERM, macid("{client_addr}"), "");
1414		macdefine(&e->e_macro, A_PERM, macid("{client_port}"), "");
1415		macdefine(&e->e_macro, A_PERM, macid("{client_resolve}"), "");
1416	}
1417
1418	SM_TRY
1419	{
1420	ADDRESS *skip_back = NULL;
1421
1422	/*
1423	**  Do initial argv setup.
1424	**	Insert the mailer name.  Notice that $x expansion is
1425	**	NOT done on the mailer name.  Then, if the mailer has
1426	**	a picky -f flag, we insert it as appropriate.  This
1427	**	code does not check for 'pv' overflow; this places a
1428	**	manifest lower limit of 4 for MAXPV.
1429	**		The from address rewrite is expected to make
1430	**		the address relative to the other end.
1431	*/
1432
1433	/* rewrite from address, using rewriting rules */
1434	rcode = EX_OK;
1435	SM_ASSERT(e->e_from.q_mailer != NULL);
1436	if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags))
1437		p = e->e_sender;
1438	else
1439		p = e->e_from.q_paddr;
1440	rpath = remotename(p, m, RF_SENDERADDR|RF_CANONICAL, &rcode, e);
1441	if (rcode != EX_OK && bitnset(M_xSMTP, m->m_flags))
1442		goto cleanup;
1443	if (strlen(rpath) > MAXNAME)
1444	{
1445		rpath = shortenstring(rpath, MAXSHORTSTR);
1446
1447		/* avoid bogus errno */
1448		errno = 0;
1449		syserr("remotename: huge return path %s", rpath);
1450	}
1451	rpath = sm_rpool_strdup_x(e->e_rpool, rpath);
1452	macdefine(&e->e_macro, A_PERM, 'g', rpath);
1453	macdefine(&e->e_macro, A_PERM, 'h', host);
1454	Errors = 0;
1455	pvp = pv;
1456	*pvp++ = m->m_argv[0];
1457
1458	/* ignore long term host status information if mailer flag W is set */
1459	if (bitnset(M_NOHOSTSTAT, m->m_flags))
1460		IgnoreHostStatus = true;
1461
1462	/* insert -f or -r flag as appropriate */
1463	if (FromFlag &&
1464	    (bitnset(M_FOPT, m->m_flags) ||
1465	     bitnset(M_ROPT, m->m_flags)))
1466	{
1467		if (bitnset(M_FOPT, m->m_flags))
1468			*pvp++ = "-f";
1469		else
1470			*pvp++ = "-r";
1471		*pvp++ = rpath;
1472	}
1473
1474	/*
1475	**  Append the other fixed parts of the argv.  These run
1476	**  up to the first entry containing "$u".  There can only
1477	**  be one of these, and there are only a few more slots
1478	**  in the pv after it.
1479	*/
1480
1481	for (mvp = m->m_argv; (p = *++mvp) != NULL; )
1482	{
1483		/* can't use strchr here because of sign extension problems */
1484		while (*p != '\0')
1485		{
1486			if ((*p++ & 0377) == MACROEXPAND)
1487			{
1488				if (*p == 'u')
1489					break;
1490			}
1491		}
1492
1493		if (*p != '\0')
1494			break;
1495
1496		/* this entry is safe -- go ahead and process it */
1497		expand(*mvp, buf, sizeof(buf), e);
1498		*pvp++ = sm_rpool_strdup_x(e->e_rpool, buf);
1499		if (pvp >= &pv[MAXPV - 3])
1500		{
1501			syserr("554 5.3.5 Too many parameters to %s before $u",
1502			       pv[0]);
1503			rcode = -1;
1504			goto cleanup;
1505		}
1506	}
1507
1508	/*
1509	**  If we have no substitution for the user name in the argument
1510	**  list, we know that we must supply the names otherwise -- and
1511	**  SMTP is the answer!!
1512	*/
1513
1514	if (*mvp == NULL)
1515	{
1516		/* running LMTP or SMTP */
1517		clever = true;
1518		*pvp = NULL;
1519		setbitn(M_xSMTP, m->m_flags);
1520	}
1521	else if (bitnset(M_LMTP, m->m_flags))
1522	{
1523		/* not running LMTP */
1524		sm_syslog(LOG_ERR, NULL,
1525			  "Warning: mailer %s: LMTP flag (F=z) turned off",
1526			  m->m_name);
1527		clrbitn(M_LMTP, m->m_flags);
1528	}
1529
1530	/*
1531	**  At this point *mvp points to the argument with $u.  We
1532	**  run through our address list and append all the addresses
1533	**  we can.  If we run out of space, do not fret!  We can
1534	**  always send another copy later.
1535	*/
1536
1537	e->e_to = NULL;
1538	strsize = 2;
1539	rcptcount = 0;
1540	ctladdr = NULL;
1541	if (firstto->q_signature == NULL)
1542		firstto->q_signature = hostsignature(firstto->q_mailer,
1543						     firstto->q_host,
1544						     firstto->q_flags & QSECURE);
1545	firstsig = firstto->q_signature;
1546
1547	for (; to != NULL; to = to->q_next)
1548	{
1549		/* avoid sending multiple recipients to dumb mailers */
1550		if (tochain != NULL && !bitnset(M_MUSER, m->m_flags))
1551			break;
1552
1553		/* if already sent or not for this host, don't send */
1554		if (!QS_IS_OK(to->q_state)) /* already sent; look at next */
1555			continue;
1556
1557		/*
1558		**  Must be same mailer to keep grouping rcpts.
1559		**  If mailers don't match: continue; sendqueue is not
1560		**  sorted by mailers, so don't break;
1561		*/
1562
1563		if (to->q_mailer != firstto->q_mailer)
1564			continue;
1565
1566		if (to->q_signature == NULL) /* for safety */
1567			to->q_signature = hostsignature(to->q_mailer,
1568							to->q_host,
1569							to->q_flags & QSECURE);
1570
1571		/*
1572		**  This is for coincidental and tailcoat piggybacking messages
1573		**  to the same mail host. While the signatures are identical
1574		**  (that's the MX-RR's are identical) we can do coincidental
1575		**  piggybacking. We try hard for coattail piggybacking
1576		**  with the same mail host when the next recipient has the
1577		**  same host at lowest preference. It may be that this
1578		**  won't work out, so 'skip_back' is maintained if a backup
1579		**  to coincidental piggybacking or full signature must happen.
1580		*/
1581
1582		ret = firstto == to ? HS_MATCH_FULL :
1583				      coloncmp(to->q_signature, firstsig);
1584		if (ret == HS_MATCH_FULL)
1585			skip_back = to;
1586		else if (ret == HS_MATCH_NO)
1587			break;
1588
1589		if (!clever)
1590		{
1591			/* avoid overflowing tobuf */
1592			strsize += strlen(to->q_paddr) + 1;
1593			if (strsize > TOBUFSIZE)
1594				break;
1595		}
1596
1597		if (++rcptcount > to->q_mailer->m_maxrcpt)
1598			break;
1599
1600		if (tTd(10, 1))
1601		{
1602			sm_dprintf("\nsend to ");
1603			printaddr(sm_debug_file(), to, false);
1604		}
1605
1606		/* compute effective uid/gid when sending */
1607		if (bitnset(M_RUNASRCPT, to->q_mailer->m_flags))
1608#if HASSETUSERCONTEXT
1609			contextaddr = ctladdr = getctladdr(to);
1610#else
1611			ctladdr = getctladdr(to);
1612#endif
1613
1614		if (tTd(10, 2))
1615		{
1616			sm_dprintf("ctladdr=");
1617			printaddr(sm_debug_file(), ctladdr, false);
1618		}
1619
1620		user = to->q_user;
1621		e->e_to = to->q_paddr;
1622
1623		/*
1624		**  Check to see that these people are allowed to
1625		**  talk to each other.
1626		**  Check also for overflow of e_msgsize.
1627		*/
1628
1629		if (m->m_maxsize != 0 &&
1630		    (e->e_msgsize > m->m_maxsize || e->e_msgsize < 0))
1631		{
1632			e->e_flags |= EF_NO_BODY_RETN;
1633			if (bitnset(M_LOCALMAILER, to->q_mailer->m_flags))
1634				to->q_status = "5.2.3";
1635			else
1636				to->q_status = "5.3.4";
1637
1638			/* set to->q_rstatus = NULL; or to the following? */
1639			usrerrenh(to->q_status,
1640				  "552 Message is too large; %ld bytes max",
1641				  m->m_maxsize);
1642			markfailure(e, to, NULL, EX_UNAVAILABLE, false);
1643			giveresponse(EX_UNAVAILABLE, to->q_status, m,
1644				     NULL, ctladdr, xstart, e, to);
1645			continue;
1646		}
1647		SM_SET_H_ERRNO(0);
1648		ovr = true;
1649
1650		/* do config file checking of compatibility */
1651		quarantine = (e->e_quarmsg != NULL);
1652		rcode = rscheck("check_compat", e->e_from.q_paddr, to->q_paddr,
1653				e, RSF_RMCOMM|RSF_COUNT, 3, NULL,
1654				e->e_id, NULL, NULL);
1655		if (rcode == EX_OK)
1656		{
1657			/* do in-code checking if not discarding */
1658			if (!bitset(EF_DISCARD, e->e_flags))
1659			{
1660				rcode = checkcompat(to, e);
1661				ovr = false;
1662			}
1663		}
1664		if (rcode != EX_OK)
1665		{
1666			markfailure(e, to, NULL, rcode, ovr);
1667			giveresponse(rcode, to->q_status, m,
1668				     NULL, ctladdr, xstart, e, to);
1669			continue;
1670		}
1671		if (!quarantine && e->e_quarmsg != NULL)
1672		{
1673			/*
1674			**  check_compat or checkcompat() has tried
1675			**  to quarantine but that isn't supported.
1676			**  Revert the attempt.
1677			*/
1678
1679			e->e_quarmsg = NULL;
1680			macdefine(&e->e_macro, A_PERM,
1681				  macid("{quarantine}"), "");
1682		}
1683		if (bitset(EF_DISCARD, e->e_flags))
1684		{
1685			if (tTd(10, 5))
1686			{
1687				sm_dprintf("deliver: discarding recipient ");
1688				printaddr(sm_debug_file(), to, false);
1689			}
1690
1691			/* pretend the message was sent */
1692			/* XXX should we log something here? */
1693			to->q_state = QS_DISCARDED;
1694
1695			/*
1696			**  Remove discard bit to prevent discard of
1697			**  future recipients.  This is safe because the
1698			**  true "global discard" has been handled before
1699			**  we get here.
1700			*/
1701
1702			e->e_flags &= ~EF_DISCARD;
1703			continue;
1704		}
1705
1706		/*
1707		**  Strip quote bits from names if the mailer is dumb
1708		**	about them.
1709		*/
1710
1711		if (bitnset(M_STRIPQ, m->m_flags))
1712		{
1713			stripquotes(user);
1714			stripquotes(host);
1715		}
1716
1717		/*
1718		**  Strip all leading backslashes if requested and the
1719		**  next character is alphanumerical (the latter can
1720		**  probably relaxed a bit, see RFC2821).
1721		*/
1722
1723		if (bitnset(M_STRIPBACKSL, m->m_flags) && user[0] == '\\')
1724			stripbackslash(user);
1725
1726		/* hack attack -- delivermail compatibility */
1727		if (m == ProgMailer && *user == '|')
1728			user++;
1729
1730		/*
1731		**  If an error message has already been given, don't
1732		**	bother to send to this address.
1733		**
1734		**	>>>>>>>>>> This clause assumes that the local mailer
1735		**	>> NOTE >> cannot do any further aliasing; that
1736		**	>>>>>>>>>> function is subsumed by sendmail.
1737		*/
1738
1739		if (!QS_IS_OK(to->q_state))
1740			continue;
1741
1742		/*
1743		**  See if this user name is "special".
1744		**	If the user name has a slash in it, assume that this
1745		**	is a file -- send it off without further ado.  Note
1746		**	that this type of addresses is not processed along
1747		**	with the others, so we fudge on the To person.
1748		*/
1749
1750		if (strcmp(m->m_mailer, "[FILE]") == 0)
1751		{
1752			macdefine(&e->e_macro, A_PERM, 'u', user);
1753			p = to->q_home;
1754			if (p == NULL && ctladdr != NULL)
1755				p = ctladdr->q_home;
1756			macdefine(&e->e_macro, A_PERM, 'z', p);
1757			expand(m->m_argv[1], buf, sizeof(buf), e);
1758			if (strlen(buf) > 0)
1759				rcode = mailfile(buf, m, ctladdr, SFF_CREAT, e);
1760			else
1761			{
1762				syserr("empty filename specification for mailer %s",
1763				       m->m_name);
1764				rcode = EX_CONFIG;
1765			}
1766			giveresponse(rcode, to->q_status, m, NULL,
1767				     ctladdr, xstart, e, to);
1768			markfailure(e, to, NULL, rcode, true);
1769			e->e_nsent++;
1770			if (rcode == EX_OK)
1771			{
1772				to->q_state = QS_SENT;
1773				if (bitnset(M_LOCALMAILER, m->m_flags) &&
1774				    bitset(QPINGONSUCCESS, to->q_flags))
1775				{
1776					to->q_flags |= QDELIVERED;
1777					to->q_status = "2.1.5";
1778					(void) sm_io_fprintf(e->e_xfp,
1779							     SM_TIME_DEFAULT,
1780							     "%s... Successfully delivered\n",
1781							     to->q_paddr);
1782				}
1783			}
1784			to->q_statdate = curtime();
1785			markstats(e, to, STATS_NORMAL);
1786			continue;
1787		}
1788
1789		/*
1790		**  Address is verified -- add this user to mailer
1791		**  argv, and add it to the print list of recipients.
1792		*/
1793
1794		/* link together the chain of recipients */
1795		to->q_tchain = tochain;
1796		tochain = to;
1797		e->e_to = "[CHAIN]";
1798
1799		macdefine(&e->e_macro, A_PERM, 'u', user);  /* to user */
1800		p = to->q_home;
1801		if (p == NULL && ctladdr != NULL)
1802			p = ctladdr->q_home;
1803		macdefine(&e->e_macro, A_PERM, 'z', p);  /* user's home */
1804
1805		/* set the ${dsn_notify} macro if applicable */
1806		if (bitset(QHASNOTIFY, to->q_flags))
1807		{
1808			char notify[MAXLINE];
1809
1810			notify[0] = '\0';
1811			if (bitset(QPINGONSUCCESS, to->q_flags))
1812				(void) sm_strlcat(notify, "SUCCESS,",
1813						  sizeof(notify));
1814			if (bitset(QPINGONFAILURE, to->q_flags))
1815				(void) sm_strlcat(notify, "FAILURE,",
1816						  sizeof(notify));
1817			if (bitset(QPINGONDELAY, to->q_flags))
1818				(void) sm_strlcat(notify, "DELAY,",
1819						  sizeof(notify));
1820
1821			/* Set to NEVER or drop trailing comma */
1822			if (notify[0] == '\0')
1823				(void) sm_strlcat(notify, "NEVER",
1824						  sizeof(notify));
1825			else
1826				notify[strlen(notify) - 1] = '\0';
1827
1828			macdefine(&e->e_macro, A_TEMP,
1829				macid("{dsn_notify}"), notify);
1830		}
1831		else
1832			macdefine(&e->e_macro, A_PERM,
1833				macid("{dsn_notify}"), NULL);
1834
1835		/*
1836		**  Expand out this user into argument list.
1837		*/
1838
1839		if (!clever)
1840		{
1841			expand(*mvp, buf, sizeof(buf), e);
1842			*pvp++ = sm_rpool_strdup_x(e->e_rpool, buf);
1843			if (pvp >= &pv[MAXPV - 2])
1844			{
1845				/* allow some space for trailing parms */
1846				break;
1847			}
1848		}
1849	}
1850
1851	/* see if any addresses still exist */
1852	if (tochain == NULL)
1853	{
1854		rcode = 0;
1855		goto cleanup;
1856	}
1857
1858	/* print out messages as full list */
1859	strsize = 1;
1860	for (to = tochain; to != NULL; to = to->q_tchain)
1861		strsize += strlen(to->q_paddr) + 1;
1862	if (strsize < TOBUFSIZE)
1863		strsize = TOBUFSIZE;
1864	if (strsize > tobufsize)
1865	{
1866		SM_FREE(tobuf);
1867		tobuf = sm_pmalloc_x(strsize);
1868		tobufsize = strsize;
1869	}
1870	p = tobuf;
1871	*p = '\0';
1872	for (to = tochain; to != NULL; to = to->q_tchain)
1873	{
1874		(void) sm_strlcpyn(p, tobufsize - (p - tobuf), 2,
1875				   ",", to->q_paddr);
1876		p += strlen(p);
1877	}
1878	e->e_to = tobuf + 1;
1879
1880	/*
1881	**  Fill out any parameters after the $u parameter.
1882	*/
1883
1884	if (!clever)
1885	{
1886		while (*++mvp != NULL)
1887		{
1888			expand(*mvp, buf, sizeof(buf), e);
1889			*pvp++ = sm_rpool_strdup_x(e->e_rpool, buf);
1890			if (pvp >= &pv[MAXPV])
1891				syserr("554 5.3.0 deliver: pv overflow after $u for %s",
1892				       pv[0]);
1893		}
1894	}
1895	*pvp++ = NULL;
1896
1897	/*
1898	**  Call the mailer.
1899	**	The argument vector gets built, pipes
1900	**	are created as necessary, and we fork & exec as
1901	**	appropriate.
1902	**	If we are running SMTP, we just need to clean up.
1903	*/
1904
1905	/* XXX this seems a bit weird */
1906	if (ctladdr == NULL && m != ProgMailer && m != FileMailer &&
1907	    bitset(QGOODUID, e->e_from.q_flags))
1908		ctladdr = &e->e_from;
1909
1910#if NAMED_BIND
1911	if (ConfigLevel < 2)
1912		_res.options &= ~(RES_DEFNAMES | RES_DNSRCH);	/* XXX */
1913#endif
1914
1915	if (tTd(11, 1))
1916	{
1917		sm_dprintf("openmailer:");
1918		printav(sm_debug_file(), pv);
1919	}
1920	errno = 0;
1921	SM_SET_H_ERRNO(0);
1922	CurHostName = NULL;
1923
1924	/*
1925	**  Deal with the special case of mail handled through an IPC
1926	**  connection.
1927	**	In this case we don't actually fork.  We must be
1928	**	running SMTP for this to work.  We will return a
1929	**	zero pid to indicate that we are running IPC.
1930	**  We also handle a debug version that just talks to stdin/out.
1931	*/
1932
1933	curhost = NULL;
1934	SmtpPhase = NULL;
1935	mci = NULL;
1936
1937#if XDEBUG
1938	{
1939		char wbuf[MAXLINE];
1940
1941		/* make absolutely certain 0, 1, and 2 are in use */
1942		(void) sm_snprintf(wbuf, sizeof(wbuf), "%s... openmailer(%s)",
1943				   shortenstring(e->e_to, MAXSHORTSTR),
1944				   m->m_name);
1945		checkfd012(wbuf);
1946	}
1947#endif /* XDEBUG */
1948
1949	/* check for 8-bit available */
1950	if (bitset(EF_HAS8BIT, e->e_flags) &&
1951	    bitnset(M_7BITS, m->m_flags) &&
1952	    (bitset(EF_DONT_MIME, e->e_flags) ||
1953	     !(bitset(MM_MIME8BIT, MimeMode) ||
1954	       (bitset(EF_IS_MIME, e->e_flags) &&
1955		bitset(MM_CVTMIME, MimeMode)))))
1956	{
1957		e->e_status = "5.6.3";
1958		usrerrenh(e->e_status,
1959			  "554 Cannot send 8-bit data to 7-bit destination");
1960		rcode = EX_DATAERR;
1961		goto give_up;
1962	}
1963
1964	if (tTd(62, 8))
1965		checkfds("before delivery");
1966
1967	/* check for Local Person Communication -- not for mortals!!! */
1968	if (strcmp(m->m_mailer, "[LPC]") == 0)
1969	{
1970		if (clever)
1971		{
1972			/* flush any expired connections */
1973			(void) mci_scan(NULL);
1974
1975			/* try to get a cached connection or just a slot */
1976			mci = mci_get(m->m_name, m);
1977			if (mci->mci_host == NULL)
1978				mci->mci_host = m->m_name;
1979			CurHostName = mci->mci_host;
1980			if (mci->mci_state != MCIS_CLOSED)
1981			{
1982				message("Using cached SMTP/LPC connection for %s...",
1983					m->m_name);
1984				mci->mci_deliveries++;
1985				goto do_transfer;
1986			}
1987		}
1988		else
1989		{
1990			mci = mci_new(e->e_rpool);
1991		}
1992		mci->mci_in = smioin;
1993		mci->mci_out = smioout;
1994		mci->mci_mailer = m;
1995		mci->mci_host = m->m_name;
1996		if (clever)
1997		{
1998			mci->mci_state = MCIS_OPENING;
1999			mci_cache(mci);
2000		}
2001		else
2002			mci->mci_state = MCIS_OPEN;
2003	}
2004	else if (strcmp(m->m_mailer, "[IPC]") == 0)
2005	{
2006		register int i;
2007
2008		if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '\0')
2009		{
2010			syserr("null destination for %s mailer", m->m_mailer);
2011			rcode = EX_CONFIG;
2012			goto give_up;
2013		}
2014
2015#if NETUNIX
2016		if (strcmp(pv[0], "FILE") == 0)
2017		{
2018			curhost = CurHostName = "localhost";
2019			mux_path = pv[1];
2020		}
2021		else
2022#endif /* NETUNIX */
2023		{
2024			CurHostName = pv[1];
2025							/* XXX ??? */
2026			curhost = hostsignature(m, pv[1], firstto->q_flags & QSECURE);
2027		}
2028
2029		if (curhost == NULL || curhost[0] == '\0')
2030		{
2031			syserr("null host signature for %s", pv[1]);
2032			rcode = EX_CONFIG;
2033			goto give_up;
2034		}
2035
2036		if (!clever)
2037		{
2038			syserr("554 5.3.5 non-clever IPC");
2039			rcode = EX_CONFIG;
2040			goto give_up;
2041		}
2042		if (pv[2] != NULL
2043#if NETUNIX
2044		    && mux_path == NULL
2045#endif
2046		    )
2047		{
2048			port = htons((unsigned short) atoi(pv[2]));
2049			if (port == 0)
2050			{
2051#ifdef NO_GETSERVBYNAME
2052				syserr("Invalid port number: %s", pv[2]);
2053#else /* NO_GETSERVBYNAME */
2054				struct servent *sp = getservbyname(pv[2], "tcp");
2055
2056				if (sp == NULL)
2057					syserr("Service %s unknown", pv[2]);
2058				else
2059					port = sp->s_port;
2060#endif /* NO_GETSERVBYNAME */
2061			}
2062		}
2063
2064		nummxhosts = parse_hostsignature(curhost, mxhosts, m);
2065		if (TimeOuts.to_aconnect > 0)
2066			enough = curtime() + TimeOuts.to_aconnect;
2067tryhost:
2068		while (hostnum < nummxhosts)
2069		{
2070			char sep = ':';
2071			char *endp;
2072			static char hostbuf[MAXNAME + 1];
2073			bool tried_fallbacksmarthost = false;
2074#if DANE
2075			unsigned long tlsa_flags;
2076
2077			ste = NULL;
2078			tlsa_flags = 0;
2079#endif
2080#if NETINET6
2081			if (*mxhosts[hostnum] == '[')
2082			{
2083				endp = strchr(mxhosts[hostnum] + 1, ']');
2084				if (endp != NULL)
2085					endp = strpbrk(endp + 1, ":,");
2086			}
2087			else
2088				endp = strpbrk(mxhosts[hostnum], ":,");
2089#else /* NETINET6 */
2090			endp = strpbrk(mxhosts[hostnum], ":,");
2091#endif /* NETINET6 */
2092			if (endp != NULL)
2093			{
2094				sep = *endp;
2095				*endp = '\0';
2096			}
2097
2098			if (hostnum == 1 && skip_back != NULL)
2099			{
2100				/*
2101				**  Coattail piggybacking is no longer an
2102				**  option with the mail host next to be tried
2103				**  no longer the lowest MX preference
2104				**  (hostnum == 1 meaning we're on the second
2105				**  preference). We do not try to coattail
2106				**  piggyback more than the first MX preference.
2107				**  Revert 'tochain' to last location for
2108				**  coincidental piggybacking. This works this
2109				**  easily because the q_tchain kept getting
2110				**  added to the top of the linked list.
2111				*/
2112
2113				tochain = skip_back;
2114			}
2115
2116			if (*mxhosts[hostnum] == '\0')
2117			{
2118				syserr("deliver: null host name in signature");
2119				hostnum++;
2120				if (endp != NULL)
2121					*endp = sep;
2122				continue;
2123			}
2124			(void) sm_strlcpy(hostbuf, mxhosts[hostnum],
2125					  sizeof(hostbuf));
2126			hostnum++;
2127			if (endp != NULL)
2128				*endp = sep;
2129#if STARTTLS
2130			tlsstate = 0;
2131#endif
2132
2133  one_last_try:
2134			/* see if we already know that this host is fried */
2135			CurHostName = hostbuf;
2136			mci = mci_get(hostbuf, m);
2137			if (mci->mci_state != MCIS_CLOSED)
2138			{
2139				char *type;
2140
2141				if (tTd(11, 1))
2142				{
2143					sm_dprintf("openmailer: ");
2144					mci_dump(sm_debug_file(), mci, false);
2145				}
2146				CurHostName = mci->mci_host;
2147				if (bitnset(M_LMTP, m->m_flags))
2148					type = "L";
2149				else if (bitset(MCIF_ESMTP, mci->mci_flags))
2150					type = "ES";
2151				else
2152					type = "S";
2153				message("Using cached %sMTP connection to %s via %s...",
2154					type, hostbuf, m->m_name);
2155				mci->mci_deliveries++;
2156				break;
2157			}
2158			mci->mci_mailer = m;
2159#if DANE
2160			tlsa_flags = 0;
2161			if (CHK_DANE(Dane))
2162				(void) GETTLSA(hostbuf, &ste, m->m_port);
2163
2164			/* XXX: check expiration! */
2165			if (ste != NULL && TLSA_RR_TEMPFAIL(ste->s_tlsa))
2166			{
2167				if (tTd(11, 1))
2168					sm_dprintf("skip: host=%s, TLSA_RR_lookup=%d\n"
2169						, hostbuf
2170						, ste->s_tlsa->dane_tlsa_dnsrc);
2171
2172				tlsa_flags |= TLSAFLTEMP;
2173			}
2174#endif /* DANE */
2175
2176			if (mci->mci_exitstat != EX_OK)
2177			{
2178				if (mci->mci_exitstat == EX_TEMPFAIL)
2179					goodmxfound = true;
2180
2181				/* Try FallbackSmartHost? */
2182				if (should_try_fbsh(e, &tried_fallbacksmarthost,
2183						    hostbuf, sizeof(hostbuf),
2184						    mci->mci_exitstat))
2185					goto one_last_try;
2186
2187				continue;
2188			}
2189
2190			if (mci_lock_host(mci) != EX_OK)
2191			{
2192				mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL);
2193				goodmxfound = true;
2194				continue;
2195			}
2196
2197			/* try the connection */
2198			sm_setproctitle(true, e, "%s %s: %s",
2199					qid_printname(e),
2200					hostbuf, "user open");
2201#if NETUNIX
2202			if (mux_path != NULL)
2203			{
2204				message("Connecting to %s via %s...",
2205					mux_path, m->m_name);
2206				i = makeconnection_ds((char *) mux_path, mci);
2207			}
2208			else
2209#endif /* NETUNIX */
2210			{
2211				if (port == 0)
2212					message("Connecting to %s via %s...",
2213						hostbuf, m->m_name);
2214				else
2215					message("Connecting to %s port %d via %s...",
2216						hostbuf, ntohs(port),
2217						m->m_name);
2218#if DANE
2219				tlsa_flags |= (ste != NULL) ? Dane : DANE_NEVER;
2220				dane_vrfy_ctx.dane_vrfy_chk = tlsa_flags;
2221				dane_vrfy_ctx.dane_vrfy_port = m->m_port;
2222				if (tTd(11, 11))
2223					sm_dprintf("makeconnection: before: chk=%d, mode=%lX\n", dane_vrfy_ctx.dane_vrfy_chk, tlsa_flags);
2224#endif
2225				i = makeconnection(hostbuf, port, mci, e,
2226						enough
2227#if DANE
2228						, &tlsa_flags
2229#endif
2230						);
2231#if DANE
2232				if (tTd(11, 11))
2233					sm_dprintf("makeconnection: after: chk=%d, mode=%lX\n", dane_vrfy_ctx.dane_vrfy_chk, tlsa_flags);
2234				if (dane_vrfy_ctx.dane_vrfy_chk != DANE_ALWAYS)
2235					dane_vrfy_ctx.dane_vrfy_chk = DANEMODE(tlsa_flags);
2236				if (EX_TEMPFAIL == i &&
2237				    ((tlsa_flags & (TLSAFLTEMP|DANE_SECURE)) ==
2238				     (TLSAFLTEMP|DANE_SECURE)))
2239				{
2240					(void) sm_strlcpy(SmtpError,
2241						" for TLSA RR",
2242						sizeof(SmtpError));
2243# if NAMED_BIND
2244					SM_SET_H_ERRNO(TRY_AGAIN);
2245# endif
2246				}
2247#endif
2248			}
2249			mci->mci_errno = errno;
2250			mci->mci_lastuse = curtime();
2251			mci->mci_deliveries = 0;
2252			mci->mci_exitstat = i;
2253			mci_clr_extensions(mci);
2254#if NAMED_BIND
2255			mci->mci_herrno = h_errno;
2256#endif
2257
2258			/*
2259			**  Have we tried long enough to get a connection?
2260			**	If yes, skip to the fallback MX hosts
2261			**	(if existent).
2262			*/
2263
2264			if (enough > 0 && mci->mci_lastuse >= enough)
2265			{
2266				int h;
2267#if NAMED_BIND
2268				extern int NumFallbackMXHosts;
2269#else
2270				const int NumFallbackMXHosts = 0;
2271#endif
2272
2273				if (hostnum < nummxhosts && LogLevel > 9)
2274					sm_syslog(LOG_INFO, e->e_id,
2275						  "Timeout.to_aconnect occurred before exhausting all addresses");
2276
2277				/* turn off timeout if fallback available */
2278				if (NumFallbackMXHosts > 0)
2279					enough = 0;
2280
2281				/* skip to a fallback MX host */
2282				h = nummxhosts - NumFallbackMXHosts;
2283				if (hostnum < h)
2284					hostnum = h;
2285			}
2286			if (i == EX_OK)
2287			{
2288				goodmxfound = true;
2289				markstats(e, firstto, STATS_CONNECT);
2290				mci->mci_state = MCIS_OPENING;
2291				mci_cache(mci);
2292				if (TrafficLogFile != NULL)
2293					(void) sm_io_fprintf(TrafficLogFile,
2294							     SM_TIME_DEFAULT,
2295							     "%05d === CONNECT %s\n",
2296							     (int) CurrentPid,
2297							     hostbuf);
2298				break;
2299			}
2300			else
2301			{
2302				/* Try FallbackSmartHost? */
2303				if (should_try_fbsh(e, &tried_fallbacksmarthost,
2304						    hostbuf, sizeof(hostbuf), i))
2305					goto one_last_try;
2306
2307				if (tTd(11, 1))
2308					sm_dprintf("openmailer: makeconnection => stat=%d, errno=%d\n",
2309						   i, errno);
2310				if (i == EX_TEMPFAIL)
2311					goodmxfound = true;
2312				mci_unlock_host(mci);
2313			}
2314
2315			/* enter status of this host */
2316			setstat(i);
2317
2318			/* should print some message here for -v mode */
2319		}
2320		if (mci == NULL)
2321		{
2322			syserr("deliver: no host name");
2323			rcode = EX_SOFTWARE;
2324			goto give_up;
2325		}
2326		mci->mci_pid = 0;
2327	}
2328	else
2329	{
2330		/* flush any expired connections */
2331		(void) mci_scan(NULL);
2332		mci = NULL;
2333
2334		if (bitnset(M_LMTP, m->m_flags))
2335		{
2336			/* try to get a cached connection */
2337			mci = mci_get(m->m_name, m);
2338			if (mci->mci_host == NULL)
2339				mci->mci_host = m->m_name;
2340			CurHostName = mci->mci_host;
2341			if (mci->mci_state != MCIS_CLOSED)
2342			{
2343				message("Using cached LMTP connection for %s...",
2344					m->m_name);
2345				mci->mci_deliveries++;
2346				goto do_transfer;
2347			}
2348		}
2349
2350		/* announce the connection to verbose listeners */
2351		if (host == NULL || host[0] == '\0')
2352			message("Connecting to %s...", m->m_name);
2353		else
2354			message("Connecting to %s via %s...", host, m->m_name);
2355		if (TrafficLogFile != NULL)
2356		{
2357			char **av;
2358
2359			(void) sm_io_fprintf(TrafficLogFile, SM_TIME_DEFAULT,
2360					     "%05d === EXEC", (int) CurrentPid);
2361			for (av = pv; *av != NULL; av++)
2362				(void) sm_io_fprintf(TrafficLogFile,
2363						     SM_TIME_DEFAULT, " %s",
2364						     *av);
2365			(void) sm_io_fprintf(TrafficLogFile, SM_TIME_DEFAULT,
2366					     "\n");
2367		}
2368
2369#if XDEBUG
2370		checkfd012("before creating mail pipe");
2371#endif
2372
2373		/* create a pipe to shove the mail through */
2374		if (pipe(mpvect) < 0)
2375		{
2376			syserr("%s... openmailer(%s): pipe (to mailer)",
2377			       shortenstring(e->e_to, MAXSHORTSTR), m->m_name);
2378			if (tTd(11, 1))
2379				sm_dprintf("openmailer: NULL\n");
2380			rcode = EX_OSERR;
2381			goto give_up;
2382		}
2383
2384#if XDEBUG
2385		/* make sure we didn't get one of the standard I/O files */
2386		if (mpvect[0] < 3 || mpvect[1] < 3)
2387		{
2388			syserr("%s... openmailer(%s): bogus mpvect %d %d",
2389			       shortenstring(e->e_to, MAXSHORTSTR), m->m_name,
2390			       mpvect[0], mpvect[1]);
2391			printopenfds(true);
2392			if (tTd(11, 1))
2393				sm_dprintf("openmailer: NULL\n");
2394			rcode = EX_OSERR;
2395			goto give_up;
2396		}
2397
2398		/* make sure system call isn't dead meat */
2399		checkfdopen(mpvect[0], "mpvect[0]");
2400		checkfdopen(mpvect[1], "mpvect[1]");
2401		if (mpvect[0] == mpvect[1] ||
2402		    (e->e_lockfp != NULL &&
2403		     (mpvect[0] == sm_io_getinfo(e->e_lockfp, SM_IO_WHAT_FD,
2404						 NULL) ||
2405		      mpvect[1] == sm_io_getinfo(e->e_lockfp, SM_IO_WHAT_FD,
2406						 NULL))))
2407		{
2408			if (e->e_lockfp == NULL)
2409				syserr("%s... openmailer(%s): overlapping mpvect %d %d",
2410				       shortenstring(e->e_to, MAXSHORTSTR),
2411				       m->m_name, mpvect[0], mpvect[1]);
2412			else
2413				syserr("%s... openmailer(%s): overlapping mpvect %d %d, lockfp = %d",
2414				       shortenstring(e->e_to, MAXSHORTSTR),
2415				       m->m_name, mpvect[0], mpvect[1],
2416				       sm_io_getinfo(e->e_lockfp,
2417						     SM_IO_WHAT_FD, NULL));
2418		}
2419#endif /* XDEBUG */
2420
2421		/* create a return pipe */
2422		if (pipe(rpvect) < 0)
2423		{
2424			syserr("%s... openmailer(%s): pipe (from mailer)",
2425			       shortenstring(e->e_to, MAXSHORTSTR),
2426			       m->m_name);
2427			(void) close(mpvect[0]);
2428			(void) close(mpvect[1]);
2429			if (tTd(11, 1))
2430				sm_dprintf("openmailer: NULL\n");
2431			rcode = EX_OSERR;
2432			goto give_up;
2433		}
2434#if XDEBUG
2435		checkfdopen(rpvect[0], "rpvect[0]");
2436		checkfdopen(rpvect[1], "rpvect[1]");
2437#endif
2438
2439		/*
2440		**  Actually fork the mailer process.
2441		**	DOFORK is clever about retrying.
2442		**
2443		**	Dispose of SIGCHLD signal catchers that may be laying
2444		**	around so that endmailer will get it.
2445		*/
2446
2447		if (e->e_xfp != NULL)	/* for debugging */
2448			(void) sm_io_flush(e->e_xfp, SM_TIME_DEFAULT);
2449		(void) sm_io_flush(smioout, SM_TIME_DEFAULT);
2450		(void) sm_signal(SIGCHLD, SIG_DFL);
2451
2452
2453		DOFORK(FORK);
2454		/* pid is set by DOFORK */
2455
2456		if (pid < 0)
2457		{
2458			/* failure */
2459			syserr("%s... openmailer(%s): cannot fork",
2460			       shortenstring(e->e_to, MAXSHORTSTR), m->m_name);
2461			(void) close(mpvect[0]);
2462			(void) close(mpvect[1]);
2463			(void) close(rpvect[0]);
2464			(void) close(rpvect[1]);
2465			if (tTd(11, 1))
2466				sm_dprintf("openmailer: NULL\n");
2467			rcode = EX_OSERR;
2468			goto give_up;
2469		}
2470		else if (pid == 0)
2471		{
2472			int save_errno;
2473			int sff;
2474			int new_euid = NO_UID;
2475			int new_ruid = NO_UID;
2476			int new_gid = NO_GID;
2477			char *user = NULL;
2478			struct stat stb;
2479			extern int DtableSize;
2480
2481			CurrentPid = getpid();
2482
2483			/* clear the events to turn off SIGALRMs */
2484			sm_clear_events();
2485
2486			/* Reset global flags */
2487			RestartRequest = NULL;
2488			RestartWorkGroup = false;
2489			ShutdownRequest = NULL;
2490			PendingSignal = 0;
2491
2492			if (e->e_lockfp != NULL)
2493				(void) close(sm_io_getinfo(e->e_lockfp,
2494							   SM_IO_WHAT_FD,
2495							   NULL));
2496
2497			/* child -- set up input & exec mailer */
2498			(void) sm_signal(SIGALRM, sm_signal_noop);
2499			(void) sm_signal(SIGCHLD, SIG_DFL);
2500			(void) sm_signal(SIGHUP, SIG_IGN);
2501			(void) sm_signal(SIGINT, SIG_IGN);
2502			(void) sm_signal(SIGTERM, SIG_DFL);
2503#ifdef SIGUSR1
2504			(void) sm_signal(SIGUSR1, sm_signal_noop);
2505#endif
2506
2507			if (m != FileMailer || stat(tochain->q_user, &stb) < 0)
2508				stb.st_mode = 0;
2509
2510#if HASSETUSERCONTEXT
2511			/*
2512			**  Set user resources.
2513			*/
2514
2515			if (contextaddr != NULL)
2516			{
2517				int sucflags;
2518				struct passwd *pwd;
2519
2520				if (contextaddr->q_ruser != NULL)
2521					pwd = sm_getpwnam(contextaddr->q_ruser);
2522				else
2523					pwd = sm_getpwnam(contextaddr->q_user);
2524				sucflags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;
2525# ifdef LOGIN_SETCPUMASK
2526				sucflags |= LOGIN_SETCPUMASK;
2527# endif
2528# ifdef LOGIN_SETLOGINCLASS
2529				sucflags |= LOGIN_SETLOGINCLASS;
2530# endif
2531# ifdef LOGIN_SETMAC
2532				sucflags |= LOGIN_SETMAC;
2533# endif
2534				if (pwd != NULL &&
2535				    setusercontext(NULL, pwd, pwd->pw_uid,
2536						   sucflags) == -1 &&
2537				    suidwarn)
2538				{
2539					syserr("openmailer: setusercontext() failed");
2540					exit(EX_TEMPFAIL);
2541				}
2542			}
2543#endif /* HASSETUSERCONTEXT */
2544
2545#if HASNICE
2546			/* tweak niceness */
2547			if (m->m_nice != 0)
2548				(void) nice(m->m_nice);
2549#endif /* HASNICE */
2550
2551			/* reset group id */
2552			if (bitnset(M_SPECIFIC_UID, m->m_flags))
2553			{
2554				if (m->m_gid == NO_GID)
2555					new_gid = RunAsGid;
2556				else
2557					new_gid = m->m_gid;
2558			}
2559			else if (bitset(S_ISGID, stb.st_mode))
2560				new_gid = stb.st_gid;
2561			else if (ctladdr != NULL && ctladdr->q_gid != 0)
2562			{
2563				if (!DontInitGroups)
2564				{
2565					user = ctladdr->q_ruser;
2566					if (user == NULL)
2567						user = ctladdr->q_user;
2568
2569					if (initgroups(user,
2570						       ctladdr->q_gid) == -1
2571					    && suidwarn)
2572					{
2573						syserr("openmailer: initgroups(%s, %ld) failed",
2574							user, (long) ctladdr->q_gid);
2575						exit(EX_TEMPFAIL);
2576					}
2577				}
2578				else
2579				{
2580					GIDSET_T gidset[1];
2581
2582					gidset[0] = ctladdr->q_gid;
2583					if (setgroups(1, gidset) == -1
2584					    && suidwarn)
2585					{
2586						syserr("openmailer: setgroups() failed");
2587						exit(EX_TEMPFAIL);
2588					}
2589				}
2590				new_gid = ctladdr->q_gid;
2591			}
2592			else
2593			{
2594				if (!DontInitGroups)
2595				{
2596					user = DefUser;
2597					if (initgroups(DefUser, DefGid) == -1 &&
2598					    suidwarn)
2599					{
2600						syserr("openmailer: initgroups(%s, %ld) failed",
2601						       DefUser, (long) DefGid);
2602						exit(EX_TEMPFAIL);
2603					}
2604				}
2605				else
2606				{
2607					GIDSET_T gidset[1];
2608
2609					gidset[0] = DefGid;
2610					if (setgroups(1, gidset) == -1
2611					    && suidwarn)
2612					{
2613						syserr("openmailer: setgroups() failed");
2614						exit(EX_TEMPFAIL);
2615					}
2616				}
2617				if (m->m_gid == NO_GID)
2618					new_gid = DefGid;
2619				else
2620					new_gid = m->m_gid;
2621			}
2622			if (new_gid != NO_GID)
2623			{
2624				if (RunAsUid != 0 &&
2625				    bitnset(M_SPECIFIC_UID, m->m_flags) &&
2626				    new_gid != getgid() &&
2627				    new_gid != getegid())
2628				{
2629					/* Only root can change the gid */
2630					syserr("openmailer: insufficient privileges to change gid, RunAsUid=%ld, new_gid=%ld, gid=%ld, egid=%ld",
2631					       (long) RunAsUid, (long) new_gid,
2632					       (long) getgid(), (long) getegid());
2633					exit(EX_TEMPFAIL);
2634				}
2635
2636				if (setgid(new_gid) < 0 && suidwarn)
2637				{
2638					syserr("openmailer: setgid(%ld) failed",
2639					       (long) new_gid);
2640					exit(EX_TEMPFAIL);
2641				}
2642			}
2643
2644			/* change root to some "safe" directory */
2645			if (m->m_rootdir != NULL)
2646			{
2647				expand(m->m_rootdir, cbuf, sizeof(cbuf), e);
2648				if (tTd(11, 20))
2649					sm_dprintf("openmailer: chroot %s\n",
2650						   cbuf);
2651				if (chroot(cbuf) < 0)
2652				{
2653					syserr("openmailer: Cannot chroot(%s)",
2654					       cbuf);
2655					exit(EX_TEMPFAIL);
2656				}
2657				if (chdir("/") < 0)
2658				{
2659					syserr("openmailer: cannot chdir(/)");
2660					exit(EX_TEMPFAIL);
2661				}
2662			}
2663
2664			/* reset user id */
2665			endpwent();
2666			sm_mbdb_terminate();
2667			if (bitnset(M_SPECIFIC_UID, m->m_flags))
2668			{
2669				if (m->m_uid == NO_UID)
2670					new_euid = RunAsUid;
2671				else
2672					new_euid = m->m_uid;
2673
2674				/*
2675				**  Undo the effects of the uid change in main
2676				**  for signal handling.  The real uid may
2677				**  be used by mailer in adding a "From "
2678				**  line.
2679				*/
2680
2681				if (RealUid != 0 && RealUid != getuid())
2682				{
2683#if MAILER_SETUID_METHOD == USE_SETEUID
2684# if HASSETREUID
2685					if (setreuid(RealUid, geteuid()) < 0)
2686					{
2687						syserr("openmailer: setreuid(%d, %d) failed",
2688						       (int) RealUid, (int) geteuid());
2689						exit(EX_OSERR);
2690					}
2691# endif /* HASSETREUID */
2692#endif /* MAILER_SETUID_METHOD == USE_SETEUID */
2693#if MAILER_SETUID_METHOD == USE_SETREUID
2694					new_ruid = RealUid;
2695#endif
2696				}
2697			}
2698			else if (bitset(S_ISUID, stb.st_mode))
2699				new_ruid = stb.st_uid;
2700			else if (ctladdr != NULL && ctladdr->q_uid != 0)
2701				new_ruid = ctladdr->q_uid;
2702			else if (m->m_uid != NO_UID)
2703				new_ruid = m->m_uid;
2704			else
2705				new_ruid = DefUid;
2706
2707#if _FFR_USE_SETLOGIN
2708			/* run disconnected from terminal and set login name */
2709			if (setsid() >= 0 &&
2710			    ctladdr != NULL && ctladdr->q_uid != 0 &&
2711			    new_euid == ctladdr->q_uid)
2712			{
2713				struct passwd *pwd;
2714
2715				pwd = sm_getpwuid(ctladdr->q_uid);
2716				if (pwd != NULL && suidwarn)
2717					(void) setlogin(pwd->pw_name);
2718				endpwent();
2719			}
2720#endif /* _FFR_USE_SETLOGIN */
2721
2722			if (new_euid != NO_UID)
2723			{
2724				if (RunAsUid != 0 && new_euid != RunAsUid)
2725				{
2726					/* Only root can change the uid */
2727					syserr("openmailer: insufficient privileges to change uid, new_euid=%ld, RunAsUid=%ld",
2728					       (long) new_euid, (long) RunAsUid);
2729					exit(EX_TEMPFAIL);
2730				}
2731
2732				vendor_set_uid(new_euid);
2733#if MAILER_SETUID_METHOD == USE_SETEUID
2734				if (seteuid(new_euid) < 0 && suidwarn)
2735				{
2736					syserr("openmailer: seteuid(%ld) failed",
2737					       (long) new_euid);
2738					exit(EX_TEMPFAIL);
2739				}
2740#endif /* MAILER_SETUID_METHOD == USE_SETEUID */
2741#if MAILER_SETUID_METHOD == USE_SETREUID
2742				if (setreuid(new_ruid, new_euid) < 0 && suidwarn)
2743				{
2744					syserr("openmailer: setreuid(%ld, %ld) failed",
2745					       (long) new_ruid, (long) new_euid);
2746					exit(EX_TEMPFAIL);
2747				}
2748#endif /* MAILER_SETUID_METHOD == USE_SETREUID */
2749#if MAILER_SETUID_METHOD == USE_SETUID
2750				if (new_euid != geteuid() && setuid(new_euid) < 0 && suidwarn)
2751				{
2752					syserr("openmailer: setuid(%ld) failed",
2753					       (long) new_euid);
2754					exit(EX_TEMPFAIL);
2755				}
2756#endif /* MAILER_SETUID_METHOD == USE_SETUID */
2757			}
2758			else if (new_ruid != NO_UID)
2759			{
2760				vendor_set_uid(new_ruid);
2761				if (setuid(new_ruid) < 0 && suidwarn)
2762				{
2763					syserr("openmailer: setuid(%ld) failed",
2764					       (long) new_ruid);
2765					exit(EX_TEMPFAIL);
2766				}
2767			}
2768
2769			if (tTd(11, 2))
2770				sm_dprintf("openmailer: running as r/euid=%ld/%ld, r/egid=%ld/%ld\n",
2771					   (long) getuid(), (long) geteuid(),
2772					   (long) getgid(), (long) getegid());
2773
2774			/* move into some "safe" directory */
2775			if (m->m_execdir != NULL)
2776			{
2777				char *q;
2778
2779				for (p = m->m_execdir; p != NULL; p = q)
2780				{
2781					q = strchr(p, ':');
2782					if (q != NULL)
2783						*q = '\0';
2784					expand(p, cbuf, sizeof(cbuf), e);
2785					if (q != NULL)
2786						*q++ = ':';
2787					if (tTd(11, 20))
2788						sm_dprintf("openmailer: trydir %s\n",
2789							   cbuf);
2790					if (cbuf[0] != '\0' &&
2791					    chdir(cbuf) >= 0)
2792						break;
2793				}
2794			}
2795
2796			/* Check safety of program to be run */
2797			sff = SFF_ROOTOK|SFF_EXECOK;
2798			if (!bitnset(DBS_RUNWRITABLEPROGRAM,
2799				     DontBlameSendmail))
2800				sff |= SFF_NOGWFILES|SFF_NOWWFILES;
2801			if (bitnset(DBS_RUNPROGRAMINUNSAFEDIRPATH,
2802				    DontBlameSendmail))
2803				sff |= SFF_NOPATHCHECK;
2804			else
2805				sff |= SFF_SAFEDIRPATH;
2806			ret = safefile(m->m_mailer, getuid(), getgid(),
2807				       user, sff, 0, NULL);
2808			if (ret != 0)
2809				sm_syslog(LOG_INFO, e->e_id,
2810					  "Warning: program %s unsafe: %s",
2811					  m->m_mailer, sm_errstring(ret));
2812
2813			/* arrange to filter std & diag output of command */
2814			(void) close(rpvect[0]);
2815			if (dup2(rpvect[1], STDOUT_FILENO) < 0)
2816			{
2817				syserr("%s... openmailer(%s): cannot dup pipe %d for stdout",
2818				       shortenstring(e->e_to, MAXSHORTSTR),
2819				       m->m_name, rpvect[1]);
2820				_exit(EX_OSERR);
2821			}
2822			(void) close(rpvect[1]);
2823
2824			if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0)
2825			{
2826				syserr("%s... openmailer(%s): cannot dup stdout for stderr",
2827				       shortenstring(e->e_to, MAXSHORTSTR),
2828				       m->m_name);
2829				_exit(EX_OSERR);
2830			}
2831
2832			/* arrange to get standard input */
2833			(void) close(mpvect[1]);
2834			if (dup2(mpvect[0], STDIN_FILENO) < 0)
2835			{
2836				syserr("%s... openmailer(%s): cannot dup pipe %d for stdin",
2837				       shortenstring(e->e_to, MAXSHORTSTR),
2838				       m->m_name, mpvect[0]);
2839				_exit(EX_OSERR);
2840			}
2841			(void) close(mpvect[0]);
2842
2843			/* arrange for all the files to be closed */
2844			sm_close_on_exec(STDERR_FILENO + 1, DtableSize);
2845
2846#if !_FFR_USE_SETLOGIN
2847			/* run disconnected from terminal */
2848			(void) setsid();
2849#endif
2850
2851			/* try to execute the mailer */
2852			(void) execve(m->m_mailer, (ARGV_T) pv,
2853				      (ARGV_T) UserEnviron);
2854			save_errno = errno;
2855			syserr("Cannot exec %s", m->m_mailer);
2856			if (bitnset(M_LOCALMAILER, m->m_flags) ||
2857			    transienterror(save_errno))
2858				_exit(EX_OSERR);
2859			_exit(EX_UNAVAILABLE);
2860		}
2861
2862		/*
2863		**  Set up return value.
2864		*/
2865
2866		if (mci == NULL)
2867		{
2868			if (clever)
2869			{
2870				/*
2871				**  Allocate from general heap, not
2872				**  envelope rpool, because this mci
2873				**  is going to be cached.
2874				*/
2875
2876				mci = mci_new(NULL);
2877			}
2878			else
2879			{
2880				/*
2881				**  Prevent a storage leak by allocating
2882				**  this from the envelope rpool.
2883				*/
2884
2885				mci = mci_new(e->e_rpool);
2886			}
2887		}
2888		mci->mci_mailer = m;
2889		if (clever)
2890		{
2891			mci->mci_state = MCIS_OPENING;
2892			mci_cache(mci);
2893		}
2894		else
2895		{
2896			mci->mci_state = MCIS_OPEN;
2897		}
2898		mci->mci_pid = pid;
2899		(void) close(mpvect[0]);
2900		mci->mci_out = sm_io_open(SmFtStdiofd, SM_TIME_DEFAULT,
2901					  (void *) &(mpvect[1]), SM_IO_WRONLY_B,
2902					  NULL);
2903		if (mci->mci_out == NULL)
2904		{
2905			syserr("deliver: cannot create mailer output channel, fd=%d",
2906			       mpvect[1]);
2907			(void) close(mpvect[1]);
2908			(void) close(rpvect[0]);
2909			(void) close(rpvect[1]);
2910			rcode = EX_OSERR;
2911			goto give_up;
2912		}
2913
2914		(void) close(rpvect[1]);
2915		mci->mci_in = sm_io_open(SmFtStdiofd, SM_TIME_DEFAULT,
2916					 (void *) &(rpvect[0]), SM_IO_RDONLY_B,
2917					 NULL);
2918		if (mci->mci_in == NULL)
2919		{
2920			syserr("deliver: cannot create mailer input channel, fd=%d",
2921			       mpvect[1]);
2922			(void) close(rpvect[0]);
2923			(void) sm_io_close(mci->mci_out, SM_TIME_DEFAULT);
2924			mci->mci_out = NULL;
2925			rcode = EX_OSERR;
2926			goto give_up;
2927		}
2928	}
2929
2930	/*
2931	**  If we are in SMTP opening state, send initial protocol.
2932	*/
2933
2934	if (bitnset(M_7BITS, m->m_flags) &&
2935	    (!clever || mci->mci_state == MCIS_OPENING))
2936		mci->mci_flags |= MCIF_7BIT;
2937	if (clever && mci->mci_state != MCIS_CLOSED)
2938	{
2939#if STARTTLS || SASL
2940		char *srvname;
2941		extern SOCKADDR CurHostAddr;
2942#endif /* STARTTLS || SASL */
2943
2944#if SASL
2945# define DONE_AUTH(f)		bitset(MCIF_AUTHACT, f)
2946#endif
2947#if STARTTLS
2948# define DONE_STARTTLS(f)	bitset(MCIF_TLSACT, f)
2949#endif
2950#define ONLY_HELO(f)		bitset(MCIF_ONLY_EHLO, f)
2951#define SET_HELO(f)		f |= MCIF_ONLY_EHLO
2952#define CLR_HELO(f)		f &= ~MCIF_ONLY_EHLO
2953
2954#if STARTTLS || SASL
2955		/* don't use CurHostName, it is changed in many places */
2956		if (mci->mci_host != NULL)
2957		{
2958			srvname = mci->mci_host;
2959			RM_TRAIL_DOT(srvname);
2960		}
2961		else if (mci->mci_mailer != NULL)
2962		{
2963			srvname = mci->mci_mailer->m_name;
2964			dotpos = -1;
2965		}
2966		else
2967		{
2968			srvname = "local";
2969			dotpos = -1;
2970		}
2971
2972		/* don't set {server_name} to NULL or "": see getauth() */
2973		macdefine(&mci->mci_macro, A_TEMP, macid("{server_name}"),
2974			  srvname);
2975
2976		/* CurHostAddr is set by makeconnection() and mci_get() */
2977		if (CurHostAddr.sa.sa_family != 0)
2978		{
2979			macdefine(&mci->mci_macro, A_TEMP,
2980				  macid("{server_addr}"),
2981				  anynet_ntoa(&CurHostAddr));
2982		}
2983		else if (mci->mci_mailer != NULL)
2984		{
2985			/* mailer name is unique, use it as address */
2986			macdefine(&mci->mci_macro, A_PERM,
2987				  macid("{server_addr}"),
2988				  mci->mci_mailer->m_name);
2989		}
2990		else
2991		{
2992			/* don't set it to NULL or "": see getauth() */
2993			macdefine(&mci->mci_macro, A_PERM,
2994				  macid("{server_addr}"), "0");
2995		}
2996
2997# if DANE
2998		SM_FREE(dane_vrfy_ctx.dane_vrfy_host);
2999		SM_FREE(dane_vrfy_ctx.dane_vrfy_sni);
3000		dane_vrfy_ctx.dane_vrfy_fp[0] = '\0';
3001		if (ste != NULL && ste->s_tlsa != NULL &&
3002		    ste->s_tlsa->dane_tlsa_sni != NULL)
3003			dane_vrfy_ctx.dane_vrfy_sni = sm_strdup(ste->s_tlsa->dane_tlsa_sni);
3004		dane_vrfy_ctx.dane_vrfy_host = sm_strdup(srvname);
3005# endif
3006
3007		/* undo change of srvname (mci->mci_host) */
3008		FIX_TRAIL_DOT(srvname);
3009
3010reconnect:	/* after switching to an encrypted connection */
3011# if DANE
3012		if (DONE_STARTTLS(mci->mci_flags))
3013		{
3014			/* use a "reset" function? */
3015			SM_FREE(dane_vrfy_ctx.dane_vrfy_host);
3016			SM_FREE(dane_vrfy_ctx.dane_vrfy_sni);
3017			dane_vrfy_ctx.dane_vrfy_fp[0] = '\0';
3018			dane_vrfy_ctx.dane_vrfy_res = 0;
3019		}
3020# endif
3021
3022#endif /* STARTTLS || SASL */
3023
3024		/* set the current connection information */
3025		e->e_mci = mci;
3026#if SASL
3027		mci->mci_saslcap = NULL;
3028#endif
3029		smtpinit(m, mci, e, ONLY_HELO(mci->mci_flags));
3030		CLR_HELO(mci->mci_flags);
3031
3032		if (IS_DLVR_RETURN(e))
3033		{
3034			/*
3035			**  Check whether other side can deliver e-mail
3036			**  fast enough
3037			*/
3038
3039			if (!bitset(MCIF_DLVR_BY, mci->mci_flags))
3040			{
3041				e->e_status = "5.4.7";
3042				usrerrenh(e->e_status,
3043					  "554 Server does not support Deliver By");
3044				rcode = EX_UNAVAILABLE;
3045				goto give_up;
3046			}
3047			if (e->e_deliver_by > 0 &&
3048			    e->e_deliver_by - (curtime() - e->e_ctime) <
3049			    mci->mci_min_by)
3050			{
3051				e->e_status = "5.4.7";
3052				usrerrenh(e->e_status,
3053					  "554 Message can't be delivered in time; %ld < %ld",
3054					  e->e_deliver_by - (long) (curtime() -
3055								e->e_ctime),
3056					  mci->mci_min_by);
3057				rcode = EX_UNAVAILABLE;
3058				goto give_up;
3059			}
3060		}
3061
3062#if STARTTLS
3063		/* first TLS then AUTH to provide a security layer */
3064		if (mci->mci_state != MCIS_CLOSED &&
3065		    !DONE_STARTTLS(mci->mci_flags))
3066		{
3067			int olderrors;
3068			bool usetls;
3069			bool saveQuickAbort = QuickAbort;
3070			bool saveSuprErrs = SuprErrs;
3071			char *host = NULL;
3072
3073			rcode = EX_OK;
3074			usetls = bitset(MCIF_TLS, mci->mci_flags);
3075			if (usetls)
3076				usetls = !iscltflgset(e, D_NOTLS);
3077			if (usetls)
3078				usetls = tlsstate == 0;
3079
3080			host = macvalue(macid("{server_name}"), e);
3081			if (usetls)
3082			{
3083				olderrors = Errors;
3084				QuickAbort = false;
3085				SuprErrs = true;
3086				if (rscheck("try_tls", host, NULL, e,
3087					    RSF_RMCOMM, 7, host, NOQID, NULL,
3088					    NULL) != EX_OK
3089				    || Errors > olderrors)
3090				{
3091					usetls = false;
3092				}
3093				SuprErrs = saveSuprErrs;
3094				QuickAbort = saveQuickAbort;
3095			}
3096
3097			if (usetls)
3098			{
3099				if ((rcode = starttls(m, mci, e
3100# if DANE
3101							, &dane_vrfy_ctx
3102# endif
3103					)) == EX_OK)
3104				{
3105					/* start again without STARTTLS */
3106					mci->mci_flags |= MCIF_TLSACT;
3107				}
3108				else
3109				{
3110					char *s;
3111
3112					/*
3113					**  TLS negotiation failed, what to do?
3114					**  fall back to unencrypted connection
3115					**  or abort? How to decide?
3116					**  set a macro and call a ruleset.
3117					*/
3118
3119					mci->mci_flags &= ~MCIF_TLS;
3120					switch (rcode)
3121					{
3122					  case EX_TEMPFAIL:
3123						s = "TEMP";
3124						break;
3125					  case EX_USAGE:
3126						s = "USAGE";
3127						break;
3128					  case EX_PROTOCOL:
3129						s = "PROTOCOL";
3130						break;
3131					  case EX_SOFTWARE:
3132						s = "SOFTWARE";
3133						break;
3134					  case EX_UNAVAILABLE:
3135						s = "NONE";
3136						break;
3137
3138					  /* everything else is a failure */
3139					  default:
3140						s = "FAILURE";
3141						rcode = EX_TEMPFAIL;
3142					}
3143					macdefine(&e->e_macro, A_PERM,
3144						  macid("{verify}"), s);
3145				}
3146			}
3147			else
3148			{
3149				p = tlsstate == 0 ? "NONE": "CLEAR";
3150# if DANE
3151				/*
3152				**  TLSA found but STARTTLS not offered?
3153				**  What is the best way to "fail"?
3154				**  XXX: check expiration!
3155				*/
3156
3157				if (!bitset(MCIF_TLS, mci->mci_flags) &&
3158				    ste != NULL &&
3159				    ste->s_tlsa != NULL &&
3160				    ste->s_tlsa->dane_tlsa_n > 0)
3161				{
3162					if (LogLevel > 8)
3163						sm_syslog(LOG_NOTICE, NOQID,
3164							"STARTTLS=client, relay=%.100s, warning=DANE configured in DNS but no STARTTLS available",
3165							host);
3166					/* XXX include TLSA RR from DNS? */
3167
3168					p = "DANE_FAIL";
3169				}
3170# endif /* DANE */
3171				macdefine(&e->e_macro, A_PERM,
3172					  macid("{verify}"), p);
3173			}
3174			olderrors = Errors;
3175			QuickAbort = false;
3176			SuprErrs = true;
3177
3178			/*
3179			**  rcode == EX_SOFTWARE is special:
3180			**  the TLS negotiation failed
3181			**  we have to drop the connection no matter what
3182			**  However, we call tls_server to give it the chance
3183			**  to log the problem and return an appropriate
3184			**  error code.
3185			*/
3186
3187			if (rscheck("tls_server",
3188				    macvalue(macid("{verify}"), e),
3189				    NULL, e, RSF_RMCOMM|RSF_COUNT, 5,
3190				    host, NOQID, NULL, NULL) != EX_OK ||
3191			    Errors > olderrors ||
3192			    rcode == EX_SOFTWARE)
3193			{
3194				char enhsc[ENHSCLEN];
3195				extern char MsgBuf[];
3196
3197				if (ISSMTPCODE(MsgBuf) &&
3198				    extenhsc(MsgBuf + 4, ' ', enhsc) > 0)
3199				{
3200					p = sm_rpool_strdup_x(e->e_rpool,
3201							      MsgBuf);
3202				}
3203				else
3204				{
3205					p = "403 4.7.0 server not authenticated.";
3206					(void) sm_strlcpy(enhsc, "4.7.0",
3207							  sizeof(enhsc));
3208				}
3209				SuprErrs = saveSuprErrs;
3210				QuickAbort = saveQuickAbort;
3211
3212				if (rcode == EX_SOFTWARE)
3213				{
3214					/* drop the connection */
3215					mci->mci_state = MCIS_QUITING;
3216					if (mci->mci_in != NULL)
3217					{
3218						(void) sm_io_close(mci->mci_in,
3219								   SM_TIME_DEFAULT);
3220						mci->mci_in = NULL;
3221					}
3222					mci->mci_flags &= ~MCIF_TLSACT;
3223					(void) endmailer(mci, e, pv);
3224
3225					if ((TLSFallbacktoClear ||
3226					     SM_TLSI_IS(&(mci->mci_tlsi),
3227							TLSI_FL_FB2CLR)) &&
3228					    !SM_TLSI_IS(&(mci->mci_tlsi),
3229							TLSI_FL_NOFB2CLR)
3230# if DANE
3231					     && dane_vrfy_ctx.dane_vrfy_chk !=
3232						DANE_SECURE
3233# endif
3234					    )
3235					{
3236						++tlsstate;
3237					}
3238				}
3239				else
3240				{
3241					/* abort transfer */
3242					smtpquit(m, mci, e);
3243				}
3244
3245				/* avoid bogus error msg */
3246				mci->mci_errno = 0;
3247
3248				/* temp or permanent failure? */
3249				rcode = (*p == '4') ? EX_TEMPFAIL
3250						    : EX_UNAVAILABLE;
3251				mci_setstat(mci, rcode, enhsc, p);
3252
3253				/*
3254				**  hack to get the error message into
3255				**  the envelope (done in giveresponse())
3256				*/
3257
3258				(void) sm_strlcpy(SmtpError, p,
3259						  sizeof(SmtpError));
3260			}
3261			else if (mci->mci_state == MCIS_CLOSED)
3262			{
3263				/* connection close caused by 421 */
3264				mci->mci_errno = 0;
3265				rcode = EX_TEMPFAIL;
3266				mci_setstat(mci, rcode, NULL, "421");
3267			}
3268			else
3269				rcode = 0;
3270
3271			QuickAbort = saveQuickAbort;
3272			SuprErrs = saveSuprErrs;
3273			if (DONE_STARTTLS(mci->mci_flags) &&
3274			    mci->mci_state != MCIS_CLOSED)
3275			{
3276				SET_HELO(mci->mci_flags);
3277				mci_clr_extensions(mci);
3278				goto reconnect;
3279			}
3280			if (tlsstate == 1)
3281			{
3282				if (tTd(11, 1))
3283				{
3284					sm_syslog(LOG_DEBUG, NOQID,
3285						"STARTTLS=client, relay=%.100s, tlsstate=%d, status=trying_again",
3286						mci->mci_host, tlsstate);
3287					mci_dump(NULL, mci, true);
3288				}
3289				++tlsstate;
3290
3291				/*
3292				**  Fake the status so a new connection is
3293				**  tried, otherwise the TLS error will
3294				**  "persist" during this delivery attempt.
3295				*/
3296
3297				mci->mci_errno = 0;
3298				rcode = EX_OK;
3299				mci_setstat(mci, rcode, NULL, NULL);
3300				goto one_last_try;
3301}
3302		}
3303#endif /* STARTTLS */
3304#if SASL
3305		/* if other server supports authentication let's authenticate */
3306		if (mci->mci_state != MCIS_CLOSED &&
3307		    mci->mci_saslcap != NULL &&
3308		    !DONE_AUTH(mci->mci_flags) && !iscltflgset(e, D_NOAUTH))
3309		{
3310			/* Should we require some minimum authentication? */
3311			if ((ret = smtpauth(m, mci, e)) == EX_OK)
3312			{
3313				int result;
3314				sasl_ssf_t *ssf = NULL;
3315
3316				/* Get security strength (features) */
3317				result = sasl_getprop(mci->mci_conn, SASL_SSF,
3318# if SASL >= 20000
3319						      (const void **) &ssf);
3320# else
3321						      (void **) &ssf);
3322# endif
3323
3324				/* XXX authid? */
3325				if (LogLevel > 9)
3326					sm_syslog(LOG_INFO, NOQID,
3327						  "AUTH=client, relay=%.100s, mech=%.16s, bits=%d",
3328						  mci->mci_host,
3329						  macvalue(macid("{auth_type}"), e),
3330						  result == SASL_OK ? *ssf : 0);
3331
3332				/*
3333				**  Only switch to encrypted connection
3334				**  if a security layer has been negotiated
3335				*/
3336
3337				if (result == SASL_OK && *ssf > 0)
3338				{
3339					int tmo;
3340
3341					/*
3342					**  Convert I/O layer to use SASL.
3343					**  If the call fails, the connection
3344					**  is aborted.
3345					*/
3346
3347					tmo = DATA_PROGRESS_TIMEOUT * 1000;
3348					if (sfdcsasl(&mci->mci_in,
3349						     &mci->mci_out,
3350						     mci->mci_conn, tmo) == 0)
3351					{
3352						mci_clr_extensions(mci);
3353						mci->mci_flags |= MCIF_AUTHACT|
3354								  MCIF_ONLY_EHLO;
3355						goto reconnect;
3356					}
3357					syserr("AUTH TLS switch failed in client");
3358				}
3359				/* else? XXX */
3360				mci->mci_flags |= MCIF_AUTHACT;
3361
3362			}
3363			else if (ret == EX_TEMPFAIL)
3364			{
3365				if (LogLevel > 8)
3366					sm_syslog(LOG_ERR, NOQID,
3367						  "AUTH=client, relay=%.100s, temporary failure, connection abort",
3368						  mci->mci_host);
3369				smtpquit(m, mci, e);
3370
3371				/* avoid bogus error msg */
3372				mci->mci_errno = 0;
3373				rcode = EX_TEMPFAIL;
3374				mci_setstat(mci, rcode, "4.3.0", p);
3375
3376				/*
3377				**  hack to get the error message into
3378				**  the envelope (done in giveresponse())
3379				*/
3380
3381				(void) sm_strlcpy(SmtpError,
3382						  "Temporary AUTH failure",
3383						  sizeof(SmtpError));
3384			}
3385		}
3386#endif /* SASL */
3387	}
3388
3389do_transfer:
3390	/* clear out per-message flags from connection structure */
3391	mci->mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7);
3392
3393	if (bitset(EF_HAS8BIT, e->e_flags) &&
3394	    !bitset(EF_DONT_MIME, e->e_flags) &&
3395	    bitnset(M_7BITS, m->m_flags))
3396		mci->mci_flags |= MCIF_CVT8TO7;
3397
3398#if MIME7TO8
3399	if (bitnset(M_MAKE8BIT, m->m_flags) &&
3400	    !bitset(MCIF_7BIT, mci->mci_flags) &&
3401	    (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL &&
3402	     (sm_strcasecmp(p, "quoted-printable") == 0 ||
3403	      sm_strcasecmp(p, "base64") == 0) &&
3404	    (p = hvalue("Content-Type", e->e_header)) != NULL)
3405	{
3406		/* may want to convert 7 -> 8 */
3407		/* XXX should really parse it here -- and use a class XXX */
3408		if (sm_strncasecmp(p, "text/plain", 10) == 0 &&
3409		    (p[10] == '\0' || p[10] == ' ' || p[10] == ';'))
3410			mci->mci_flags |= MCIF_CVT7TO8;
3411	}
3412#endif /* MIME7TO8 */
3413
3414	if (tTd(11, 1))
3415	{
3416		sm_dprintf("openmailer: ");
3417		mci_dump(sm_debug_file(), mci, false);
3418	}
3419
3420#if _FFR_CLIENT_SIZE
3421	/*
3422	**  See if we know the maximum size and
3423	**  abort if the message is too big.
3424	**
3425	**  NOTE: _FFR_CLIENT_SIZE is untested.
3426	*/
3427
3428	if (bitset(MCIF_SIZE, mci->mci_flags) &&
3429	    mci->mci_maxsize > 0 &&
3430	    e->e_msgsize > mci->mci_maxsize)
3431	{
3432		e->e_flags |= EF_NO_BODY_RETN;
3433		if (bitnset(M_LOCALMAILER, m->m_flags))
3434			e->e_status = "5.2.3";
3435		else
3436			e->e_status = "5.3.4";
3437
3438		usrerrenh(e->e_status,
3439			  "552 Message is too large; %ld bytes max",
3440			  mci->mci_maxsize);
3441		rcode = EX_DATAERR;
3442
3443		/* Need an e_message for error */
3444		(void) sm_snprintf(SmtpError, sizeof(SmtpError),
3445				   "Message is too large; %ld bytes max",
3446				   mci->mci_maxsize);
3447		goto give_up;
3448	}
3449#endif /* _FFR_CLIENT_SIZE */
3450
3451	if (mci->mci_state != MCIS_OPEN)
3452	{
3453		/* couldn't open the mailer */
3454		rcode = mci->mci_exitstat;
3455		errno = mci->mci_errno;
3456		SM_SET_H_ERRNO(mci->mci_herrno);
3457		if (rcode == EX_OK)
3458		{
3459			/* shouldn't happen */
3460			syserr("554 5.3.5 deliver: mci=%lx rcode=%d errno=%d state=%d sig=%s",
3461			       (unsigned long) mci, rcode, errno,
3462			       mci->mci_state, firstsig);
3463			mci_dump_all(smioout, true);
3464			rcode = EX_SOFTWARE;
3465		}
3466		else if (nummxhosts > hostnum)
3467		{
3468			/* try next MX site */
3469			goto tryhost;
3470		}
3471	}
3472	else if (!clever)
3473	{
3474		bool ok;
3475
3476		/*
3477		**  Format and send message.
3478		*/
3479
3480		rcode = EX_OK;
3481		errno = 0;
3482		ok = putfromline(mci, e);
3483		if (ok)
3484			ok = (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER);
3485		if (ok)
3486			ok = (*e->e_putbody)(mci, e, NULL);
3487		if (ok && bitset(MCIF_INLONGLINE, mci->mci_flags))
3488			ok = putline("", mci);
3489
3490		/*
3491		**  Ignore an I/O error that was caused by EPIPE.
3492		**  Some broken mailers don't read the entire body
3493		**  but just exit() thus causing an I/O error.
3494		*/
3495
3496		if (!ok && (sm_io_error(mci->mci_out) && errno == EPIPE))
3497			ok = true;
3498
3499		/* (always) get the exit status */
3500		rcode = endmailer(mci, e, pv);
3501		if (!ok)
3502			rcode = EX_TEMPFAIL;
3503		if (rcode == EX_TEMPFAIL && SmtpError[0] == '\0')
3504		{
3505			/*
3506			**  Need an e_message for mailq display.
3507			**  We set SmtpError as
3508			*/
3509
3510			(void) sm_snprintf(SmtpError, sizeof(SmtpError),
3511					   "%s mailer (%s) exited with EX_TEMPFAIL",
3512					   m->m_name, m->m_mailer);
3513		}
3514	}
3515	else
3516	{
3517		/*
3518		**  Send the MAIL FROM: protocol
3519		*/
3520
3521		/* XXX this isn't pipelined... */
3522		rcode = smtpmailfrom(m, mci, e);
3523		if (rcode == EX_OK)
3524		{
3525			register int i;
3526#if PIPELINING
3527			ADDRESS *volatile pchain;
3528#endif
3529
3530			/* send the recipient list */
3531			tobuf[0] = '\0';
3532			mci->mci_retryrcpt = false;
3533			mci->mci_tolist = tobuf;
3534#if PIPELINING
3535			pchain = NULL;
3536			mci->mci_nextaddr = NULL;
3537#endif
3538
3539			for (to = tochain; to != NULL; to = to->q_tchain)
3540			{
3541				if (!QS_IS_UNMARKED(to->q_state))
3542					continue;
3543
3544				/* mark recipient state as "ok so far" */
3545				to->q_state = QS_OK;
3546				e->e_to = to->q_paddr;
3547#if STARTTLS
3548				i = rscheck("tls_rcpt", to->q_user, NULL, e,
3549					    RSF_RMCOMM|RSF_COUNT, 3,
3550					    mci->mci_host, e->e_id, NULL, NULL);
3551				if (i != EX_OK)
3552				{
3553					markfailure(e, to, mci, i, false);
3554					giveresponse(i, to->q_status,  m, mci,
3555						     ctladdr, xstart, e, to);
3556					if (i == EX_TEMPFAIL)
3557					{
3558						mci->mci_retryrcpt = true;
3559						to->q_state = QS_RETRY;
3560					}
3561					continue;
3562				}
3563#endif /* STARTTLS */
3564
3565				i = smtprcpt(to, m, mci, e, ctladdr, xstart);
3566#if PIPELINING
3567				if (i == EX_OK &&
3568				    bitset(MCIF_PIPELINED, mci->mci_flags))
3569				{
3570					/*
3571					**  Add new element to list of
3572					**  recipients for pipelining.
3573					*/
3574
3575					to->q_pchain = NULL;
3576					if (mci->mci_nextaddr == NULL)
3577						mci->mci_nextaddr = to;
3578					if (pchain == NULL)
3579						pchain = to;
3580					else
3581					{
3582						pchain->q_pchain = to;
3583						pchain = pchain->q_pchain;
3584					}
3585				}
3586#endif /* PIPELINING */
3587				if (i != EX_OK)
3588				{
3589					markfailure(e, to, mci, i, false);
3590					giveresponse(i, to->q_status, m, mci,
3591						     ctladdr, xstart, e, to);
3592					if (i == EX_TEMPFAIL)
3593						to->q_state = QS_RETRY;
3594				}
3595			}
3596
3597			/* No recipients in list and no missing responses? */
3598			if (tobuf[0] == '\0'
3599#if PIPELINING
3600			    && bitset(MCIF_PIPELINED, mci->mci_flags)
3601			    && mci->mci_nextaddr == NULL
3602#endif
3603			   )
3604			{
3605				rcode = EX_OK;
3606				e->e_to = NULL;
3607				if (bitset(MCIF_CACHED, mci->mci_flags))
3608					smtprset(m, mci, e);
3609			}
3610			else
3611			{
3612				e->e_to = tobuf + 1;
3613				rcode = smtpdata(m, mci, e, ctladdr, xstart);
3614			}
3615		}
3616		if (rcode == EX_TEMPFAIL && nummxhosts > hostnum)
3617		{
3618			/* try next MX site */
3619			goto tryhost;
3620		}
3621	}
3622#if NAMED_BIND
3623	if (ConfigLevel < 2)
3624		_res.options |= RES_DEFNAMES | RES_DNSRCH;	/* XXX */
3625#endif
3626
3627	if (tTd(62, 1))
3628		checkfds("after delivery");
3629
3630	/*
3631	**  Do final status disposal.
3632	**	We check for something in tobuf for the SMTP case.
3633	**	If we got a temporary failure, arrange to queue the
3634	**		addressees.
3635	*/
3636
3637  give_up:
3638	if (bitnset(M_LMTP, m->m_flags))
3639	{
3640		lmtp_rcode = rcode;
3641		tobuf[0] = '\0';
3642		anyok = false;
3643		strsize = 0;
3644	}
3645	else
3646		anyok = rcode == EX_OK;
3647
3648	for (to = tochain; to != NULL; to = to->q_tchain)
3649	{
3650		/* see if address already marked */
3651		if (!QS_IS_OK(to->q_state))
3652			continue;
3653
3654		/* if running LMTP, get the status for each address */
3655		if (bitnset(M_LMTP, m->m_flags))
3656		{
3657			if (lmtp_rcode == EX_OK)
3658				rcode = smtpgetstat(m, mci, e);
3659			if (rcode == EX_OK)
3660			{
3661				strsize += sm_strlcat2(tobuf + strsize, ",",
3662						to->q_paddr,
3663						tobufsize - strsize);
3664				SM_ASSERT(strsize < tobufsize);
3665				anyok = true;
3666			}
3667			else
3668			{
3669				e->e_to = to->q_paddr;
3670				markfailure(e, to, mci, rcode, true);
3671				giveresponse(rcode, to->q_status, m, mci,
3672					     ctladdr, xstart, e, to);
3673				e->e_to = tobuf + 1;
3674				continue;
3675			}
3676		}
3677		else
3678		{
3679			/* mark bad addresses */
3680			if (rcode != EX_OK)
3681			{
3682				if (goodmxfound && rcode == EX_NOHOST)
3683					rcode = EX_TEMPFAIL;
3684				markfailure(e, to, mci, rcode, true);
3685				continue;
3686			}
3687		}
3688
3689		/* successful delivery */
3690		to->q_state = QS_SENT;
3691		to->q_statdate = curtime();
3692		e->e_nsent++;
3693
3694		/*
3695		**  Checkpoint the send list every few addresses
3696		*/
3697
3698		if (CheckpointInterval > 0 && e->e_nsent >= CheckpointInterval)
3699		{
3700			queueup(e, false, false);
3701			e->e_nsent = 0;
3702		}
3703
3704		if (bitnset(M_LOCALMAILER, m->m_flags) &&
3705		    bitset(QPINGONSUCCESS, to->q_flags))
3706		{
3707			to->q_flags |= QDELIVERED;
3708			to->q_status = "2.1.5";
3709			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT,
3710					     "%s... Successfully delivered\n",
3711					     to->q_paddr);
3712		}
3713		else if (bitset(QPINGONSUCCESS, to->q_flags) &&
3714			 bitset(QPRIMARY, to->q_flags) &&
3715			 !bitset(MCIF_DSN, mci->mci_flags))
3716		{
3717			to->q_flags |= QRELAYED;
3718			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT,
3719					     "%s... relayed; expect no further notifications\n",
3720					     to->q_paddr);
3721		}
3722		else if (IS_DLVR_NOTIFY(e) &&
3723			 !bitset(MCIF_DLVR_BY, mci->mci_flags) &&
3724			 bitset(QPRIMARY, to->q_flags) &&
3725			 (!bitset(QHASNOTIFY, to->q_flags) ||
3726			  bitset(QPINGONSUCCESS, to->q_flags) ||
3727			  bitset(QPINGONFAILURE, to->q_flags) ||
3728			  bitset(QPINGONDELAY, to->q_flags)))
3729		{
3730			/* RFC 2852, 4.1.4.2: no NOTIFY, or not NEVER */
3731			to->q_flags |= QBYNRELAY;
3732			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT,
3733					     "%s... Deliver-by notify: relayed\n",
3734					     to->q_paddr);
3735		}
3736		else if (IS_DLVR_TRACE(e) &&
3737			 (!bitset(QHASNOTIFY, to->q_flags) ||
3738			  bitset(QPINGONSUCCESS, to->q_flags) ||
3739			  bitset(QPINGONFAILURE, to->q_flags) ||
3740			  bitset(QPINGONDELAY, to->q_flags)) &&
3741			 bitset(QPRIMARY, to->q_flags))
3742		{
3743			/* RFC 2852, 4.1.4: no NOTIFY, or not NEVER */
3744			to->q_flags |= QBYTRACE;
3745			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT,
3746					     "%s... Deliver-By trace: relayed\n",
3747					     to->q_paddr);
3748		}
3749	}
3750
3751	if (bitnset(M_LMTP, m->m_flags))
3752	{
3753		/*
3754		**  Global information applies to the last recipient only;
3755		**  clear it out to avoid bogus errors.
3756		*/
3757
3758		rcode = EX_OK;
3759		e->e_statmsg = NULL;
3760
3761		/* reset the mci state for the next transaction */
3762		if (mci != NULL &&
3763		    (mci->mci_state == MCIS_MAIL ||
3764		     mci->mci_state == MCIS_RCPT ||
3765		     mci->mci_state == MCIS_DATA))
3766		{
3767			mci->mci_state = MCIS_OPEN;
3768			SmtpPhase = mci->mci_phase = "idle";
3769			sm_setproctitle(true, e, "%s: %s", CurHostName,
3770					mci->mci_phase);
3771		}
3772	}
3773
3774	if (tobuf[0] != '\0')
3775	{
3776		giveresponse(rcode, NULL, m, mci, ctladdr, xstart, e, NULL);
3777#if 0
3778		/*
3779		**  This code is disabled for now because I am not
3780		**  sure that copying status from the first recipient
3781		**  to all non-status'ed recipients is a good idea.
3782		*/
3783
3784		if (tochain->q_message != NULL &&
3785		    !bitnset(M_LMTP, m->m_flags) && rcode != EX_OK)
3786		{
3787			for (to = tochain->q_tchain; to != NULL;
3788			     to = to->q_tchain)
3789			{
3790				/* see if address already marked */
3791				if (QS_IS_QUEUEUP(to->q_state) &&
3792				    to->q_message == NULL)
3793					to->q_message = sm_rpool_strdup_x(e->e_rpool,
3794							tochain->q_message);
3795			}
3796		}
3797#endif /* 0 */
3798	}
3799	if (anyok)
3800		markstats(e, tochain, STATS_NORMAL);
3801	mci_store_persistent(mci);
3802
3803#if _FFR_OCC
3804	/*
3805	**  HACK: this is NOT the right place to "close" a connection!
3806	**  use smtpquit?
3807	**  add a flag to mci to indicate that rate/conc. was increased?
3808	*/
3809
3810	if (clever)
3811	{
3812		extern SOCKADDR CurHostAddr;
3813
3814		/* check family... {} */
3815		/* r = anynet_pton(AF_INET, p, dst); */
3816		occ_close(e, mci, host, &CurHostAddr);
3817	}
3818#endif /* _FFR_OCC */
3819
3820	/* Some recipients were tempfailed, try them on the next host */
3821	if (mci != NULL && mci->mci_retryrcpt && nummxhosts > hostnum)
3822	{
3823		/* try next MX site */
3824		goto tryhost;
3825	}
3826
3827	/* now close the connection */
3828	if (clever && mci != NULL && mci->mci_state != MCIS_CLOSED &&
3829	    !bitset(MCIF_CACHED, mci->mci_flags))
3830		smtpquit(m, mci, e);
3831
3832cleanup: ;
3833	}
3834	SM_FINALLY
3835	{
3836		/*
3837		**  Restore state and return.
3838		*/
3839#if XDEBUG
3840		char wbuf[MAXLINE];
3841
3842		/* make absolutely certain 0, 1, and 2 are in use */
3843		(void) sm_snprintf(wbuf, sizeof(wbuf),
3844				   "%s... end of deliver(%s)",
3845				   e->e_to == NULL ? "NO-TO-LIST"
3846						   : shortenstring(e->e_to,
3847								   MAXSHORTSTR),
3848				  m->m_name);
3849		checkfd012(wbuf);
3850#endif /* XDEBUG */
3851
3852		errno = 0;
3853
3854		/*
3855		**  It was originally necessary to set macro 'g' to NULL
3856		**  because it previously pointed to an auto buffer.
3857		**  We don't do this any more, so this may be unnecessary.
3858		*/
3859
3860		macdefine(&e->e_macro, A_PERM, 'g', (char *) NULL);
3861		e->e_to = NULL;
3862	}
3863	SM_END_TRY
3864	return rcode;
3865}
3866
3867/*
3868**  MARKFAILURE -- mark a failure on a specific address.
3869**
3870**	Parameters:
3871**		e -- the envelope we are sending.
3872**		q -- the address to mark.
3873**		mci -- mailer connection information.
3874**		rcode -- the code signifying the particular failure.
3875**		ovr -- override an existing code?
3876**
3877**	Returns:
3878**		none.
3879**
3880**	Side Effects:
3881**		marks the address (and possibly the envelope) with the
3882**			failure so that an error will be returned or
3883**			the message will be queued, as appropriate.
3884*/
3885
3886void
3887markfailure(e, q, mci, rcode, ovr)
3888	register ENVELOPE *e;
3889	register ADDRESS *q;
3890	register MCI *mci;
3891	int rcode;
3892	bool ovr;
3893{
3894	int save_errno = errno;
3895	char *status = NULL;
3896	char *rstatus = NULL;
3897
3898	switch (rcode)
3899	{
3900	  case EX_OK:
3901		break;
3902
3903	  case EX_TEMPFAIL:
3904	  case EX_IOERR:
3905	  case EX_OSERR:
3906		q->q_state = QS_QUEUEUP;
3907		break;
3908
3909	  default:
3910		q->q_state = QS_BADADDR;
3911		break;
3912	}
3913
3914	/* find most specific error code possible */
3915	if (mci != NULL && mci->mci_status != NULL)
3916	{
3917		status = sm_rpool_strdup_x(e->e_rpool, mci->mci_status);
3918		if (mci->mci_rstatus != NULL)
3919			rstatus = sm_rpool_strdup_x(e->e_rpool,
3920						    mci->mci_rstatus);
3921	}
3922	else if (e->e_status != NULL)
3923	{
3924		status = e->e_status;
3925	}
3926	else
3927	{
3928		switch (rcode)
3929		{
3930		  case EX_USAGE:
3931			status = "5.5.4";
3932			break;
3933
3934		  case EX_DATAERR:
3935			status = "5.5.2";
3936			break;
3937
3938		  case EX_NOUSER:
3939			status = "5.1.1";
3940			break;
3941
3942		  case EX_NOHOST:
3943			status = "5.1.2";
3944			break;
3945
3946		  case EX_NOINPUT:
3947		  case EX_CANTCREAT:
3948		  case EX_NOPERM:
3949			status = "5.3.0";
3950			break;
3951
3952		  case EX_UNAVAILABLE:
3953		  case EX_SOFTWARE:
3954		  case EX_OSFILE:
3955		  case EX_PROTOCOL:
3956		  case EX_CONFIG:
3957			status = "5.5.0";
3958			break;
3959
3960		  case EX_OSERR:
3961		  case EX_IOERR:
3962			status = "4.5.0";
3963			break;
3964
3965		  case EX_TEMPFAIL:
3966			status = "4.2.0";
3967			break;
3968		}
3969	}
3970
3971	/* new status? */
3972	if (status != NULL && *status != '\0' && (ovr || q->q_status == NULL ||
3973	    *q->q_status == '\0' || *q->q_status < *status))
3974	{
3975		q->q_status = status;
3976		q->q_rstatus = rstatus;
3977	}
3978	if (rcode != EX_OK && q->q_rstatus == NULL &&
3979	    q->q_mailer != NULL && q->q_mailer->m_diagtype != NULL &&
3980	    sm_strcasecmp(q->q_mailer->m_diagtype, "X-UNIX") == 0)
3981	{
3982		char buf[16];
3983
3984		(void) sm_snprintf(buf, sizeof(buf), "%d", rcode);
3985		q->q_rstatus = sm_rpool_strdup_x(e->e_rpool, buf);
3986	}
3987
3988	q->q_statdate = curtime();
3989	if (CurHostName != NULL && CurHostName[0] != '\0' &&
3990	    mci != NULL && !bitset(M_LOCALMAILER, mci->mci_flags))
3991		q->q_statmta = sm_rpool_strdup_x(e->e_rpool, CurHostName);
3992
3993	/* restore errno */
3994	errno = save_errno;
3995}
3996/*
3997**  ENDMAILER -- Wait for mailer to terminate.
3998**
3999**	We should never get fatal errors (e.g., segmentation
4000**	violation), so we report those specially.  For other
4001**	errors, we choose a status message (into statmsg),
4002**	and if it represents an error, we print it.
4003**
4004**	Parameters:
4005**		mci -- the mailer connection info.
4006**		e -- the current envelope.
4007**		pv -- the parameter vector that invoked the mailer
4008**			(for error messages).
4009**
4010**	Returns:
4011**		exit code of mailer.
4012**
4013**	Side Effects:
4014**		none.
4015*/
4016
4017static jmp_buf	EndWaitTimeout;
4018
4019static void
4020endwaittimeout(ignore)
4021	int ignore;
4022{
4023	/*
4024	**  NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER.  DO NOT ADD
4025	**	ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
4026	**	DOING.
4027	*/
4028
4029	errno = ETIMEDOUT;
4030	longjmp(EndWaitTimeout, 1);
4031}
4032
4033int
4034endmailer(mci, e, pv)
4035	register MCI *mci;
4036	register ENVELOPE *e;
4037	char **pv;
4038{
4039	int st;
4040	int save_errno = errno;
4041	char buf[MAXLINE];
4042	SM_EVENT *ev = NULL;
4043
4044
4045	mci_unlock_host(mci);
4046
4047	/* close output to mailer */
4048	if (mci->mci_out != NULL)
4049	{
4050		(void) sm_io_close(mci->mci_out, SM_TIME_DEFAULT);
4051		mci->mci_out = NULL;
4052	}
4053
4054	/* copy any remaining input to transcript */
4055	if (mci->mci_in != NULL && mci->mci_state != MCIS_ERROR &&
4056	    e->e_xfp != NULL)
4057	{
4058		while (sfgets(buf, sizeof(buf), mci->mci_in,
4059			      TimeOuts.to_quit, "Draining Input") != NULL)
4060			(void) sm_io_fputs(e->e_xfp, SM_TIME_DEFAULT, buf);
4061	}
4062
4063#if SASL
4064	/* close SASL connection */
4065	if (bitset(MCIF_AUTHACT, mci->mci_flags))
4066	{
4067		sasl_dispose(&mci->mci_conn);
4068		mci->mci_flags &= ~MCIF_AUTHACT;
4069	}
4070#endif /* SASL */
4071
4072#if STARTTLS
4073	/* shutdown TLS */
4074	(void) endtlsclt(mci);
4075#endif
4076
4077	/* now close the input */
4078	if (mci->mci_in != NULL)
4079	{
4080		(void) sm_io_close(mci->mci_in, SM_TIME_DEFAULT);
4081		mci->mci_in = NULL;
4082	}
4083	mci->mci_state = MCIS_CLOSED;
4084
4085	errno = save_errno;
4086
4087	/* in the IPC case there is nothing to wait for */
4088	if (mci->mci_pid == 0)
4089		return EX_OK;
4090
4091	/* put a timeout around the wait */
4092	if (mci->mci_mailer->m_wait > 0)
4093	{
4094		if (setjmp(EndWaitTimeout) == 0)
4095			ev = sm_setevent(mci->mci_mailer->m_wait,
4096					 endwaittimeout, 0);
4097		else
4098		{
4099			syserr("endmailer %s: wait timeout (%ld)",
4100			       mci->mci_mailer->m_name,
4101			       (long) mci->mci_mailer->m_wait);
4102			return EX_TEMPFAIL;
4103		}
4104	}
4105
4106	/* wait for the mailer process, collect status */
4107	st = waitfor(mci->mci_pid);
4108	save_errno = errno;
4109	if (ev != NULL)
4110		sm_clrevent(ev);
4111	errno = save_errno;
4112
4113	if (st == -1)
4114	{
4115		syserr("endmailer %s: wait", mci->mci_mailer->m_name);
4116		return EX_SOFTWARE;
4117	}
4118
4119	if (WIFEXITED(st))
4120	{
4121		/* normal death -- return status */
4122		return (WEXITSTATUS(st));
4123	}
4124
4125	/* it died a horrid death */
4126	syserr("451 4.3.0 mailer %s died with signal %d%s",
4127		mci->mci_mailer->m_name, WTERMSIG(st),
4128		WCOREDUMP(st) ? " (core dumped)" :
4129		(WIFSTOPPED(st) ? " (stopped)" : ""));
4130
4131	/* log the arguments */
4132	if (pv != NULL && e->e_xfp != NULL)
4133	{
4134		register char **av;
4135
4136		(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, "Arguments:");
4137		for (av = pv; *av != NULL; av++)
4138			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, " %s",
4139					     *av);
4140		(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, "\n");
4141	}
4142
4143	ExitStat = EX_TEMPFAIL;
4144	return EX_TEMPFAIL;
4145}
4146/*
4147**  GIVERESPONSE -- Interpret an error response from a mailer
4148**
4149**	Parameters:
4150**		status -- the status code from the mailer (high byte
4151**			only; core dumps must have been taken care of
4152**			already).
4153**		dsn -- the DSN associated with the address, if any.
4154**		m -- the mailer info for this mailer.
4155**		mci -- the mailer connection info -- can be NULL if the
4156**			response is given before the connection is made.
4157**		ctladdr -- the controlling address for the recipient
4158**			address(es).
4159**		xstart -- the transaction start time, for computing
4160**			transaction delays.
4161**		e -- the current envelope.
4162**		to -- the current recipient (NULL if none).
4163**
4164**	Returns:
4165**		none.
4166**
4167**	Side Effects:
4168**		Errors may be incremented.
4169**		ExitStat may be set.
4170*/
4171
4172void
4173giveresponse(status, dsn, m, mci, ctladdr, xstart, e, to)
4174	int status;
4175	char *dsn;
4176	register MAILER *m;
4177	register MCI *mci;
4178	ADDRESS *ctladdr;
4179	time_t xstart;
4180	ENVELOPE *e;
4181	ADDRESS *to;
4182{
4183	register const char *statmsg;
4184	int errnum = errno;
4185	int off = 4;
4186	bool usestat = false;
4187	char dsnbuf[ENHSCLEN];
4188	char buf[MAXLINE];
4189	char *exmsg;
4190
4191	if (e == NULL)
4192	{
4193		syserr("giveresponse: null envelope");
4194		/* NOTREACHED */
4195		SM_ASSERT(0);
4196	}
4197
4198	/*
4199	**  Compute status message from code.
4200	*/
4201
4202	exmsg = sm_sysexmsg(status);
4203	if (status == 0)
4204	{
4205		statmsg = "250 2.0.0 Sent";
4206		if (e->e_statmsg != NULL)
4207		{
4208			(void) sm_snprintf(buf, sizeof(buf), "%s (%s)",
4209					   statmsg,
4210					   shortenstring(e->e_statmsg, 403));
4211			statmsg = buf;
4212		}
4213	}
4214	else if (exmsg == NULL)
4215	{
4216		(void) sm_snprintf(buf, sizeof(buf),
4217				   "554 5.3.0 unknown mailer error %d",
4218				   status);
4219		status = EX_UNAVAILABLE;
4220		statmsg = buf;
4221		usestat = true;
4222	}
4223	else if (status == EX_TEMPFAIL)
4224	{
4225		char *bp = buf;
4226
4227		(void) sm_strlcpy(bp, exmsg + 1, SPACELEFT(buf, bp));
4228		bp += strlen(bp);
4229#if NAMED_BIND
4230		if (h_errno == TRY_AGAIN)
4231			statmsg = sm_errstring(h_errno + E_DNSBASE);
4232		else
4233#endif /* NAMED_BIND */
4234		{
4235			if (errnum != 0)
4236				statmsg = sm_errstring(errnum);
4237			else
4238				statmsg = SmtpError;
4239		}
4240		if (statmsg != NULL && statmsg[0] != '\0')
4241		{
4242			switch (errnum)
4243			{
4244#ifdef ENETDOWN
4245			  case ENETDOWN:	/* Network is down */
4246#endif
4247#ifdef ENETUNREACH
4248			  case ENETUNREACH:	/* Network is unreachable */
4249#endif
4250#ifdef ENETRESET
4251			  case ENETRESET:	/* Network dropped connection on reset */
4252#endif
4253#ifdef ECONNABORTED
4254			  case ECONNABORTED:	/* Software caused connection abort */
4255#endif
4256#ifdef EHOSTDOWN
4257			  case EHOSTDOWN:	/* Host is down */
4258#endif
4259#ifdef EHOSTUNREACH
4260			  case EHOSTUNREACH:	/* No route to host */
4261#endif
4262				if (mci != NULL && mci->mci_host != NULL)
4263				{
4264					(void) sm_strlcpyn(bp,
4265							   SPACELEFT(buf, bp),
4266							   2, ": ",
4267							   mci->mci_host);
4268					bp += strlen(bp);
4269				}
4270				break;
4271			}
4272			(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ": ",
4273					   statmsg);
4274#if DANE
4275			if (errnum == 0 && SmtpError[0] != '\0' &&
4276			    h_errno == TRY_AGAIN &&
4277			    mci->mci_exitstat == EX_TEMPFAIL)
4278			{
4279				(void) sm_strlcat(bp, SmtpError,
4280					SPACELEFT(buf, bp));
4281				bp += strlen(bp);
4282			}
4283#endif /* DANE */
4284			usestat = true;
4285		}
4286		statmsg = buf;
4287	}
4288#if NAMED_BIND
4289	else if (status == EX_NOHOST && h_errno != 0)
4290	{
4291		statmsg = sm_errstring(h_errno + E_DNSBASE);
4292		(void) sm_snprintf(buf, sizeof(buf), "%s (%s)", exmsg + 1,
4293				   statmsg);
4294		statmsg = buf;
4295		usestat = true;
4296	}
4297#endif /* NAMED_BIND */
4298	else
4299	{
4300		statmsg = exmsg;
4301		if (*statmsg++ == ':' && errnum != 0)
4302		{
4303			(void) sm_snprintf(buf, sizeof(buf), "%s: %s", statmsg,
4304					   sm_errstring(errnum));
4305			statmsg = buf;
4306			usestat = true;
4307		}
4308		else if (bitnset(M_LMTP, m->m_flags) && e->e_statmsg != NULL)
4309		{
4310			(void) sm_snprintf(buf, sizeof(buf), "%s (%s)", statmsg,
4311					   shortenstring(e->e_statmsg, 403));
4312			statmsg = buf;
4313			usestat = true;
4314		}
4315	}
4316
4317	/*
4318	**  Print the message as appropriate
4319	*/
4320
4321	if (status == EX_OK || status == EX_TEMPFAIL)
4322	{
4323		extern char MsgBuf[];
4324
4325		if ((off = isenhsc(statmsg + 4, ' ')) > 0)
4326		{
4327			if (dsn == NULL)
4328			{
4329				(void) sm_snprintf(dsnbuf, sizeof(dsnbuf),
4330						   "%.*s", off, statmsg + 4);
4331				dsn = dsnbuf;
4332			}
4333			off += 5;
4334		}
4335		else
4336		{
4337			off = 4;
4338		}
4339		message("%s", statmsg + off);
4340		if (status == EX_TEMPFAIL && e->e_xfp != NULL)
4341			(void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, "%s\n",
4342					     &MsgBuf[4]);
4343	}
4344	else
4345	{
4346		char mbuf[ENHSCLEN + 4];
4347
4348		Errors++;
4349		if ((off = isenhsc(statmsg + 4, ' ')) > 0 &&
4350		    off < sizeof(mbuf) - 4)
4351		{
4352			if (dsn == NULL)
4353			{
4354				(void) sm_snprintf(dsnbuf, sizeof(dsnbuf),
4355						   "%.*s", off, statmsg + 4);
4356				dsn = dsnbuf;
4357			}
4358			off += 5;
4359
4360			/* copy only part of statmsg to mbuf */
4361			(void) sm_strlcpy(mbuf, statmsg, off);
4362			(void) sm_strlcat(mbuf, " %s", sizeof(mbuf));
4363		}
4364		else
4365		{
4366			dsnbuf[0] = '\0';
4367			(void) sm_snprintf(mbuf, sizeof(mbuf), "%.3s %%s",
4368					   statmsg);
4369			off = 4;
4370		}
4371		usrerr(mbuf, &statmsg[off]);
4372	}
4373
4374	/*
4375	**  Final cleanup.
4376	**	Log a record of the transaction.  Compute the new ExitStat
4377	**	-- if we already had an error, stick with that.
4378	*/
4379
4380	if (OpMode != MD_VERIFY && !bitset(EF_VRFYONLY, e->e_flags) &&
4381	    LogLevel > ((status == EX_TEMPFAIL) ? 8 : (status == EX_OK) ? 7 : 6))
4382		logdelivery(m, mci, dsn, statmsg + off, ctladdr, xstart, e, to, status);
4383
4384	if (tTd(11, 2))
4385		sm_dprintf("giveresponse: status=%d, dsn=%s, e->e_message=%s, errnum=%d\n",
4386			   status,
4387			   dsn == NULL ? "<NULL>" : dsn,
4388			   e->e_message == NULL ? "<NULL>" : e->e_message,
4389			   errnum);
4390
4391	if (status != EX_TEMPFAIL)
4392		setstat(status);
4393	if (status != EX_OK && (status != EX_TEMPFAIL || e->e_message == NULL))
4394		e->e_message = sm_rpool_strdup_x(e->e_rpool, statmsg + off);
4395	if (status != EX_OK && to != NULL && to->q_message == NULL)
4396	{
4397		if (!usestat && e->e_message != NULL)
4398			to->q_message = sm_rpool_strdup_x(e->e_rpool,
4399							  e->e_message);
4400		else
4401			to->q_message = sm_rpool_strdup_x(e->e_rpool,
4402							  statmsg + off);
4403	}
4404	errno = 0;
4405	SM_SET_H_ERRNO(0);
4406}
4407/*
4408**  LOGDELIVERY -- log the delivery in the system log
4409**
4410**	Care is taken to avoid logging lines that are too long, because
4411**	some versions of syslog have an unfortunate proclivity for core
4412**	dumping.  This is a hack, to be sure, that is at best empirical.
4413**
4414**	Parameters:
4415**		m -- the mailer info.  Can be NULL for initial queue.
4416**		mci -- the mailer connection info -- can be NULL if the
4417**			log is occurring when no connection is active.
4418**		dsn -- the DSN attached to the status.
4419**		status -- the message to print for the status.
4420**		ctladdr -- the controlling address for the to list.
4421**		xstart -- the transaction start time, used for
4422**			computing transaction delay.
4423**		e -- the current envelope.
4424**		to -- the current recipient (NULL if none).
4425**		rcode -- status code
4426**
4427**	Returns:
4428**		none
4429**
4430**	Side Effects:
4431**		none
4432*/
4433
4434void
4435logdelivery(m, mci, dsn, status, ctladdr, xstart, e, to, rcode)
4436	MAILER *m;
4437	register MCI *mci;
4438	char *dsn;
4439	const char *status;
4440	ADDRESS *ctladdr;
4441	time_t xstart;
4442	register ENVELOPE *e;
4443	ADDRESS *to;
4444	int rcode;
4445{
4446	register char *bp;
4447	register char *p;
4448	int l;
4449	time_t now = curtime();
4450	char buf[1024];
4451
4452#if (SYSLOG_BUFSIZE) >= 256
4453	/* ctladdr: max 106 bytes */
4454	bp = buf;
4455	if (ctladdr != NULL)
4456	{
4457		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", ctladdr=",
4458				   shortenstring(ctladdr->q_paddr, 83));
4459		bp += strlen(bp);
4460		if (bitset(QGOODUID, ctladdr->q_flags))
4461		{
4462			(void) sm_snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)",
4463					   (int) ctladdr->q_uid,
4464					   (int) ctladdr->q_gid);
4465			bp += strlen(bp);
4466		}
4467	}
4468
4469	/* delay & xdelay: max 41 bytes */
4470	(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", delay=",
4471			   pintvl(now - e->e_ctime, true));
4472	bp += strlen(bp);
4473
4474	if (xstart != (time_t) 0)
4475	{
4476		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", xdelay=",
4477				   pintvl(now - xstart, true));
4478		bp += strlen(bp);
4479	}
4480
4481	/* mailer: assume about 19 bytes (max 10 byte mailer name) */
4482	if (m != NULL)
4483	{
4484		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", mailer=",
4485				   m->m_name);
4486		bp += strlen(bp);
4487	}
4488
4489# if _FFR_LOG_MORE2
4490	LOG_MORE(buf, bp);
4491# endif
4492
4493	/* pri: changes with each delivery attempt */
4494	(void) sm_snprintf(bp, SPACELEFT(buf, bp), ", pri=%ld",
4495		PRT_NONNEGL(e->e_msgpriority));
4496	bp += strlen(bp);
4497
4498	/* relay: max 66 bytes for IPv4 addresses */
4499	if (mci != NULL && mci->mci_host != NULL)
4500	{
4501		extern SOCKADDR CurHostAddr;
4502
4503		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", relay=",
4504				   shortenstring(mci->mci_host, 40));
4505		bp += strlen(bp);
4506
4507		if (CurHostAddr.sa.sa_family != 0)
4508		{
4509			(void) sm_snprintf(bp, SPACELEFT(buf, bp), " [%s]",
4510					   anynet_ntoa(&CurHostAddr));
4511		}
4512	}
4513	else if (strcmp(status, "quarantined") == 0)
4514	{
4515		if (e->e_quarmsg != NULL)
4516			(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4517					   ", quarantine=%s",
4518					   shortenstring(e->e_quarmsg, 40));
4519	}
4520	else if (strcmp(status, "queued") != 0)
4521	{
4522		p = macvalue('h', e);
4523		if (p != NULL && p[0] != '\0')
4524		{
4525			(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4526					   ", relay=%s", shortenstring(p, 40));
4527		}
4528	}
4529	bp += strlen(bp);
4530
4531	/* dsn */
4532	if (dsn != NULL && *dsn != '\0')
4533	{
4534		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", dsn=",
4535				   shortenstring(dsn, ENHSCLEN));
4536		bp += strlen(bp);
4537	}
4538
4539# if _FFR_LOG_NTRIES
4540	/* ntries */
4541	if (e->e_ntries >= 0)
4542	{
4543		(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4544				   ", ntries=%d", e->e_ntries + 1);
4545		bp += strlen(bp);
4546	}
4547# endif /* _FFR_LOG_NTRIES */
4548
4549# define STATLEN		(((SYSLOG_BUFSIZE) - 100) / 4)
4550# if (STATLEN) < 63
4551#  undef STATLEN
4552#  define STATLEN	63
4553# endif /* (STATLEN) < 63 */
4554# if (STATLEN) > 203
4555#  undef STATLEN
4556#  define STATLEN	203
4557# endif /* (STATLEN) > 203 */
4558
4559	/*
4560	**  Notes:
4561	**  per-rcpt status: to->q_rstatus
4562	**  global status: e->e_text
4563	**
4564	**  We (re)use STATLEN here, is that a good choice?
4565	**
4566	**  stat=Deferred: ...
4567	**  has sometimes the same text?
4568	**
4569	**  Note: this doesn't show the stage at which the error happened.
4570	**  can/should we log that?
4571	**  XS_* in reply() basically encodes the state.
4572	**
4573	**  Note: in some case the normal logging might show the same server
4574	**  reply - how to avoid that?
4575	*/
4576
4577	/* only show errors */
4578	if (rcode != EX_OK && to != NULL && to->q_rstatus != NULL &&
4579	    *to->q_rstatus != '\0')
4580	{
4581		(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4582			", reply=%s",
4583			shortenstring(to->q_rstatus, STATLEN));
4584		bp += strlen(bp);
4585	}
4586	else if (rcode != EX_OK && e->e_text != NULL)
4587	{
4588		(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4589			", reply=%d %s%s%s",
4590			e->e_rcode,
4591			e->e_renhsc,
4592			(e->e_renhsc[0] != '\0') ? " " : "",
4593			shortenstring(e->e_text, STATLEN));
4594		bp += strlen(bp);
4595	}
4596
4597	/* stat: max 210 bytes */
4598	if ((bp - buf) > (sizeof(buf) - ((STATLEN) + 20)))
4599	{
4600		/* desperation move -- truncate data */
4601		bp = buf + sizeof(buf) - ((STATLEN) + 17);
4602		(void) sm_strlcpy(bp, "...", SPACELEFT(buf, bp));
4603		bp += 3;
4604	}
4605
4606	(void) sm_strlcpy(bp, ", stat=", SPACELEFT(buf, bp));
4607	bp += strlen(bp);
4608
4609	(void) sm_strlcpy(bp, shortenstring(status, STATLEN),
4610			  SPACELEFT(buf, bp));
4611
4612	/* id, to: max 13 + TOBUFSIZE bytes */
4613	l = SYSLOG_BUFSIZE - 100 - strlen(buf);
4614	if (l < 0)
4615		l = 0;
4616	p = e->e_to == NULL ? "NO-TO-LIST" : e->e_to;
4617	while (strlen(p) >= l)
4618	{
4619		register char *q;
4620
4621		for (q = p + l; q > p; q--)
4622		{
4623			/* XXX a comma in an address will break this! */
4624			if (*q == ',')
4625				break;
4626		}
4627		if (p == q)
4628			break;
4629		sm_syslog(LOG_INFO, e->e_id, "to=%.*s [more]%s",
4630			  (int) (++q - p), p, buf);
4631		p = q;
4632	}
4633	sm_syslog(LOG_INFO, e->e_id, "to=%.*s%s", l, p, buf);
4634
4635#else /* (SYSLOG_BUFSIZE) >= 256 */
4636
4637	l = SYSLOG_BUFSIZE - 85;
4638	if (l < 0)
4639		l = 0;
4640	p = e->e_to == NULL ? "NO-TO-LIST" : e->e_to;
4641	while (strlen(p) >= l)
4642	{
4643		register char *q;
4644
4645		for (q = p + l; q > p; q--)
4646		{
4647			if (*q == ',')
4648				break;
4649		}
4650		if (p == q)
4651			break;
4652
4653		sm_syslog(LOG_INFO, e->e_id, "to=%.*s [more]",
4654			  (int) (++q - p), p);
4655		p = q;
4656	}
4657	sm_syslog(LOG_INFO, e->e_id, "to=%.*s", l, p);
4658
4659	if (ctladdr != NULL)
4660	{
4661		bp = buf;
4662		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, "ctladdr=",
4663				   shortenstring(ctladdr->q_paddr, 83));
4664		bp += strlen(bp);
4665		if (bitset(QGOODUID, ctladdr->q_flags))
4666		{
4667			(void) sm_snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)",
4668					   ctladdr->q_uid, ctladdr->q_gid);
4669			bp += strlen(bp);
4670		}
4671		sm_syslog(LOG_INFO, e->e_id, "%s", buf);
4672	}
4673	bp = buf;
4674	(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, "delay=",
4675			   pintvl(now - e->e_ctime, true));
4676	bp += strlen(bp);
4677	if (xstart != (time_t) 0)
4678	{
4679		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", xdelay=",
4680				   pintvl(now - xstart, true));
4681		bp += strlen(bp);
4682	}
4683
4684	if (m != NULL)
4685	{
4686		(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, ", mailer=",
4687				   m->m_name);
4688		bp += strlen(bp);
4689	}
4690	sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf);
4691
4692	buf[0] = '\0';
4693	bp = buf;
4694	if (mci != NULL && mci->mci_host != NULL)
4695	{
4696		extern SOCKADDR CurHostAddr;
4697
4698		(void) sm_snprintf(bp, SPACELEFT(buf, bp), "relay=%.100s",
4699				   mci->mci_host);
4700		bp += strlen(bp);
4701
4702		if (CurHostAddr.sa.sa_family != 0)
4703			(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4704					   " [%.100s]",
4705					   anynet_ntoa(&CurHostAddr));
4706	}
4707	else if (strcmp(status, "quarantined") == 0)
4708	{
4709		if (e->e_quarmsg != NULL)
4710			(void) sm_snprintf(bp, SPACELEFT(buf, bp),
4711					   ", quarantine=%.100s",
4712					   e->e_quarmsg);
4713	}
4714	else if (strcmp(status, "queued") != 0)
4715	{
4716		p = macvalue('h', e);
4717		if (p != NULL && p[0] != '\0')
4718			(void) sm_snprintf(buf, sizeof(buf), "relay=%.100s", p);
4719	}
4720	if (buf[0] != '\0')
4721		sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf);
4722
4723	sm_syslog(LOG_INFO, e->e_id, "stat=%s", shortenstring(status, 63));
4724#endif /* (SYSLOG_BUFSIZE) >= 256 */
4725}
4726/*
4727**  PUTFROMLINE -- output a UNIX-style from line (or whatever)
4728**
4729**	This can be made an arbitrary message separator by changing $l
4730**
4731**	One of the ugliest hacks seen by human eyes is contained herein:
4732**	UUCP wants those stupid "remote from <host>" lines.  Why oh why
4733**	does a well-meaning programmer such as myself have to deal with
4734**	this kind of antique garbage????
4735**
4736**	Parameters:
4737**		mci -- the connection information.
4738**		e -- the envelope.
4739**
4740**	Returns:
4741**		true iff line was written successfully
4742**
4743**	Side Effects:
4744**		outputs some text to fp.
4745*/
4746
4747bool
4748putfromline(mci, e)
4749	register MCI *mci;
4750	ENVELOPE *e;
4751{
4752	char *template = UnixFromLine;
4753	char buf[MAXLINE];
4754	char xbuf[MAXLINE];
4755
4756	if (bitnset(M_NHDR, mci->mci_mailer->m_flags))
4757		return true;
4758
4759	mci->mci_flags |= MCIF_INHEADER;
4760
4761	if (bitnset(M_UGLYUUCP, mci->mci_mailer->m_flags))
4762	{
4763		char *bang;
4764
4765		expand("\201g", buf, sizeof(buf), e);
4766		bang = strchr(buf, '!');
4767		if (bang == NULL)
4768		{
4769			char *at;
4770			char hname[MAXNAME];
4771
4772			/*
4773			**  If we can construct a UUCP path, do so
4774			*/
4775
4776			at = strrchr(buf, '@');
4777			if (at == NULL)
4778			{
4779				expand("\201k", hname, sizeof(hname), e);
4780				at = hname;
4781			}
4782			else
4783				*at++ = '\0';
4784			(void) sm_snprintf(xbuf, sizeof(xbuf),
4785					   "From %.800s  \201d remote from %.100s\n",
4786					   buf, at);
4787		}
4788		else
4789		{
4790			*bang++ = '\0';
4791			(void) sm_snprintf(xbuf, sizeof(xbuf),
4792					   "From %.800s  \201d remote from %.100s\n",
4793					   bang, buf);
4794			template = xbuf;
4795		}
4796	}
4797	expand(template, buf, sizeof(buf), e);
4798	return putxline(buf, strlen(buf), mci, PXLF_HEADER);
4799}
4800
4801/*
4802**  PUTBODY -- put the body of a message.
4803**
4804**	Parameters:
4805**		mci -- the connection information.
4806**		e -- the envelope to put out.
4807**		separator -- if non-NULL, a message separator that must
4808**			not be permitted in the resulting message.
4809**
4810**	Returns:
4811**		true iff message was written successfully
4812**
4813**	Side Effects:
4814**		The message is written onto fp.
4815*/
4816
4817/* values for output state variable */
4818#define OSTATE_HEAD	0	/* at beginning of line */
4819#define OSTATE_CR	1	/* read a carriage return */
4820#define OSTATE_INLINE	2	/* putting rest of line */
4821
4822bool
4823putbody(mci, e, separator)
4824	register MCI *mci;
4825	register ENVELOPE *e;
4826	char *separator;
4827{
4828	bool dead = false;
4829	bool ioerr = false;
4830	int save_errno;
4831	char buf[MAXLINE];
4832#if MIME8TO7
4833	char *boundaries[MAXMIMENESTING + 1];
4834#endif
4835
4836	/*
4837	**  Output the body of the message
4838	*/
4839
4840	if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags))
4841	{
4842		char *df = queuename(e, DATAFL_LETTER);
4843
4844		e->e_dfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, df,
4845				      SM_IO_RDONLY_B, NULL);
4846		if (e->e_dfp == NULL)
4847		{
4848			char *msg = "!putbody: Cannot open %s for %s from %s";
4849
4850			if (errno == ENOENT)
4851				msg++;
4852			syserr(msg, df, e->e_to, e->e_from.q_paddr);
4853		}
4854
4855	}
4856	if (e->e_dfp == NULL)
4857	{
4858		if (bitset(MCIF_INHEADER, mci->mci_flags))
4859		{
4860			if (!putline("", mci))
4861				goto writeerr;
4862			mci->mci_flags &= ~MCIF_INHEADER;
4863		}
4864		if (!putline("<<< No Message Collected >>>", mci))
4865			goto writeerr;
4866		goto endofmessage;
4867	}
4868
4869	if (e->e_dfino == (ino_t) 0)
4870	{
4871		struct stat stbuf;
4872
4873		if (fstat(sm_io_getinfo(e->e_dfp, SM_IO_WHAT_FD, NULL), &stbuf)
4874		    < 0)
4875			e->e_dfino = -1;
4876		else
4877		{
4878			e->e_dfdev = stbuf.st_dev;
4879			e->e_dfino = stbuf.st_ino;
4880		}
4881	}
4882
4883	/* paranoia: the data file should always be in a rewound state */
4884	(void) bfrewind(e->e_dfp);
4885
4886	/* simulate an I/O timeout when used as source */
4887	if (tTd(84, 101))
4888		sleep(319);
4889
4890#if MIME8TO7
4891	if (bitset(MCIF_CVT8TO7, mci->mci_flags))
4892	{
4893		/*
4894		**  Do 8 to 7 bit MIME conversion.
4895		*/
4896
4897		/* make sure it looks like a MIME message */
4898		if (hvalue("MIME-Version", e->e_header) == NULL &&
4899		    !putline("MIME-Version: 1.0", mci))
4900			goto writeerr;
4901
4902		if (hvalue("Content-Type", e->e_header) == NULL)
4903		{
4904			(void) sm_snprintf(buf, sizeof(buf),
4905					   "Content-Type: text/plain; charset=%s",
4906					   defcharset(e));
4907			if (!putline(buf, mci))
4908				goto writeerr;
4909		}
4910
4911		/* now do the hard work */
4912		boundaries[0] = NULL;
4913		mci->mci_flags |= MCIF_INHEADER;
4914		if (mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER, 0) ==
4915								SM_IO_EOF)
4916			goto writeerr;
4917	}
4918# if MIME7TO8
4919	else if (bitset(MCIF_CVT7TO8, mci->mci_flags))
4920	{
4921		if (!mime7to8(mci, e->e_header, e))
4922			goto writeerr;
4923	}
4924# endif /* MIME7TO8 */
4925	else if (MaxMimeHeaderLength > 0 || MaxMimeFieldLength > 0)
4926	{
4927		bool oldsuprerrs = SuprErrs;
4928
4929		/* Use mime8to7 to check multipart for MIME header overflows */
4930		boundaries[0] = NULL;
4931		mci->mci_flags |= MCIF_INHEADER;
4932
4933		/*
4934		**  If EF_DONT_MIME is set, we have a broken MIME message
4935		**  and don't want to generate a new bounce message whose
4936		**  body propagates the broken MIME.  We can't just not call
4937		**  mime8to7() as is done above since we need the security
4938		**  checks.  The best we can do is suppress the errors.
4939		*/
4940
4941		if (bitset(EF_DONT_MIME, e->e_flags))
4942			SuprErrs = true;
4943
4944		if (mime8to7(mci, e->e_header, e, boundaries,
4945				M87F_OUTER|M87F_NO8TO7, 0) == SM_IO_EOF)
4946			goto writeerr;
4947
4948		/* restore SuprErrs */
4949		SuprErrs = oldsuprerrs;
4950	}
4951	else
4952#endif /* MIME8TO7 */
4953	{
4954		int ostate;
4955		register char *bp;
4956		register char *pbp;
4957		register int c;
4958		register char *xp;
4959		int padc;
4960		char *buflim;
4961		int pos = 0;
4962		char peekbuf[12];
4963
4964		if (bitset(MCIF_INHEADER, mci->mci_flags))
4965		{
4966			if (!putline("", mci))
4967				goto writeerr;
4968			mci->mci_flags &= ~MCIF_INHEADER;
4969		}
4970
4971		/* determine end of buffer; allow for short mailer lines */
4972		buflim = &buf[sizeof(buf) - 1];
4973		if (mci->mci_mailer->m_linelimit > 0 &&
4974		    mci->mci_mailer->m_linelimit < sizeof(buf) - 1)
4975			buflim = &buf[mci->mci_mailer->m_linelimit - 1];
4976
4977		/* copy temp file to output with mapping */
4978		ostate = OSTATE_HEAD;
4979		bp = buf;
4980		pbp = peekbuf;
4981		while (!sm_io_error(mci->mci_out) && !dead)
4982		{
4983			if (pbp > peekbuf)
4984				c = *--pbp;
4985			else if ((c = sm_io_getc(e->e_dfp, SM_TIME_DEFAULT))
4986				 == SM_IO_EOF)
4987				break;
4988			if (bitset(MCIF_7BIT, mci->mci_flags))
4989				c &= 0x7f;
4990			switch (ostate)
4991			{
4992			  case OSTATE_HEAD:
4993				if (c == '\0' &&
4994				    bitnset(M_NONULLS,
4995					    mci->mci_mailer->m_flags))
4996					break;
4997				if (c != '\r' && c != '\n' && bp < buflim)
4998				{
4999					*bp++ = c;
5000					break;
5001				}
5002
5003				/* check beginning of line for special cases */
5004				*bp = '\0';
5005				pos = 0;
5006				padc = SM_IO_EOF;
5007				if (buf[0] == 'F' &&
5008				    bitnset(M_ESCFROM, mci->mci_mailer->m_flags)
5009				    && strncmp(buf, "From ", 5) == 0)
5010				{
5011					padc = '>';
5012				}
5013				if (buf[0] == '-' && buf[1] == '-' &&
5014				    separator != NULL)
5015				{
5016					/* possible separator */
5017					int sl = strlen(separator);
5018
5019					if (strncmp(&buf[2], separator, sl)
5020					    == 0)
5021						padc = ' ';
5022				}
5023				if (buf[0] == '.' &&
5024				    bitnset(M_XDOT, mci->mci_mailer->m_flags))
5025				{
5026					padc = '.';
5027				}
5028
5029				/* now copy out saved line */
5030				if (TrafficLogFile != NULL)
5031				{
5032					(void) sm_io_fprintf(TrafficLogFile,
5033							     SM_TIME_DEFAULT,
5034							     "%05d >>> ",
5035							     (int) CurrentPid);
5036					if (padc != SM_IO_EOF)
5037						(void) sm_io_putc(TrafficLogFile,
5038								  SM_TIME_DEFAULT,
5039								  padc);
5040					for (xp = buf; xp < bp; xp++)
5041						(void) sm_io_putc(TrafficLogFile,
5042								  SM_TIME_DEFAULT,
5043								  (unsigned char) *xp);
5044					if (c == '\n')
5045						(void) sm_io_fputs(TrafficLogFile,
5046								   SM_TIME_DEFAULT,
5047								   mci->mci_mailer->m_eol);
5048				}
5049				if (padc != SM_IO_EOF)
5050				{
5051					if (sm_io_putc(mci->mci_out,
5052						       SM_TIME_DEFAULT, padc)
5053					    == SM_IO_EOF)
5054					{
5055						dead = true;
5056						continue;
5057					}
5058					pos++;
5059				}
5060				for (xp = buf; xp < bp; xp++)
5061				{
5062					if (sm_io_putc(mci->mci_out,
5063						       SM_TIME_DEFAULT,
5064						       (unsigned char) *xp)
5065					    == SM_IO_EOF)
5066					{
5067						dead = true;
5068						break;
5069					}
5070				}
5071				if (dead)
5072					continue;
5073				if (c == '\n')
5074				{
5075					if (sm_io_fputs(mci->mci_out,
5076							SM_TIME_DEFAULT,
5077							mci->mci_mailer->m_eol)
5078							== SM_IO_EOF)
5079						break;
5080					pos = 0;
5081				}
5082				else
5083				{
5084					pos += bp - buf;
5085					if (c != '\r')
5086					{
5087						SM_ASSERT(pbp < peekbuf +
5088								sizeof(peekbuf));
5089						*pbp++ = c;
5090					}
5091				}
5092
5093				bp = buf;
5094
5095				/* determine next state */
5096				if (c == '\n')
5097					ostate = OSTATE_HEAD;
5098				else if (c == '\r')
5099					ostate = OSTATE_CR;
5100				else
5101					ostate = OSTATE_INLINE;
5102				continue;
5103
5104			  case OSTATE_CR:
5105				if (c == '\n')
5106				{
5107					/* got CRLF */
5108					if (sm_io_fputs(mci->mci_out,
5109							SM_TIME_DEFAULT,
5110							mci->mci_mailer->m_eol)
5111							== SM_IO_EOF)
5112						continue;
5113
5114					if (TrafficLogFile != NULL)
5115					{
5116						(void) sm_io_fputs(TrafficLogFile,
5117								   SM_TIME_DEFAULT,
5118								   mci->mci_mailer->m_eol);
5119					}
5120					pos = 0;
5121					ostate = OSTATE_HEAD;
5122					continue;
5123				}
5124
5125				/* had a naked carriage return */
5126				SM_ASSERT(pbp < peekbuf + sizeof(peekbuf));
5127				*pbp++ = c;
5128				c = '\r';
5129				ostate = OSTATE_INLINE;
5130				goto putch;
5131
5132			  case OSTATE_INLINE:
5133				if (c == '\r')
5134				{
5135					ostate = OSTATE_CR;
5136					continue;
5137				}
5138				if (c == '\0' &&
5139				    bitnset(M_NONULLS,
5140					    mci->mci_mailer->m_flags))
5141					break;
5142putch:
5143				if (mci->mci_mailer->m_linelimit > 0 &&
5144				    pos >= mci->mci_mailer->m_linelimit - 1 &&
5145				    c != '\n')
5146				{
5147					int d;
5148
5149					/* check next character for EOL */
5150					if (pbp > peekbuf)
5151						d = *(pbp - 1);
5152					else if ((d = sm_io_getc(e->e_dfp,
5153								 SM_TIME_DEFAULT))
5154						 != SM_IO_EOF)
5155					{
5156						SM_ASSERT(pbp < peekbuf +
5157								sizeof(peekbuf));
5158						*pbp++ = d;
5159					}
5160
5161					if (d == '\n' || d == SM_IO_EOF)
5162					{
5163						if (TrafficLogFile != NULL)
5164							(void) sm_io_putc(TrafficLogFile,
5165									  SM_TIME_DEFAULT,
5166									  (unsigned char) c);
5167						if (sm_io_putc(mci->mci_out,
5168							       SM_TIME_DEFAULT,
5169							       (unsigned char) c)
5170							       == SM_IO_EOF)
5171						{
5172							dead = true;
5173							continue;
5174						}
5175						pos++;
5176						continue;
5177					}
5178
5179					if (sm_io_putc(mci->mci_out,
5180						       SM_TIME_DEFAULT, '!')
5181					    == SM_IO_EOF ||
5182					    sm_io_fputs(mci->mci_out,
5183							SM_TIME_DEFAULT,
5184							mci->mci_mailer->m_eol)
5185					    == SM_IO_EOF)
5186					{
5187						dead = true;
5188						continue;
5189					}
5190
5191					if (TrafficLogFile != NULL)
5192					{
5193						(void) sm_io_fprintf(TrafficLogFile,
5194								     SM_TIME_DEFAULT,
5195								     "!%s",
5196								     mci->mci_mailer->m_eol);
5197					}
5198					ostate = OSTATE_HEAD;
5199					SM_ASSERT(pbp < peekbuf +
5200							sizeof(peekbuf));
5201					*pbp++ = c;
5202					continue;
5203				}
5204				if (c == '\n')
5205				{
5206					if (TrafficLogFile != NULL)
5207						(void) sm_io_fputs(TrafficLogFile,
5208								   SM_TIME_DEFAULT,
5209								   mci->mci_mailer->m_eol);
5210					if (sm_io_fputs(mci->mci_out,
5211							SM_TIME_DEFAULT,
5212							mci->mci_mailer->m_eol)
5213							== SM_IO_EOF)
5214						continue;
5215					pos = 0;
5216					ostate = OSTATE_HEAD;
5217				}
5218				else
5219				{
5220					if (TrafficLogFile != NULL)
5221						(void) sm_io_putc(TrafficLogFile,
5222								  SM_TIME_DEFAULT,
5223								  (unsigned char) c);
5224					if (sm_io_putc(mci->mci_out,
5225						       SM_TIME_DEFAULT,
5226						       (unsigned char) c)
5227					    == SM_IO_EOF)
5228					{
5229						dead = true;
5230						continue;
5231					}
5232					pos++;
5233					ostate = OSTATE_INLINE;
5234				}
5235				break;
5236			}
5237		}
5238
5239		/* make sure we are at the beginning of a line */
5240		if (bp > buf)
5241		{
5242			if (TrafficLogFile != NULL)
5243			{
5244				for (xp = buf; xp < bp; xp++)
5245					(void) sm_io_putc(TrafficLogFile,
5246							  SM_TIME_DEFAULT,
5247							  (unsigned char) *xp);
5248			}
5249			for (xp = buf; xp < bp; xp++)
5250			{
5251				if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT,
5252					       (unsigned char) *xp)
5253				    == SM_IO_EOF)
5254				{
5255					dead = true;
5256					break;
5257				}
5258			}
5259			pos += bp - buf;
5260		}
5261		if (!dead && pos > 0)
5262		{
5263			if (TrafficLogFile != NULL)
5264				(void) sm_io_fputs(TrafficLogFile,
5265						   SM_TIME_DEFAULT,
5266						   mci->mci_mailer->m_eol);
5267			if (sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT,
5268					   mci->mci_mailer->m_eol) == SM_IO_EOF)
5269				goto writeerr;
5270		}
5271	}
5272
5273	if (sm_io_error(e->e_dfp))
5274	{
5275		syserr("putbody: %s/%cf%s: read error",
5276		       qid_printqueue(e->e_dfqgrp, e->e_dfqdir),
5277		       DATAFL_LETTER, e->e_id);
5278		ExitStat = EX_IOERR;
5279		ioerr = true;
5280	}
5281
5282endofmessage:
5283	/*
5284	**  Since mailfile() uses e_dfp in a child process,
5285	**  the file offset in the stdio library for the
5286	**  parent process will not agree with the in-kernel
5287	**  file offset since the file descriptor is shared
5288	**  between the processes.  Therefore, it is vital
5289	**  that the file always be rewound.  This forces the
5290	**  kernel offset (lseek) and stdio library (ftell)
5291	**  offset to match.
5292	*/
5293
5294	save_errno = errno;
5295	if (e->e_dfp != NULL)
5296		(void) bfrewind(e->e_dfp);
5297
5298	/* some mailers want extra blank line at end of message */
5299	if (!dead && bitnset(M_BLANKEND, mci->mci_mailer->m_flags) &&
5300	    buf[0] != '\0' && buf[0] != '\n')
5301	{
5302		if (!putline("", mci))
5303			goto writeerr;
5304	}
5305
5306	if (!dead &&
5307	    (sm_io_flush(mci->mci_out, SM_TIME_DEFAULT) == SM_IO_EOF ||
5308	     (sm_io_error(mci->mci_out) && errno != EPIPE)))
5309	{
5310		save_errno = errno;
5311		syserr("putbody: write error");
5312		ExitStat = EX_IOERR;
5313		ioerr = true;
5314	}
5315
5316	errno = save_errno;
5317	return !dead && !ioerr;
5318
5319  writeerr:
5320	return false;
5321}
5322
5323/*
5324**  MAILFILE -- Send a message to a file.
5325**
5326**	If the file has the set-user-ID/set-group-ID bits set, but NO
5327**	execute bits, sendmail will try to become the owner of that file
5328**	rather than the real user.  Obviously, this only works if
5329**	sendmail runs as root.
5330**
5331**	This could be done as a subordinate mailer, except that it
5332**	is used implicitly to save messages in ~/dead.letter.  We
5333**	view this as being sufficiently important as to include it
5334**	here.  For example, if the system is dying, we shouldn't have
5335**	to create another process plus some pipes to save the message.
5336**
5337**	Parameters:
5338**		filename -- the name of the file to send to.
5339**		mailer -- mailer definition for recipient -- if NULL,
5340**			use FileMailer.
5341**		ctladdr -- the controlling address header -- includes
5342**			the userid/groupid to be when sending.
5343**		sfflags -- flags for opening.
5344**		e -- the current envelope.
5345**
5346**	Returns:
5347**		The exit code associated with the operation.
5348**
5349**	Side Effects:
5350**		none.
5351*/
5352
5353# define RETURN(st)			exit(st);
5354
5355static jmp_buf	CtxMailfileTimeout;
5356
5357int
5358mailfile(filename, mailer, ctladdr, sfflags, e)
5359	char *volatile filename;
5360	MAILER *volatile mailer;
5361	ADDRESS *ctladdr;
5362	volatile long sfflags;
5363	register ENVELOPE *e;
5364{
5365	register SM_FILE_T *f;
5366	register pid_t pid = -1;
5367	volatile int mode;
5368	int len;
5369	off_t curoff;
5370	bool suidwarn = geteuid() == 0;
5371	char *p;
5372	char *volatile realfile;
5373	SM_EVENT *ev;
5374	char buf[MAXPATHLEN];
5375	char targetfile[MAXPATHLEN];
5376
5377	if (tTd(11, 1))
5378	{
5379		sm_dprintf("mailfile %s\n  ctladdr=", filename);
5380		printaddr(sm_debug_file(), ctladdr, false);
5381	}
5382
5383	if (mailer == NULL)
5384		mailer = FileMailer;
5385
5386	if (e->e_xfp != NULL)
5387		(void) sm_io_flush(e->e_xfp, SM_TIME_DEFAULT);
5388
5389	/*
5390	**  Special case /dev/null.  This allows us to restrict file
5391	**  delivery to regular files only.
5392	*/
5393
5394	if (sm_path_isdevnull(filename))
5395		return EX_OK;
5396
5397	/* check for 8-bit available */
5398	if (bitset(EF_HAS8BIT, e->e_flags) &&
5399	    bitnset(M_7BITS, mailer->m_flags) &&
5400	    (bitset(EF_DONT_MIME, e->e_flags) ||
5401	     !(bitset(MM_MIME8BIT, MimeMode) ||
5402	       (bitset(EF_IS_MIME, e->e_flags) &&
5403		bitset(MM_CVTMIME, MimeMode)))))
5404	{
5405		e->e_status = "5.6.3";
5406		usrerrenh(e->e_status,
5407			  "554 Cannot send 8-bit data to 7-bit destination");
5408		errno = 0;
5409		return EX_DATAERR;
5410	}
5411
5412	/* Find the actual file */
5413	if (SafeFileEnv != NULL && SafeFileEnv[0] != '\0')
5414	{
5415		len = strlen(SafeFileEnv);
5416
5417		if (strncmp(SafeFileEnv, filename, len) == 0)
5418			filename += len;
5419
5420		if (len + strlen(filename) + 1 >= sizeof(targetfile))
5421		{
5422			syserr("mailfile: filename too long (%s/%s)",
5423			       SafeFileEnv, filename);
5424			return EX_CANTCREAT;
5425		}
5426		(void) sm_strlcpy(targetfile, SafeFileEnv, sizeof(targetfile));
5427		realfile = targetfile + len;
5428		if (*filename == '/')
5429			filename++;
5430		if (*filename != '\0')
5431		{
5432			/* paranoia: trailing / should be removed in readcf */
5433			if (targetfile[len - 1] != '/')
5434				(void) sm_strlcat(targetfile,
5435						  "/", sizeof(targetfile));
5436			(void) sm_strlcat(targetfile, filename,
5437					  sizeof(targetfile));
5438		}
5439	}
5440	else if (mailer->m_rootdir != NULL)
5441	{
5442		expand(mailer->m_rootdir, targetfile, sizeof(targetfile), e);
5443		len = strlen(targetfile);
5444
5445		if (strncmp(targetfile, filename, len) == 0)
5446			filename += len;
5447
5448		if (len + strlen(filename) + 1 >= sizeof(targetfile))
5449		{
5450			syserr("mailfile: filename too long (%s/%s)",
5451			       targetfile, filename);
5452			return EX_CANTCREAT;
5453		}
5454		realfile = targetfile + len;
5455		if (targetfile[len - 1] != '/')
5456			(void) sm_strlcat(targetfile, "/", sizeof(targetfile));
5457		if (*filename == '/')
5458			(void) sm_strlcat(targetfile, filename + 1,
5459					  sizeof(targetfile));
5460		else
5461			(void) sm_strlcat(targetfile, filename,
5462					  sizeof(targetfile));
5463	}
5464	else
5465	{
5466		if (sm_strlcpy(targetfile, filename, sizeof(targetfile)) >=
5467		    sizeof(targetfile))
5468		{
5469			syserr("mailfile: filename too long (%s)", filename);
5470			return EX_CANTCREAT;
5471		}
5472		realfile = targetfile;
5473	}
5474
5475	/*
5476	**  Fork so we can change permissions here.
5477	**	Note that we MUST use fork, not vfork, because of
5478	**	the complications of calling subroutines, etc.
5479	*/
5480
5481
5482	/*
5483	**  Dispose of SIGCHLD signal catchers that may be laying
5484	**  around so that the waitfor() below will get it.
5485	*/
5486
5487	(void) sm_signal(SIGCHLD, SIG_DFL);
5488
5489	DOFORK(fork);
5490
5491	if (pid < 0)
5492		return EX_OSERR;
5493	else if (pid == 0)
5494	{
5495		/* child -- actually write to file */
5496		struct stat stb;
5497		MCI mcibuf;
5498		int err;
5499		volatile int oflags = O_WRONLY|O_APPEND;
5500
5501		/* Reset global flags */
5502		RestartRequest = NULL;
5503		RestartWorkGroup = false;
5504		ShutdownRequest = NULL;
5505		PendingSignal = 0;
5506		CurrentPid = getpid();
5507
5508		if (e->e_lockfp != NULL)
5509		{
5510			int fd;
5511
5512			fd = sm_io_getinfo(e->e_lockfp, SM_IO_WHAT_FD, NULL);
5513			/* SM_ASSERT(fd >= 0); */
5514			if (fd >= 0)
5515				(void) close(fd);
5516		}
5517
5518		(void) sm_signal(SIGINT, SIG_DFL);
5519		(void) sm_signal(SIGHUP, SIG_DFL);
5520		(void) sm_signal(SIGTERM, SIG_DFL);
5521		(void) umask(OldUmask);
5522		e->e_to = filename;
5523		ExitStat = EX_OK;
5524
5525		if (setjmp(CtxMailfileTimeout) != 0)
5526		{
5527			RETURN(EX_TEMPFAIL);
5528		}
5529
5530		if (TimeOuts.to_fileopen > 0)
5531			ev = sm_setevent(TimeOuts.to_fileopen, mailfiletimeout,
5532					 0);
5533		else
5534			ev = NULL;
5535
5536		/* check file mode to see if set-user-ID */
5537		if (stat(targetfile, &stb) < 0)
5538			mode = FileMode;
5539		else
5540			mode = stb.st_mode;
5541
5542		/* limit the errors to those actually caused in the child */
5543		errno = 0;
5544		ExitStat = EX_OK;
5545
5546		/* Allow alias expansions to use the S_IS{U,G}ID bits */
5547		if ((ctladdr != NULL && !bitset(QALIAS, ctladdr->q_flags)) ||
5548		    bitset(SFF_RUNASREALUID, sfflags))
5549		{
5550			/* ignore set-user-ID and set-group-ID bits */
5551			mode &= ~(S_ISGID|S_ISUID);
5552			if (tTd(11, 20))
5553				sm_dprintf("mailfile: ignoring set-user-ID/set-group-ID bits\n");
5554		}
5555
5556		/* we have to open the data file BEFORE setuid() */
5557		if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags))
5558		{
5559			char *df = queuename(e, DATAFL_LETTER);
5560
5561			e->e_dfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, df,
5562					      SM_IO_RDONLY_B, NULL);
5563			if (e->e_dfp == NULL)
5564			{
5565				syserr("mailfile: Cannot open %s for %s from %s",
5566					df, e->e_to, e->e_from.q_paddr);
5567			}
5568		}
5569
5570		/* select a new user to run as */
5571		if (!bitset(SFF_RUNASREALUID, sfflags))
5572		{
5573			if (bitnset(M_SPECIFIC_UID, mailer->m_flags))
5574			{
5575				RealUserName = NULL;
5576				if (mailer->m_uid == NO_UID)
5577					RealUid = RunAsUid;
5578				else
5579					RealUid = mailer->m_uid;
5580				if (RunAsUid != 0 && RealUid != RunAsUid)
5581				{
5582					/* Only root can change the uid */
5583					syserr("mailfile: insufficient privileges to change uid, RunAsUid=%ld, RealUid=%ld",
5584						(long) RunAsUid, (long) RealUid);
5585					RETURN(EX_TEMPFAIL);
5586				}
5587			}
5588			else if (bitset(S_ISUID, mode))
5589			{
5590				RealUserName = NULL;
5591				RealUid = stb.st_uid;
5592			}
5593			else if (ctladdr != NULL && ctladdr->q_uid != 0)
5594			{
5595				if (ctladdr->q_ruser != NULL)
5596					RealUserName = ctladdr->q_ruser;
5597				else
5598					RealUserName = ctladdr->q_user;
5599				RealUid = ctladdr->q_uid;
5600			}
5601			else if (mailer != NULL && mailer->m_uid != NO_UID)
5602			{
5603				RealUserName = DefUser;
5604				RealUid = mailer->m_uid;
5605			}
5606			else
5607			{
5608				RealUserName = DefUser;
5609				RealUid = DefUid;
5610			}
5611
5612			/* select a new group to run as */
5613			if (bitnset(M_SPECIFIC_UID, mailer->m_flags))
5614			{
5615				if (mailer->m_gid == NO_GID)
5616					RealGid = RunAsGid;
5617				else
5618					RealGid = mailer->m_gid;
5619				if (RunAsUid != 0 &&
5620				    (RealGid != getgid() ||
5621				     RealGid != getegid()))
5622				{
5623					/* Only root can change the gid */
5624					syserr("mailfile: insufficient privileges to change gid, RealGid=%ld, RunAsUid=%ld, gid=%ld, egid=%ld",
5625					       (long) RealGid, (long) RunAsUid,
5626					       (long) getgid(), (long) getegid());
5627					RETURN(EX_TEMPFAIL);
5628				}
5629			}
5630			else if (bitset(S_ISGID, mode))
5631				RealGid = stb.st_gid;
5632			else if (ctladdr != NULL &&
5633				 ctladdr->q_uid == DefUid &&
5634				 ctladdr->q_gid == 0)
5635			{
5636				/*
5637				**  Special case:  This means it is an
5638				**  alias and we should act as DefaultUser.
5639				**  See alias()'s comments.
5640				*/
5641
5642				RealGid = DefGid;
5643				RealUserName = DefUser;
5644			}
5645			else if (ctladdr != NULL && ctladdr->q_uid != 0)
5646				RealGid = ctladdr->q_gid;
5647			else if (mailer != NULL && mailer->m_gid != NO_GID)
5648				RealGid = mailer->m_gid;
5649			else
5650				RealGid = DefGid;
5651		}
5652
5653		/* last ditch */
5654		if (!bitset(SFF_ROOTOK, sfflags))
5655		{
5656			if (RealUid == 0)
5657				RealUid = DefUid;
5658			if (RealGid == 0)
5659				RealGid = DefGid;
5660		}
5661
5662		/* set group id list (needs /etc/group access) */
5663		if (RealUserName != NULL && !DontInitGroups)
5664		{
5665			if (initgroups(RealUserName, RealGid) == -1 && suidwarn)
5666			{
5667				syserr("mailfile: initgroups(%s, %ld) failed",
5668					RealUserName, (long) RealGid);
5669				RETURN(EX_TEMPFAIL);
5670			}
5671		}
5672		else
5673		{
5674			GIDSET_T gidset[1];
5675
5676			gidset[0] = RealGid;
5677			if (setgroups(1, gidset) == -1 && suidwarn)
5678			{
5679				syserr("mailfile: setgroups() failed");
5680				RETURN(EX_TEMPFAIL);
5681			}
5682		}
5683
5684		/*
5685		**  If you have a safe environment, go into it.
5686		*/
5687
5688		if (realfile != targetfile)
5689		{
5690			char save;
5691
5692			save = *realfile;
5693			*realfile = '\0';
5694			if (tTd(11, 20))
5695				sm_dprintf("mailfile: chroot %s\n", targetfile);
5696			if (chroot(targetfile) < 0)
5697			{
5698				syserr("mailfile: Cannot chroot(%s)",
5699				       targetfile);
5700				RETURN(EX_CANTCREAT);
5701			}
5702			*realfile = save;
5703		}
5704
5705		if (tTd(11, 40))
5706			sm_dprintf("mailfile: deliver to %s\n", realfile);
5707
5708		if (chdir("/") < 0)
5709		{
5710			syserr("mailfile: cannot chdir(/)");
5711			RETURN(EX_CANTCREAT);
5712		}
5713
5714		/* now reset the group and user ids */
5715		endpwent();
5716		sm_mbdb_terminate();
5717		if (setgid(RealGid) < 0 && suidwarn)
5718		{
5719			syserr("mailfile: setgid(%ld) failed", (long) RealGid);
5720			RETURN(EX_TEMPFAIL);
5721		}
5722		vendor_set_uid(RealUid);
5723		if (setuid(RealUid) < 0 && suidwarn)
5724		{
5725			syserr("mailfile: setuid(%ld) failed", (long) RealUid);
5726			RETURN(EX_TEMPFAIL);
5727		}
5728
5729		if (tTd(11, 2))
5730			sm_dprintf("mailfile: running as r/euid=%ld/%ld, r/egid=%ld/%ld\n",
5731				(long) getuid(), (long) geteuid(),
5732				(long) getgid(), (long) getegid());
5733
5734
5735		/* move into some "safe" directory */
5736		if (mailer->m_execdir != NULL)
5737		{
5738			char *q;
5739
5740			for (p = mailer->m_execdir; p != NULL; p = q)
5741			{
5742				q = strchr(p, ':');
5743				if (q != NULL)
5744					*q = '\0';
5745				expand(p, buf, sizeof(buf), e);
5746				if (q != NULL)
5747					*q++ = ':';
5748				if (tTd(11, 20))
5749					sm_dprintf("mailfile: trydir %s\n",
5750						   buf);
5751				if (buf[0] != '\0' && chdir(buf) >= 0)
5752					break;
5753			}
5754		}
5755
5756		/*
5757		**  Recheck the file after we have assumed the ID of the
5758		**  delivery user to make sure we can deliver to it as
5759		**  that user.  This is necessary if sendmail is running
5760		**  as root and the file is on an NFS mount which treats
5761		**  root as nobody.
5762		*/
5763
5764#if HASLSTAT
5765		if (bitnset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail))
5766			err = stat(realfile, &stb);
5767		else
5768			err = lstat(realfile, &stb);
5769#else /* HASLSTAT */
5770		err = stat(realfile, &stb);
5771#endif /* HASLSTAT */
5772
5773		if (err < 0)
5774		{
5775			stb.st_mode = ST_MODE_NOFILE;
5776			mode = FileMode;
5777			oflags |= O_CREAT|O_EXCL;
5778		}
5779		else if (bitset(S_IXUSR|S_IXGRP|S_IXOTH, mode) ||
5780			 (!bitnset(DBS_FILEDELIVERYTOHARDLINK,
5781				   DontBlameSendmail) &&
5782			  stb.st_nlink != 1) ||
5783			 (realfile != targetfile && !S_ISREG(mode)))
5784			exit(EX_CANTCREAT);
5785		else
5786			mode = stb.st_mode;
5787
5788		if (!bitnset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail))
5789			sfflags |= SFF_NOSLINK;
5790		if (!bitnset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail))
5791			sfflags |= SFF_NOHLINK;
5792		sfflags &= ~SFF_OPENASROOT;
5793		f = safefopen(realfile, oflags, mode, sfflags);
5794		if (f == NULL)
5795		{
5796			if (transienterror(errno))
5797			{
5798				usrerr("454 4.3.0 cannot open %s: %s",
5799				       shortenstring(realfile, MAXSHORTSTR),
5800				       sm_errstring(errno));
5801				RETURN(EX_TEMPFAIL);
5802			}
5803			else
5804			{
5805				usrerr("554 5.3.0 cannot open %s: %s",
5806				       shortenstring(realfile, MAXSHORTSTR),
5807				       sm_errstring(errno));
5808				RETURN(EX_CANTCREAT);
5809			}
5810		}
5811		if (filechanged(realfile, sm_io_getinfo(f, SM_IO_WHAT_FD, NULL),
5812		    &stb))
5813		{
5814			syserr("554 5.3.0 file changed after open");
5815			RETURN(EX_CANTCREAT);
5816		}
5817		if (fstat(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL), &stb) < 0)
5818		{
5819			syserr("554 5.3.0 cannot fstat %s",
5820				sm_errstring(errno));
5821			RETURN(EX_CANTCREAT);
5822		}
5823
5824		curoff = stb.st_size;
5825
5826		if (ev != NULL)
5827			sm_clrevent(ev);
5828
5829		memset(&mcibuf, '\0', sizeof(mcibuf));
5830		mcibuf.mci_mailer = mailer;
5831		mcibuf.mci_out = f;
5832		if (bitnset(M_7BITS, mailer->m_flags))
5833			mcibuf.mci_flags |= MCIF_7BIT;
5834
5835		/* clear out per-message flags from connection structure */
5836		mcibuf.mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7);
5837
5838		if (bitset(EF_HAS8BIT, e->e_flags) &&
5839		    !bitset(EF_DONT_MIME, e->e_flags) &&
5840		    bitnset(M_7BITS, mailer->m_flags))
5841			mcibuf.mci_flags |= MCIF_CVT8TO7;
5842
5843#if MIME7TO8
5844		if (bitnset(M_MAKE8BIT, mailer->m_flags) &&
5845		    !bitset(MCIF_7BIT, mcibuf.mci_flags) &&
5846		    (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL &&
5847		    (sm_strcasecmp(p, "quoted-printable") == 0 ||
5848		     sm_strcasecmp(p, "base64") == 0) &&
5849		    (p = hvalue("Content-Type", e->e_header)) != NULL)
5850		{
5851			/* may want to convert 7 -> 8 */
5852			/* XXX should really parse it here -- and use a class XXX */
5853			if (sm_strncasecmp(p, "text/plain", 10) == 0 &&
5854			    (p[10] == '\0' || p[10] == ' ' || p[10] == ';'))
5855				mcibuf.mci_flags |= MCIF_CVT7TO8;
5856		}
5857#endif /* MIME7TO8 */
5858
5859		if (!putfromline(&mcibuf, e) ||
5860		    !(*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER) ||
5861		    !(*e->e_putbody)(&mcibuf, e, NULL) ||
5862		    !putline("\n", &mcibuf) ||
5863		    (sm_io_flush(f, SM_TIME_DEFAULT) != 0 ||
5864		    (SuperSafe != SAFE_NO &&
5865		     fsync(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL)) < 0) ||
5866		    sm_io_error(f)))
5867		{
5868			setstat(EX_IOERR);
5869#if !NOFTRUNCATE
5870			(void) ftruncate(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL),
5871					 curoff);
5872#endif
5873		}
5874
5875		/* reset ISUID & ISGID bits for paranoid systems */
5876#if HASFCHMOD
5877		(void) fchmod(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL),
5878			      (MODE_T) mode);
5879#else /* HASFCHMOD */
5880		(void) chmod(filename, (MODE_T) mode);
5881#endif /* HASFCHMOD */
5882		if (sm_io_close(f, SM_TIME_DEFAULT) < 0)
5883			setstat(EX_IOERR);
5884		(void) sm_io_flush(smioout, SM_TIME_DEFAULT);
5885		(void) setuid(RealUid);
5886		exit(ExitStat);
5887		/* NOTREACHED */
5888	}
5889	else
5890	{
5891		/* parent -- wait for exit status */
5892		int st;
5893
5894		st = waitfor(pid);
5895		if (st == -1)
5896		{
5897			syserr("mailfile: %s: wait", mailer->m_name);
5898			return EX_SOFTWARE;
5899		}
5900		if (WIFEXITED(st))
5901		{
5902			errno = 0;
5903			return (WEXITSTATUS(st));
5904		}
5905		else
5906		{
5907			syserr("mailfile: %s: child died on signal %d",
5908			       mailer->m_name, st);
5909			return EX_UNAVAILABLE;
5910		}
5911		/* NOTREACHED */
5912	}
5913	return EX_UNAVAILABLE;	/* avoid compiler warning on IRIX */
5914}
5915
5916static void
5917mailfiletimeout(ignore)
5918	int ignore;
5919{
5920	/*
5921	**  NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER.  DO NOT ADD
5922	**	ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
5923	**	DOING.
5924	*/
5925
5926	errno = ETIMEDOUT;
5927	longjmp(CtxMailfileTimeout, 1);
5928}
5929
5930#if DANE
5931
5932/*
5933**  GETMPORT -- return the port of a mailer
5934**
5935**	Parameters:
5936**		m -- the mailer describing this host.
5937**
5938**	Returns:
5939**		the port of the mailer if defined.
5940**		0 otherwise
5941**		<0 error
5942*/
5943
5944static int getmport __P((MAILER *));
5945
5946static int
5947getmport(m)
5948	MAILER *m;
5949{
5950	unsigned long ulval;
5951	char *buf, *ep;
5952
5953	if (m->m_port > 0)
5954		return m->m_port;
5955
5956	if (NULL == m->m_argv[0] ||NULL == m->m_argv[1])
5957		return -1;
5958	buf = m->m_argv[2];
5959	if (NULL == buf)
5960		return 0;
5961
5962	errno = 0;
5963	ulval = strtoul(buf, &ep, 0);
5964	if (buf[0] == '\0' || *ep != '\0')
5965		return -1;
5966	if (errno == ERANGE && ulval == ULONG_MAX)
5967		return -1;
5968	if (ulval > USHRT_MAX)
5969		return -1;
5970	m->m_port = (unsigned short) ulval;
5971	if (tTd(17, 30))
5972		sm_dprintf("getmport: mailer=%s, port=%d\n", m->m_name,
5973			m->m_port);
5974	return m->m_port;
5975}
5976# define GETMPORT(m) getmport(m)
5977#else /* DANE */
5978# define GETMPORT(m)	25
5979#endif /* DANE */
5980
5981/*
5982**  HOSTSIGNATURE -- return the "signature" for a host.
5983**
5984**	The signature describes how we are going to send this -- it
5985**	can be just the hostname (for non-Internet hosts) or can be
5986**	an ordered list of MX hosts.
5987**
5988**	Parameters:
5989**		m -- the mailer describing this host.
5990**		host -- the host name.
5991**		ad -- DNSSEC: ad
5992**
5993**	Returns:
5994**		The signature for this host.
5995**
5996**	Side Effects:
5997**		Can tweak the symbol table.
5998*/
5999
6000#define MAXHOSTSIGNATURE	8192	/* max len of hostsignature */
6001
6002char *
6003hostsignature(m, host, ad)
6004	register MAILER *m;
6005	char *host;
6006	bool ad;
6007{
6008	register char *p;
6009	register STAB *s;
6010	time_t now;
6011#if NAMED_BIND
6012	char sep = ':';
6013	char prevsep = ':';
6014	int i;
6015	int len;
6016	int nmx;
6017	int hl;
6018	char *hp;
6019	char *endp;
6020	int oldoptions = _res.options;
6021	char *mxhosts[MAXMXHOSTS + 1];
6022	unsigned short mxprefs[MAXMXHOSTS + 1];
6023#endif /* NAMED_BIND */
6024
6025	if (tTd(17, 3))
6026		sm_dprintf("hostsignature(%s), ad=%d\n", host, ad);
6027
6028	/*
6029	**  If local delivery (and not remote), just return a constant.
6030	*/
6031
6032	if (bitnset(M_LOCALMAILER, m->m_flags) &&
6033	    strcmp(m->m_mailer, "[IPC]") != 0 &&
6034	    !(m->m_argv[0] != NULL && strcmp(m->m_argv[0], "TCP") == 0))
6035		return "localhost";
6036
6037	/* an empty host does not have MX records */
6038	if (*host == '\0')
6039		return "_empty_";
6040
6041	/*
6042	**  Check to see if this uses IPC -- if not, it can't have MX records.
6043	*/
6044
6045	if (strcmp(m->m_mailer, "[IPC]") != 0 ||
6046	    CurEnv->e_sendmode == SM_DEFER)
6047	{
6048		/* just an ordinary mailer or deferred mode */
6049		return host;
6050	}
6051#if NETUNIX
6052	else if (m->m_argv[0] != NULL &&
6053		 strcmp(m->m_argv[0], "FILE") == 0)
6054	{
6055		/* rendezvous in the file system, no MX records */
6056		return host;
6057	}
6058#endif /* NETUNIX */
6059
6060	/*
6061	**  Look it up in the symbol table.
6062	*/
6063
6064	now = curtime();
6065	s = stab(host, ST_HOSTSIG, ST_ENTER);
6066	if (s->s_hostsig.hs_sig != NULL)
6067	{
6068		if (s->s_hostsig.hs_exp >= now)
6069		{
6070			if (tTd(17, 3))
6071				sm_dprintf("hostsignature(): stab(%s) found %s\n", host,
6072					   s->s_hostsig.hs_sig);
6073			return s->s_hostsig.hs_sig;
6074		}
6075
6076		/* signature is expired: clear it */
6077		sm_free(s->s_hostsig.hs_sig);
6078		s->s_hostsig.hs_sig = NULL;
6079	}
6080
6081	/* set default TTL */
6082	s->s_hostsig.hs_exp = now + SM_DEFAULT_TTL;
6083
6084	/*
6085	**  Not already there or expired -- create a signature.
6086	*/
6087
6088#if NAMED_BIND
6089	if (ConfigLevel < 2)
6090		_res.options &= ~(RES_DEFNAMES | RES_DNSRCH);	/* XXX */
6091
6092	for (hp = host; hp != NULL; hp = endp)
6093	{
6094# if NETINET6
6095		if (*hp == '[')
6096		{
6097			endp = strchr(hp + 1, ']');
6098			if (endp != NULL)
6099				endp = strpbrk(endp + 1, ":,");
6100		}
6101		else
6102			endp = strpbrk(hp, ":,");
6103# else /* NETINET6 */
6104		endp = strpbrk(hp, ":,");
6105# endif /* NETINET6 */
6106		if (endp != NULL)
6107		{
6108			sep = *endp;
6109			*endp = '\0';
6110		}
6111
6112		if (bitnset(M_NOMX, m->m_flags))
6113		{
6114			/* skip MX lookups */
6115			nmx = 1;
6116			mxhosts[0] = hp;
6117		}
6118		else
6119		{
6120			auto int rcode;
6121			int ttl;
6122
6123			GETMPORT(m);
6124			nmx = getmxrr(hp, mxhosts, mxprefs,
6125				      DROPLOCALHOST|TRYFALLBACK|(ad ? ISAD :0),
6126				      &rcode, &ttl, M_PORT(m));
6127			if (nmx <= 0)
6128			{
6129				int save_errno;
6130				register MCI *mci;
6131
6132				/* update the connection info for this host */
6133				save_errno = errno;
6134				mci = mci_get(hp, m);
6135				mci->mci_errno = save_errno;
6136				mci->mci_herrno = h_errno;
6137				mci->mci_lastuse = now;
6138				if (nmx == NULLMX)
6139					mci_setstat(mci, rcode, "5.7.27",
6140						    "550 Host does not accept mail");
6141				else if (rcode == EX_NOHOST)
6142					mci_setstat(mci, rcode, "5.1.2",
6143						    "550 Host unknown");
6144				else
6145					mci_setstat(mci, rcode, NULL, NULL);
6146
6147				/* use the original host name as signature */
6148				nmx = 1;
6149				mxhosts[0] = hp;
6150			}
6151			if (tTd(17, 3))
6152				sm_dprintf("hostsignature(): getmxrr() returned %d, mxhosts[0]=%s\n",
6153					   nmx, mxhosts[0]);
6154
6155			/*
6156			**  Set new TTL: we use only one!
6157			**	We could try to use the minimum instead.
6158			*/
6159
6160			s->s_hostsig.hs_exp = now + SM_MIN(ttl, SM_DEFAULT_TTL);
6161		}
6162
6163		len = 0;
6164		for (i = 0; i < nmx; i++)
6165			len += strlen(mxhosts[i]) + 1;
6166		if (s->s_hostsig.hs_sig != NULL)
6167			len += strlen(s->s_hostsig.hs_sig) + 1;
6168		if (len < 0 || len >= MAXHOSTSIGNATURE)
6169		{
6170			sm_syslog(LOG_WARNING, NOQID, "hostsignature for host '%s' exceeds maxlen (%d): %d",
6171				  host, MAXHOSTSIGNATURE, len);
6172			len = MAXHOSTSIGNATURE;
6173		}
6174		p = sm_pmalloc_x(len);
6175		if (s->s_hostsig.hs_sig != NULL)
6176		{
6177			(void) sm_strlcpy(p, s->s_hostsig.hs_sig, len);
6178			sm_free(s->s_hostsig.hs_sig); /* XXX */
6179			s->s_hostsig.hs_sig = p;
6180			hl = strlen(p);
6181			p += hl;
6182			*p++ = prevsep;
6183			len -= hl + 1;
6184		}
6185		else
6186			s->s_hostsig.hs_sig = p;
6187		for (i = 0; i < nmx; i++)
6188		{
6189			hl = strlen(mxhosts[i]);
6190			if (len - 1 < hl || len <= 1)
6191			{
6192				/* force to drop out of outer loop */
6193				len = -1;
6194				break;
6195			}
6196			if (i != 0)
6197			{
6198				if (mxprefs[i] == mxprefs[i - 1])
6199					*p++ = ',';
6200				else
6201					*p++ = ':';
6202				len--;
6203			}
6204			(void) sm_strlcpy(p, mxhosts[i], len);
6205			p += hl;
6206			len -= hl;
6207		}
6208
6209		/*
6210		**  break out of loop if len exceeded MAXHOSTSIGNATURE
6211		**  because we won't have more space for further hosts
6212		**  anyway (separated by : in the .cf file).
6213		*/
6214
6215		if (len < 0)
6216			break;
6217		if (endp != NULL)
6218			*endp++ = sep;
6219		prevsep = sep;
6220	}
6221	makelower(s->s_hostsig.hs_sig);
6222	if (ConfigLevel < 2)
6223		_res.options = oldoptions;
6224#else /* NAMED_BIND */
6225	/* not using BIND -- the signature is just the host name */
6226	/*
6227	**  'host' points to storage that will be freed after we are
6228	**  done processing the current envelope, so we copy it.
6229	*/
6230	s->s_hostsig.hs_sig = sm_pstrdup_x(host);
6231#endif /* NAMED_BIND */
6232	if (tTd(17, 1))
6233		sm_dprintf("hostsignature(%s) = %s\n", host, s->s_hostsig.hs_sig);
6234	return s->s_hostsig.hs_sig;
6235}
6236/*
6237**  PARSE_HOSTSIGNATURE -- parse the "signature" and return MX host array.
6238**
6239**	The signature describes how we are going to send this -- it
6240**	can be just the hostname (for non-Internet hosts) or can be
6241**	an ordered list of MX hosts which must be randomized for equal
6242**	MX preference values.
6243**
6244**	Parameters:
6245**		sig -- the host signature.
6246**		mxhosts -- array to populate.
6247**		mailer -- mailer.
6248**
6249**	Returns:
6250**		The number of hosts inserted into mxhosts array.
6251**
6252**	Side Effects:
6253**		Randomizes equal MX preference hosts in mxhosts.
6254*/
6255
6256static int
6257parse_hostsignature(sig, mxhosts, mailer)
6258	char *sig;
6259	char **mxhosts;
6260	MAILER *mailer;
6261{
6262	unsigned short curpref = 0;
6263	int nmx = 0, i, j;	/* NOTE: i, j, and nmx must have same type */
6264	char *hp, *endp;
6265	unsigned short prefer[MAXMXHOSTS];
6266	long rndm[MAXMXHOSTS];
6267
6268	for (hp = sig; hp != NULL; hp = endp)
6269	{
6270		char sep = ':';
6271
6272#if NETINET6
6273		if (*hp == '[')
6274		{
6275			endp = strchr(hp + 1, ']');
6276			if (endp != NULL)
6277				endp = strpbrk(endp + 1, ":,");
6278		}
6279		else
6280			endp = strpbrk(hp, ":,");
6281#else /* NETINET6 */
6282		endp = strpbrk(hp, ":,");
6283#endif /* NETINET6 */
6284		if (endp != NULL)
6285		{
6286			sep = *endp;
6287			*endp = '\0';
6288		}
6289
6290		mxhosts[nmx] = hp;
6291		prefer[nmx] = curpref;
6292		if (mci_match(hp, mailer))
6293			rndm[nmx] = 0;
6294		else
6295			rndm[nmx] = get_random();
6296
6297		if (endp != NULL)
6298		{
6299			/*
6300			**  Since we don't have the original MX prefs,
6301			**  make our own.  If the separator is a ':', that
6302			**  means the preference for the next host will be
6303			**  higher than this one, so simply increment curpref.
6304			*/
6305
6306			if (sep == ':')
6307				curpref++;
6308
6309			*endp++ = sep;
6310		}
6311		if (++nmx >= MAXMXHOSTS)
6312			break;
6313	}
6314
6315	/* sort the records using the random factor for equal preferences */
6316	for (i = 0; i < nmx; i++)
6317	{
6318		for (j = i + 1; j < nmx; j++)
6319		{
6320			/*
6321			**  List is already sorted by MX preference, only
6322			**  need to look for equal preference MX records
6323			*/
6324
6325			if (prefer[i] < prefer[j])
6326				break;
6327
6328			if (prefer[i] > prefer[j] ||
6329			    (prefer[i] == prefer[j] && rndm[i] > rndm[j]))
6330			{
6331				register unsigned short tempp;
6332				register long tempr;
6333				register char *temp1;
6334
6335				tempp = prefer[i];
6336				prefer[i] = prefer[j];
6337				prefer[j] = tempp;
6338				temp1 = mxhosts[i];
6339				mxhosts[i] = mxhosts[j];
6340				mxhosts[j] = temp1;
6341				tempr = rndm[i];
6342				rndm[i] = rndm[j];
6343				rndm[j] = tempr;
6344			}
6345		}
6346	}
6347	return nmx;
6348}
6349
6350#if STARTTLS
6351static SSL_CTX	*clt_ctx = NULL;
6352static bool	tls_ok_clt = true;
6353
6354/*
6355**  SETCLTTLS -- client side TLS: allow/disallow.
6356**
6357**	Parameters:
6358**		tls_ok -- should tls be done?
6359**
6360**	Returns:
6361**		none.
6362**
6363**	Side Effects:
6364**		sets tls_ok_clt (static variable in this module)
6365*/
6366
6367void
6368setclttls(tls_ok)
6369	bool tls_ok;
6370{
6371	tls_ok_clt = tls_ok;
6372	return;
6373}
6374/*
6375**  INITCLTTLS -- initialize client side TLS
6376**
6377**	Parameters:
6378**		tls_ok -- should tls initialization be done?
6379**
6380**	Returns:
6381**		succeeded?
6382**
6383**	Side Effects:
6384**		sets tls_ok_clt (static variable in this module)
6385*/
6386
6387bool
6388initclttls(tls_ok)
6389	bool tls_ok;
6390{
6391	if (!tls_ok_clt)
6392		return false;
6393	tls_ok_clt = tls_ok;
6394	if (!tls_ok_clt)
6395		return false;
6396	if (clt_ctx != NULL)
6397		return true;	/* already done */
6398	tls_ok_clt = inittls(&clt_ctx, TLS_I_CLT, Clt_SSL_Options, false,
6399			CltCertFile, CltKeyFile,
6400# if _FFR_CLIENTCA
6401			(CltCACertPath != NULL) ? CltCACertPath :
6402# endif
6403				CACertPath,
6404# if _FFR_CLIENTCA
6405			(CltCACertFile != NULL) ? CltCACertFile :
6406# endif
6407				CACertFile,
6408			DHParams);
6409	return tls_ok_clt;
6410}
6411
6412/*
6413**  STARTTLS -- try to start secure connection (client side)
6414**
6415**	Parameters:
6416**		m -- the mailer.
6417**		mci -- the mailer connection info.
6418**		e -- the envelope.
6419**
6420**	Returns:
6421**		success?
6422**		(maybe this should be some other code than EX_
6423**		that denotes which stage failed.)
6424*/
6425
6426static int
6427starttls(m, mci, e
6428# if DANE
6429	, dane_vrfy_ctx
6430# endif
6431	)
6432	MAILER *m;
6433	MCI *mci;
6434	ENVELOPE *e;
6435# if DANE
6436	dane_vrfy_ctx_P	dane_vrfy_ctx;
6437# endif
6438{
6439	int smtpresult;
6440	int result = 0;
6441	int rfd, wfd;
6442	SSL *clt_ssl = NULL;
6443	time_t tlsstart;
6444	extern int TLSsslidx;
6445
6446	if (clt_ctx == NULL && !initclttls(true))
6447		return EX_TEMPFAIL;
6448
6449	if (!TLS_set_engine(SSLEngine, false))
6450	{
6451		sm_syslog(LOG_ERR, NOQID,
6452			  "STARTTLS=client, engine=%s, TLS_set_engine=failed",
6453			  SSLEngine);
6454		return EX_TEMPFAIL;
6455	}
6456
6457	smtpmessage("STARTTLS", m, mci);
6458
6459	/* get the reply */
6460	smtpresult = reply(m, mci, e, TimeOuts.to_starttls, NULL, NULL,
6461			XS_STARTTLS);
6462
6463	/* check return code from server */
6464	if (REPLYTYPE(smtpresult) == 4)
6465		return EX_TEMPFAIL;
6466	if (smtpresult == 501)
6467		return EX_USAGE;
6468	if (smtpresult == -1)
6469		return smtpresult;
6470
6471	/* not an expected reply but we have to deal with it */
6472	if (REPLYTYPE(smtpresult) == 5)
6473		return EX_UNAVAILABLE;
6474	if (smtpresult != 220)
6475		return EX_PROTOCOL;
6476
6477	if (LogLevel > 13)
6478		sm_syslog(LOG_INFO, NOQID, "STARTTLS=client, start=ok");
6479
6480	/* start connection */
6481	if ((clt_ssl = SSL_new(clt_ctx)) == NULL)
6482	{
6483		if (LogLevel > 5)
6484		{
6485			sm_syslog(LOG_ERR, NOQID,
6486				  "STARTTLS=client, error: SSL_new failed");
6487			tlslogerr(LOG_WARNING, 9, "client");
6488		}
6489		return EX_SOFTWARE;
6490	}
6491	/* SSL_clear(clt_ssl); ? */
6492
6493	if (get_tls_se_options(e, clt_ssl, &mci->mci_tlsi, false) != 0)
6494	{
6495		sm_syslog(LOG_ERR, NOQID,
6496			  "STARTTLS=client, get_tls_se_options=fail");
6497		return EX_SOFTWARE;
6498	}
6499	result = SSL_set_ex_data(clt_ssl, TLSsslidx, &mci->mci_tlsi);
6500	if (0 == result)
6501	{
6502		if (LogLevel > 5)
6503		{
6504			sm_syslog(LOG_ERR, NOQID,
6505				  "STARTTLS=client, error: SSL_set_ex_data failed=%d, idx=%d",
6506				  result, TLSsslidx);
6507			tlslogerr(LOG_WARNING, 9, "client");
6508		}
6509		return EX_SOFTWARE;
6510	}
6511# if DANE
6512	if (SM_TLSI_IS(&(mci->mci_tlsi), TLSI_FL_NODANE))
6513		dane_vrfy_ctx->dane_vrfy_chk = DANE_NEVER;
6514	else
6515	{
6516		int r;
6517
6518#  define SM_IS_EMPTY(s)	(NULL == (s) || '\0' == *(s))
6519
6520		/* set SNI only if there is a TLSA RR */
6521		if (dane_get_tlsa(dane_vrfy_ctx) != NULL &&
6522		    !(SM_IS_EMPTY(dane_vrfy_ctx->dane_vrfy_host) &&
6523		      SM_IS_EMPTY(dane_vrfy_ctx->dane_vrfy_sni)) &&
6524		    (r = SSL_set_tlsext_host_name(clt_ssl,
6525				(!SM_IS_EMPTY(dane_vrfy_ctx->dane_vrfy_sni)
6526				? dane_vrfy_ctx->dane_vrfy_sni
6527				: dane_vrfy_ctx->dane_vrfy_host))) <= 0)
6528		{
6529			if (LogLevel > 5)
6530			{
6531				sm_syslog(LOG_ERR, NOQID,
6532					  "STARTTLS=client, host=%s, SSL_set_tlsext_host_name=%d",
6533					  dane_vrfy_ctx->dane_vrfy_host, r);
6534			}
6535			tlslogerr(LOG_ERR, 5, "client");
6536			/* return EX_SOFTWARE; */
6537		}
6538	}
6539	memcpy(&mci->mci_tlsi.tlsi_dvc, dane_vrfy_ctx, sizeof(*dane_vrfy_ctx));
6540# endif /* DANE */
6541
6542	rfd = sm_io_getinfo(mci->mci_in, SM_IO_WHAT_FD, NULL);
6543	wfd = sm_io_getinfo(mci->mci_out, SM_IO_WHAT_FD, NULL);
6544
6545	if (rfd < 0 || wfd < 0 ||
6546	    (result = SSL_set_rfd(clt_ssl, rfd)) != 1 ||
6547	    (result = SSL_set_wfd(clt_ssl, wfd)) != 1)
6548	{
6549		if (LogLevel > 5)
6550		{
6551			sm_syslog(LOG_ERR, NOQID,
6552				  "STARTTLS=client, error: SSL_set_xfd failed=%d",
6553				  result);
6554			tlslogerr(LOG_WARNING, 9, "client");
6555		}
6556		return EX_SOFTWARE;
6557	}
6558	SSL_set_connect_state(clt_ssl);
6559	tlsstart = curtime();
6560
6561ssl_retry:
6562	if ((result = SSL_connect(clt_ssl)) <= 0)
6563	{
6564		int i, ssl_err;
6565		int save_errno = errno;
6566
6567		ssl_err = SSL_get_error(clt_ssl, result);
6568		i = tls_retry(clt_ssl, rfd, wfd, tlsstart,
6569			TimeOuts.to_starttls, ssl_err, "client");
6570		if (i > 0)
6571			goto ssl_retry;
6572
6573		if (LogLevel > 5)
6574		{
6575			unsigned long l;
6576			const char *sr;
6577
6578			l = ERR_peek_error();
6579			sr = ERR_reason_error_string(l);
6580			sm_syslog(LOG_WARNING, NOQID,
6581				  "STARTTLS=client, error: connect failed=%d, reason=%s, SSL_error=%d, errno=%d, retry=%d",
6582				  result, sr == NULL ? "unknown" : sr, ssl_err,
6583				  save_errno, i);
6584			tlslogerr(LOG_WARNING, 9, "client");
6585		}
6586
6587		SM_SSL_FREE(clt_ssl);
6588		return EX_SOFTWARE;
6589	}
6590	mci->mci_ssl = clt_ssl;
6591	result = tls_get_info(mci->mci_ssl, false, mci->mci_host,
6592			      &mci->mci_macro, true);
6593
6594	/* switch to use TLS... */
6595	if (sfdctls(&mci->mci_in, &mci->mci_out, mci->mci_ssl) == 0)
6596		return EX_OK;
6597
6598	/* failure */
6599	SM_SSL_FREE(clt_ssl);
6600	return EX_SOFTWARE;
6601}
6602/*
6603**  ENDTLSCLT -- shutdown secure connection (client side)
6604**
6605**	Parameters:
6606**		mci -- the mailer connection info.
6607**
6608**	Returns:
6609**		success?
6610*/
6611
6612static int
6613endtlsclt(mci)
6614	MCI *mci;
6615{
6616	int r;
6617
6618	if (!bitset(MCIF_TLSACT, mci->mci_flags))
6619		return EX_OK;
6620	r = endtls(&mci->mci_ssl, "client");
6621	mci->mci_flags &= ~MCIF_TLSACT;
6622	return r;
6623}
6624#endif /* STARTTLS */
6625#if STARTTLS || SASL
6626/*
6627**  ISCLTFLGSET -- check whether client flag is set.
6628**
6629**	Parameters:
6630**		e -- envelope.
6631**		flag -- flag to check in {client_flags}
6632**
6633**	Returns:
6634**		true iff flag is set.
6635*/
6636
6637static bool
6638iscltflgset(e, flag)
6639	ENVELOPE *e;
6640	int flag;
6641{
6642	char *p;
6643
6644	p = macvalue(macid("{client_flags}"), e);
6645	if (p == NULL)
6646		return false;
6647	for (; *p != '\0'; p++)
6648	{
6649		/* look for just this one flag */
6650		if (*p == (char) flag)
6651			return true;
6652	}
6653	return false;
6654}
6655#endif /* STARTTLS || SASL */
6656