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