deliver.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:98k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 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. #ifndef lint
  14. static char id[] = "@(#)$Id: deliver.c,v 8.565 1999/12/10 18:54:04 ca Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. #if HASSETUSERCONTEXT
  18. # include <login_cap.h>
  19. #endif /* HASSETUSERCONTEXT */
  20. #if SMTP
  21. extern char SmtpError[];
  22. #endif /* SMTP */
  23. static int deliver __P((ENVELOPE *, ADDRESS *));
  24. static void dup_queue_file __P((ENVELOPE *, ENVELOPE *, int));
  25. static void mailfiletimeout __P((void));
  26. static void markfailure __P((ENVELOPE *, ADDRESS *, MCI *, int, bool));
  27. static int parse_hostsignature __P((char *, char **, MAILER *));
  28. static void sendenvelope __P((ENVELOPE *, int));
  29. static char *hostsignature __P((MAILER *, char *));
  30. #if SMTP
  31. #endif /* SMTP */
  32. /*
  33. **  SENDALL -- actually send all the messages.
  34. **
  35. ** Parameters:
  36. ** e -- the envelope to send.
  37. ** mode -- the delivery mode to use.  If SM_DEFAULT, use
  38. ** the current e->e_sendmode.
  39. **
  40. ** Returns:
  41. ** none.
  42. **
  43. ** Side Effects:
  44. ** Scans the send lists and sends everything it finds.
  45. ** Delivers any appropriate error messages.
  46. ** If we are running in a non-interactive mode, takes the
  47. ** appropriate action.
  48. */
  49. void
  50. sendall(e, mode)
  51. ENVELOPE *e;
  52. int mode;
  53. {
  54. register ADDRESS *q;
  55. char *owner;
  56. int otherowners;
  57. int save_errno;
  58. register ENVELOPE *ee;
  59. ENVELOPE *splitenv = NULL;
  60. int oldverbose = Verbose;
  61. bool somedeliveries = FALSE, expensive = FALSE;
  62. pid_t pid;
  63. /*
  64. **  If this message is to be discarded, don't bother sending
  65. **  the message at all.
  66. */
  67. if (bitset(EF_DISCARD, e->e_flags))
  68. {
  69. if (tTd(13, 1))
  70. dprintf("sendall: discarding id %sn", e->e_id);
  71. e->e_flags |= EF_CLRQUEUE;
  72. if (LogLevel > 4)
  73. sm_syslog(LOG_INFO, e->e_id, "discarded");
  74. markstats(e, NULL, TRUE);
  75. return;
  76. }
  77. /*
  78. **  If we have had global, fatal errors, don't bother sending
  79. **  the message at all if we are in SMTP mode.  Local errors
  80. **  (e.g., a single address failing) will still cause the other
  81. **  addresses to be sent.
  82. */
  83. if (bitset(EF_FATALERRS, e->e_flags) &&
  84.     (OpMode == MD_SMTP || OpMode == MD_DAEMON))
  85. {
  86. e->e_flags |= EF_CLRQUEUE;
  87. return;
  88. }
  89. /* determine actual delivery mode */
  90. if (mode == SM_DEFAULT)
  91. {
  92. mode = e->e_sendmode;
  93. if (mode != SM_VERIFY && mode != SM_DEFER &&
  94.     shouldqueue(e->e_msgpriority, e->e_ctime))
  95. mode = SM_QUEUE;
  96. }
  97. if (tTd(13, 1))
  98. {
  99. dprintf("n===== SENDALL: mode %c, id %s, e_from ",
  100. mode, e->e_id);
  101. printaddr(&e->e_from, FALSE);
  102. dprintf("te_flags = ");
  103. printenvflags(e);
  104. dprintf("sendqueue:n");
  105. printaddr(e->e_sendqueue, TRUE);
  106. }
  107. /*
  108. **  Do any preprocessing necessary for the mode we are running.
  109. ** Check to make sure the hop count is reasonable.
  110. ** Delete sends to the sender in mailing lists.
  111. */
  112. CurEnv = e;
  113. if (tTd(62, 1))
  114. checkfds(NULL);
  115. if (e->e_hopcount > MaxHopCount)
  116. {
  117. errno = 0;
  118. #if QUEUE
  119. queueup(e, mode == SM_QUEUE || mode == SM_DEFER);
  120. #endif /* QUEUE */
  121. e->e_flags |= EF_FATALERRS|EF_PM_NOTIFY|EF_CLRQUEUE;
  122. ExitStat = EX_UNAVAILABLE;
  123. syserr("554 5.0.0 Too many hops %d (%d max): from %s via %s, to %s",
  124. e->e_hopcount, MaxHopCount, e->e_from.q_paddr,
  125. RealHostName == NULL ? "localhost" : RealHostName,
  126. e->e_sendqueue->q_paddr);
  127. for (q = e->e_sendqueue; q != NULL; q = q->q_next)
  128. {
  129. if (QS_IS_DEAD(q->q_state))
  130. continue;
  131. q->q_status = "5.4.6";
  132. }
  133. return;
  134. }
  135. /*
  136. **  Do sender deletion.
  137. **
  138. ** If the sender should be queued up, skip this.
  139. ** This can happen if the name server is hosed when you
  140. ** are trying to send mail.  The result is that the sender
  141. ** is instantiated in the queue as a recipient.
  142. */
  143. if (!bitset(EF_METOO, e->e_flags) &&
  144.     !QS_IS_QUEUEUP(e->e_from.q_state))
  145. {
  146. if (tTd(13, 5))
  147. {
  148. dprintf("sendall: QS_SENDER ");
  149. printaddr(&e->e_from, FALSE);
  150. }
  151. e->e_from.q_state = QS_SENDER;
  152. (void) recipient(&e->e_from, &e->e_sendqueue, 0, e);
  153. }
  154. /*
  155. **  Handle alias owners.
  156. **
  157. ** We scan up the q_alias chain looking for owners.
  158. ** We discard owners that are the same as the return path.
  159. */
  160. for (q = e->e_sendqueue; q != NULL; q = q->q_next)
  161. {
  162. register struct address *a;
  163. for (a = q; a != NULL && a->q_owner == NULL; a = a->q_alias)
  164. continue;
  165. if (a != NULL)
  166. q->q_owner = a->q_owner;
  167. if (q->q_owner != NULL &&
  168.     !QS_IS_DEAD(q->q_state) &&
  169.     strcmp(q->q_owner, e->e_from.q_paddr) == 0)
  170. q->q_owner = NULL;
  171. }
  172. if (tTd(13, 25))
  173. {
  174. dprintf("nAfter first owner pass, sendq =n");
  175. printaddr(e->e_sendqueue, TRUE);
  176. }
  177. owner = "";
  178. otherowners = 1;
  179. while (owner != NULL && otherowners > 0)
  180. {
  181. if (tTd(13, 28))
  182. dprintf("owner = "%s", otherowners = %dn",
  183. owner, otherowners);
  184. owner = NULL;
  185. otherowners = bitset(EF_SENDRECEIPT, e->e_flags) ? 1 : 0;
  186. for (q = e->e_sendqueue; q != NULL; q = q->q_next)
  187. {
  188. if (tTd(13, 30))
  189. {
  190. dprintf("Checking ");
  191. printaddr(q, FALSE);
  192. }
  193. if (QS_IS_DEAD(q->q_state))
  194. {
  195. if (tTd(13, 30))
  196. dprintf("    ... QS_IS_DEADn");
  197. continue;
  198. }
  199. if (tTd(13, 29) && !tTd(13, 30))
  200. {
  201. dprintf("Checking ");
  202. printaddr(q, FALSE);
  203. }
  204. if (q->q_owner != NULL)
  205. {
  206. if (owner == NULL)
  207. {
  208. if (tTd(13, 40))
  209. dprintf("    ... First owner = "%s"n",
  210. q->q_owner);
  211. owner = q->q_owner;
  212. }
  213. else if (owner != q->q_owner)
  214. {
  215. if (strcmp(owner, q->q_owner) == 0)
  216. {
  217. if (tTd(13, 40))
  218. dprintf("    ... Same owner = "%s"n",
  219. owner);
  220. /* make future comparisons cheap */
  221. q->q_owner = owner;
  222. }
  223. else
  224. {
  225. if (tTd(13, 40))
  226. dprintf("    ... Another owner "%s"n",
  227. q->q_owner);
  228. otherowners++;
  229. }
  230. owner = q->q_owner;
  231. }
  232. else if (tTd(13, 40))
  233. dprintf("    ... Same owner = "%s"n",
  234. owner);
  235. }
  236. else
  237. {
  238. if (tTd(13, 40))
  239. dprintf("    ... Null ownern");
  240. otherowners++;
  241. }
  242. if (QS_IS_BADADDR(q->q_state))
  243. {
  244. if (tTd(13, 30))
  245. dprintf("    ... QS_IS_BADADDRn");
  246. continue;
  247. }
  248. if (QS_IS_QUEUEUP(q->q_state))
  249. {
  250. MAILER *m = q->q_mailer;
  251. /*
  252. **  If we have temporary address failures
  253. **  (e.g., dns failure) and a fallback MX is
  254. **  set, send directly to the fallback MX host.
  255. */
  256. if (FallBackMX != NULL &&
  257.     !wordinclass(FallBackMX, 'w') &&
  258.     mode != SM_VERIFY &&
  259.     (strcmp(m->m_mailer, "[IPC]") == 0 ||
  260.      strcmp(m->m_mailer, "[TCP]") == 0) &&
  261.     m->m_argv[0] != NULL &&
  262.     (strcmp(m->m_argv[0], "TCP") == 0 ||
  263.      strcmp(m->m_argv[0], "IPC") == 0))
  264. {
  265. int len;
  266. char *p;
  267. if (tTd(13, 30))
  268. dprintf("    ... FallBackMXn");
  269. len = strlen(FallBackMX) + 3;
  270. p = xalloc(len);
  271. snprintf(p, len, "[%s]", FallBackMX);
  272. q->q_state = QS_OK;
  273. q->q_host = p;
  274. }
  275. else
  276. {
  277. if (tTd(13, 30))
  278. dprintf("    ... QS_IS_QUEUEUPn");
  279. continue;
  280. }
  281. }
  282. /*
  283. **  If this mailer is expensive, and if we don't
  284. **  want to make connections now, just mark these
  285. **  addresses and return.  This is useful if we
  286. **  want to batch connections to reduce load.  This
  287. **  will cause the messages to be queued up, and a
  288. **  daemon will come along to send the messages later.
  289. */
  290. if (NoConnect && !Verbose &&
  291.     bitnset(M_EXPENSIVE, q->q_mailer->m_flags))
  292. {
  293. if (tTd(13, 30))
  294. dprintf("    ... expensiven");
  295. q->q_state = QS_QUEUEUP;
  296. expensive = TRUE;
  297. }
  298. else if (bitnset(M_HOLD, q->q_mailer->m_flags) &&
  299.  QueueLimitId == NULL &&
  300.  QueueLimitSender == NULL &&
  301.  QueueLimitRecipient == NULL)
  302. {
  303. if (tTd(13, 30))
  304. dprintf("    ... holdn");
  305. q->q_state = QS_QUEUEUP;
  306. expensive = TRUE;
  307. }
  308. else
  309. {
  310. if (tTd(13, 30))
  311. dprintf("    ... deliverablen");
  312. somedeliveries = TRUE;
  313. }
  314. }
  315. if (owner != NULL && otherowners > 0)
  316. {
  317. /*
  318. **  Split this envelope into two.
  319. */
  320. ee = (ENVELOPE *) xalloc(sizeof *ee);
  321. *ee = *e;
  322. ee->e_message = NULL;
  323. ee->e_id = NULL;
  324. assign_queueid(ee);
  325. if (tTd(13, 1))
  326. dprintf("sendall: split %s into %s, owner = "%s", otherowners = %dn",
  327. e->e_id, ee->e_id, owner, otherowners);
  328. ee->e_header = copyheader(e->e_header);
  329. ee->e_sendqueue = copyqueue(e->e_sendqueue);
  330. ee->e_errorqueue = copyqueue(e->e_errorqueue);
  331. ee->e_flags = e->e_flags & ~(EF_INQUEUE|EF_CLRQUEUE|EF_FATALERRS|EF_SENDRECEIPT|EF_RET_PARAM);
  332. ee->e_flags |= EF_NORECEIPT;
  333. setsender(owner, ee, NULL, '', TRUE);
  334. if (tTd(13, 5))
  335. {
  336. dprintf("sendall(split): QS_SENDER ");
  337. printaddr(&ee->e_from, FALSE);
  338. }
  339. ee->e_from.q_state = QS_SENDER;
  340. ee->e_dfp = NULL;
  341. ee->e_lockfp = NULL;
  342. ee->e_xfp = NULL;
  343. ee->e_queuedir = e->e_queuedir;
  344. ee->e_errormode = EM_MAIL;
  345. ee->e_sibling = splitenv;
  346. ee->e_statmsg = NULL;
  347. splitenv = ee;
  348. for (q = e->e_sendqueue; q != NULL; q = q->q_next)
  349. {
  350. if (q->q_owner == owner)
  351. {
  352. q->q_state = QS_CLONED;
  353. if (tTd(13, 6))
  354. dprintf("t... stripping %s from original envelopen",
  355. q->q_paddr);
  356. }
  357. }
  358. for (q = ee->e_sendqueue; q != NULL; q = q->q_next)
  359. {
  360. if (q->q_owner != owner)
  361. {
  362. q->q_state = QS_CLONED;
  363. if (tTd(13, 6))
  364. dprintf("t... dropping %s from cloned envelopen",
  365. q->q_paddr);
  366. }
  367. else
  368. {
  369. /* clear DSN parameters */
  370. q->q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS);
  371. q->q_flags |= DefaultNotify & ~QPINGONSUCCESS;
  372. if (tTd(13, 6))
  373. dprintf("t... moving %s to cloned envelopen",
  374. q->q_paddr);
  375. }
  376. }
  377. if (mode != SM_VERIFY && bitset(EF_HAS_DF, e->e_flags))
  378. dup_queue_file(e, ee, 'd');
  379. /*
  380. **  Give the split envelope access to the parent
  381. **  transcript file for errors obtained while
  382. **  processing the recipients (done before the
  383. **  envelope splitting).
  384. */
  385. if (e->e_xfp != NULL)
  386. ee->e_xfp = bfdup(e->e_xfp);
  387. /* failed to dup e->e_xfp, start a new transcript */
  388. if (ee->e_xfp == NULL)
  389. openxscript(ee);
  390. if (mode != SM_VERIFY && LogLevel > 4)
  391. sm_syslog(LOG_INFO, ee->e_id,
  392.   "clone %s, owner=%s",
  393.   e->e_id, owner);
  394. }
  395. }
  396. if (owner != NULL)
  397. {
  398. setsender(owner, e, NULL, '', TRUE);
  399. if (tTd(13, 5))
  400. {
  401. dprintf("sendall(owner): QS_SENDER ");
  402. printaddr(&e->e_from, FALSE);
  403. }
  404. e->e_from.q_state = QS_SENDER;
  405. e->e_errormode = EM_MAIL;
  406. e->e_flags |= EF_NORECEIPT;
  407. e->e_flags &= ~EF_FATALERRS;
  408. }
  409. /* if nothing to be delivered, just queue up everything */
  410. if (!somedeliveries && mode != SM_QUEUE && mode != SM_DEFER &&
  411.     mode != SM_VERIFY)
  412. {
  413. if (tTd(13, 29))
  414. dprintf("No deliveries: auto-queuingn");
  415. mode = SM_QUEUE;
  416. /* treat this as a delivery in terms of counting tries */
  417. e->e_dtime = curtime();
  418. if (!expensive)
  419. e->e_ntries++;
  420. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  421. {
  422. ee->e_dtime = curtime();
  423. if (!expensive)
  424. ee->e_ntries++;
  425. }
  426. }
  427. #if QUEUE
  428. if ((mode == SM_QUEUE || mode == SM_DEFER || mode == SM_FORK ||
  429.      (mode != SM_VERIFY && SuperSafe)) &&
  430.     (!bitset(EF_INQUEUE, e->e_flags) || splitenv != NULL))
  431. {
  432. /* be sure everything is instantiated in the queue */
  433. queueup(e, mode == SM_QUEUE || mode == SM_DEFER);
  434. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  435. queueup(ee, mode == SM_QUEUE || mode == SM_DEFER);
  436. }
  437. #endif /* QUEUE */
  438. if (tTd(62, 10))
  439. checkfds("after envelope splitting");
  440. /*
  441. **  If we belong in background, fork now.
  442. */
  443. if (tTd(13, 20))
  444. {
  445. dprintf("sendall: final mode = %cn", mode);
  446. if (tTd(13, 21))
  447. {
  448. dprintf("n================ Final Send Queue(s) =====================n");
  449. dprintf("n  *** Envelope %s, e_from=%s ***n",
  450. e->e_id, e->e_from.q_paddr);
  451. printaddr(e->e_sendqueue, TRUE);
  452. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  453. {
  454. dprintf("n  *** Envelope %s, e_from=%s ***n",
  455. ee->e_id, ee->e_from.q_paddr);
  456. printaddr(ee->e_sendqueue, TRUE);
  457. }
  458. dprintf("==========================================================nn");
  459. }
  460. }
  461. switch (mode)
  462. {
  463.   case SM_VERIFY:
  464. Verbose = 2;
  465. break;
  466.   case SM_QUEUE:
  467.   case SM_DEFER:
  468. #if HASFLOCK
  469.   queueonly:
  470. #endif /* HASFLOCK */
  471. if (e->e_nrcpts > 0)
  472. e->e_flags |= EF_INQUEUE;
  473. dropenvelope(e, splitenv != NULL);
  474. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  475. {
  476. if (ee->e_nrcpts > 0)
  477. ee->e_flags |= EF_INQUEUE;
  478. dropenvelope(ee, FALSE);
  479. }
  480. return;
  481.   case SM_FORK:
  482. if (e->e_xfp != NULL)
  483. (void) fflush(e->e_xfp);
  484. #if !HASFLOCK
  485. /*
  486. **  Since fcntl locking has the interesting semantic that
  487. **  the lock is owned by a process, not by an open file
  488. **  descriptor, we have to flush this to the queue, and
  489. **  then restart from scratch in the child.
  490. */
  491. {
  492. /* save id for future use */
  493. char *qid = e->e_id;
  494. /* now drop the envelope in the parent */
  495. e->e_flags |= EF_INQUEUE;
  496. dropenvelope(e, splitenv != NULL);
  497. /* arrange to reacquire lock after fork */
  498. e->e_id = qid;
  499. }
  500. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  501. {
  502. /* save id for future use */
  503. char *qid = ee->e_id;
  504. /* drop envelope in parent */
  505. ee->e_flags |= EF_INQUEUE;
  506. dropenvelope(ee, FALSE);
  507. /* and save qid for reacquisition */
  508. ee->e_id = qid;
  509. }
  510. #endif /* !HASFLOCK */
  511. /*
  512. **  Since the delivery may happen in a child and the parent
  513. **  does not wait, the parent may close the maps thereby
  514. **  removing any shared memory used by the map.  Therefore,
  515. **  close the maps now so the child will dynamically open
  516. **  them if necessary.
  517. */
  518. closemaps();
  519. pid = fork();
  520. if (pid < 0)
  521. {
  522. syserr("deliver: fork 1");
  523. #if HASFLOCK
  524. goto queueonly;
  525. #else /* HASFLOCK */
  526. e->e_id = NULL;
  527. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  528. ee->e_id = NULL;
  529. return;
  530. #endif /* HASFLOCK */
  531. }
  532. else if (pid > 0)
  533. {
  534. #if HASFLOCK
  535. /* be sure we leave the temp files to our child */
  536. /* close any random open files in the envelope */
  537. closexscript(e);
  538. if (e->e_dfp != NULL)
  539. (void) bfclose(e->e_dfp);
  540. e->e_dfp = NULL;
  541. e->e_flags &= ~EF_HAS_DF;
  542. /* can't call unlockqueue to avoid unlink of xfp */
  543. if (e->e_lockfp != NULL)
  544. (void) fclose(e->e_lockfp);
  545. else
  546. syserr("%s: sendall: null lockfp", e->e_id);
  547. e->e_lockfp = NULL;
  548. #endif /* HASFLOCK */
  549. /* make sure the parent doesn't own the envelope */
  550. e->e_id = NULL;
  551. /* catch intermediate zombie */
  552. (void) waitfor(pid);
  553. return;
  554. }
  555. /* double fork to avoid zombies */
  556. pid = fork();
  557. if (pid > 0)
  558. exit(EX_OK);
  559. save_errno = errno;
  560. /* be sure we are immune from the terminal */
  561. disconnect(2, e);
  562. clearstats();
  563. /* prevent parent from waiting if there was an error */
  564. if (pid < 0)
  565. {
  566. errno = save_errno;
  567. syserr("deliver: fork 2");
  568. #if HASFLOCK
  569. e->e_flags |= EF_INQUEUE;
  570. #else /* HASFLOCK */
  571. e->e_id = NULL;
  572. #endif /* HASFLOCK */
  573. finis(TRUE, ExitStat);
  574. }
  575. /* be sure to give error messages in child */
  576. QuickAbort = FALSE;
  577. /*
  578. **  Close any cached connections.
  579. **
  580. ** We don't send the QUIT protocol because the parent
  581. ** still knows about the connection.
  582. **
  583. ** This should only happen when delivering an error
  584. ** message.
  585. */
  586. mci_flush(FALSE, NULL);
  587. #if HASFLOCK
  588. break;
  589. #else /* HASFLOCK */
  590. /*
  591. **  Now reacquire and run the various queue files.
  592. */
  593. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  594. {
  595. ENVELOPE *sibling = ee->e_sibling;
  596. (void) dowork(ee->e_queuedir, ee->e_id,
  597.       FALSE, FALSE, ee);
  598. ee->e_sibling = sibling;
  599. }
  600. (void) dowork(e->e_queuedir, e->e_id,
  601.       FALSE, FALSE, e);
  602. finis(TRUE, ExitStat);
  603. #endif /* HASFLOCK */
  604. }
  605. sendenvelope(e, mode);
  606. dropenvelope(e, TRUE);
  607. for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
  608. {
  609. CurEnv = ee;
  610. if (mode != SM_VERIFY)
  611. openxscript(ee);
  612. sendenvelope(ee, mode);
  613. dropenvelope(ee, TRUE);
  614. }
  615. CurEnv = e;
  616. Verbose = oldverbose;
  617. if (mode == SM_FORK)
  618. finis(TRUE, ExitStat);
  619. }
  620. static void
  621. sendenvelope(e, mode)
  622. register ENVELOPE *e;
  623. int mode;
  624. {
  625. register ADDRESS *q;
  626. bool didany;
  627. if (tTd(13, 10))
  628. dprintf("sendenvelope(%s) e_flags=0x%lxn",
  629. e->e_id == NULL ? "[NOQUEUE]" : e->e_id,
  630. e->e_flags);
  631. if (LogLevel > 80)
  632. sm_syslog(LOG_DEBUG, e->e_id,
  633.   "sendenvelope, flags=0x%lx",
  634.   e->e_flags);
  635. /*
  636. **  If we have had global, fatal errors, don't bother sending
  637. **  the message at all if we are in SMTP mode.  Local errors
  638. **  (e.g., a single address failing) will still cause the other
  639. **  addresses to be sent.
  640. */
  641. if (bitset(EF_FATALERRS, e->e_flags) &&
  642.     (OpMode == MD_SMTP || OpMode == MD_DAEMON))
  643. {
  644. e->e_flags |= EF_CLRQUEUE;
  645. return;
  646. }
  647. /* Don't attempt deliveries if we want to bounce now */
  648. if (!bitset(EF_RESPONSE, e->e_flags) &&
  649.     TimeOuts.to_q_return[e->e_timeoutclass] == NOW)
  650. return;
  651. /*
  652. **  Run through the list and send everything.
  653. **
  654. ** Set EF_GLOBALERRS so that error messages during delivery
  655. ** result in returned mail.
  656. */
  657. e->e_nsent = 0;
  658. e->e_flags |= EF_GLOBALERRS;
  659. define(macid("{envid}", NULL), e->e_envid, e);
  660. define(macid("{bodytype}", NULL), e->e_bodytype, e);
  661. didany = FALSE;
  662. /* now run through the queue */
  663. for (q = e->e_sendqueue; q != NULL; q = q->q_next)
  664. {
  665. #if XDEBUG
  666. char wbuf[MAXNAME + 20];
  667. (void) snprintf(wbuf, sizeof wbuf, "sendall(%.*s)",
  668. MAXNAME, q->q_paddr);
  669. checkfd012(wbuf);
  670. #endif /* XDEBUG */
  671. if (mode == SM_VERIFY)
  672. {
  673. e->e_to = q->q_paddr;
  674. if (QS_IS_SENDABLE(q->q_state))
  675. {
  676. if (q->q_host != NULL && q->q_host[0] != '')
  677. message("deliverable: mailer %s, host %s, user %s",
  678. q->q_mailer->m_name,
  679. q->q_host,
  680. q->q_user);
  681. else
  682. message("deliverable: mailer %s, user %s",
  683. q->q_mailer->m_name,
  684. q->q_user);
  685. }
  686. }
  687. else if (QS_IS_OK(q->q_state))
  688. {
  689. #if QUEUE
  690. /*
  691. **  Checkpoint the send list every few addresses
  692. */
  693. if (e->e_nsent >= CheckpointInterval)
  694. {
  695. queueup(e, FALSE);
  696. e->e_nsent = 0;
  697. }
  698. #endif /* QUEUE */
  699. (void) deliver(e, q);
  700. didany = TRUE;
  701. }
  702. }
  703. if (didany)
  704. {
  705. e->e_dtime = curtime();
  706. e->e_ntries++;
  707. }
  708. #if XDEBUG
  709. checkfd012("end of sendenvelope");
  710. #endif /* XDEBUG */
  711. }
  712. /*
  713. **  DUP_QUEUE_FILE -- duplicate a queue file into a split queue
  714. **
  715. ** Parameters:
  716. ** e -- the existing envelope
  717. ** ee -- the new envelope
  718. ** type -- the queue file type (e.g., 'd')
  719. **
  720. ** Returns:
  721. ** none
  722. */
  723. static void
  724. dup_queue_file(e, ee, type)
  725. struct envelope *e, *ee;
  726. int type;
  727. {
  728. char f1buf[MAXPATHLEN], f2buf[MAXPATHLEN];
  729. ee->e_dfp = NULL;
  730. ee->e_xfp = NULL;
  731. /*
  732. **  Make sure both are in the same directory.
  733. */
  734. snprintf(f1buf, sizeof f1buf, "%s", queuename(e, type));
  735. snprintf(f2buf, sizeof f2buf, "%s", queuename(ee, type));
  736. if (link(f1buf, f2buf) < 0)
  737. {
  738. int save_errno = errno;
  739. syserr("sendall: link(%s, %s)", f1buf, f2buf);
  740. if (save_errno == EEXIST)
  741. {
  742. if (unlink(f2buf) < 0)
  743. {
  744. syserr("!sendall: unlink(%s): permanent",
  745. f2buf);
  746. /* NOTREACHED */
  747. }
  748. if (link(f1buf, f2buf) < 0)
  749. {
  750. syserr("!sendall: link(%s, %s): permanent",
  751. f1buf, f2buf);
  752. /* NOTREACHED */
  753. }
  754. }
  755. }
  756. }
  757. /*
  758. **  DOFORK -- do a fork, retrying a couple of times on failure.
  759. **
  760. ** This MUST be a macro, since after a vfork we are running
  761. ** two processes on the same stack!!!
  762. **
  763. ** Parameters:
  764. ** none.
  765. **
  766. ** Returns:
  767. ** From a macro???  You've got to be kidding!
  768. **
  769. ** Side Effects:
  770. ** Modifies the ==> LOCAL <== variable 'pid', leaving:
  771. ** pid of child in parent, zero in child.
  772. ** -1 on unrecoverable error.
  773. **
  774. ** Notes:
  775. ** I'm awfully sorry this looks so awful.  That's
  776. ** vfork for you.....
  777. */
  778. #define NFORKTRIES 5
  779. #ifndef FORK
  780. # define FORK fork
  781. #endif /* ! FORK */
  782. #define DOFORK(fORKfN) 
  783. {
  784. register int i;
  785. for (i = NFORKTRIES; --i >= 0; )
  786. {
  787. pid = fORKfN();
  788. if (pid >= 0)
  789. break;
  790. if (i > 0)
  791. (void) sleep((unsigned) NFORKTRIES - i);
  792. }
  793. }
  794. /*
  795. **  DOFORK -- simple fork interface to DOFORK.
  796. **
  797. ** Parameters:
  798. ** none.
  799. **
  800. ** Returns:
  801. ** pid of child in parent.
  802. ** zero in child.
  803. ** -1 on error.
  804. **
  805. ** Side Effects:
  806. ** returns twice, once in parent and once in child.
  807. */
  808. int
  809. dofork()
  810. {
  811. register pid_t pid = -1;
  812. DOFORK(fork);
  813. return pid;
  814. }
  815. /*
  816. **  DELIVER -- Deliver a message to a list of addresses.
  817. **
  818. ** This routine delivers to everyone on the same host as the
  819. ** user on the head of the list.  It is clever about mailers
  820. ** that don't handle multiple users.  It is NOT guaranteed
  821. ** that it will deliver to all these addresses however -- so
  822. ** deliver should be called once for each address on the
  823. ** list.
  824. **
  825. ** Parameters:
  826. ** e -- the envelope to deliver.
  827. ** firstto -- head of the address list to deliver to.
  828. **
  829. ** Returns:
  830. ** zero -- successfully delivered.
  831. ** else -- some failure, see ExitStat for more info.
  832. **
  833. ** Side Effects:
  834. ** The standard input is passed off to someone.
  835. */
  836. #ifndef NO_UID
  837. # define NO_UID -1
  838. #endif /* ! NO_UID */
  839. #ifndef NO_GID
  840. # define NO_GID -1
  841. #endif /* ! NO_GID */
  842. static int
  843. deliver(e, firstto)
  844. register ENVELOPE *e;
  845. ADDRESS *firstto;
  846. {
  847. char *host; /* host being sent to */
  848. char *user; /* user being sent to */
  849. char **pvp;
  850. register char **mvp;
  851. register char *p;
  852. register MAILER *m; /* mailer for this recipient */
  853. ADDRESS *volatile ctladdr;
  854. ADDRESS *volatile contextaddr = NULL;
  855. register MCI *volatile mci;
  856. register ADDRESS *to = firstto;
  857. volatile bool clever = FALSE; /* running user smtp to this mailer */
  858. ADDRESS *volatile tochain = NULL; /* users chain in this mailer call */
  859. int rcode; /* response code */
  860. int lmtp_rcode = EX_OK;
  861. int nummxhosts = 0; /* number of MX hosts available */
  862. int hostnum = 0; /* current MX host index */
  863. char *firstsig; /* signature of firstto */
  864. pid_t pid = -1;
  865. char *volatile curhost;
  866. register u_short port = 0;
  867. #if NETUNIX
  868. char *mux_path = NULL; /* path to UNIX domain socket */
  869. #endif /* NETUNIX */
  870. time_t xstart;
  871. bool suidwarn;
  872. bool anyok; /* at least one address was OK */
  873. bool goodmxfound = FALSE; /* at least one MX was OK */
  874. bool ovr;
  875. int mpvect[2];
  876. int rpvect[2];
  877. char *mxhosts[MAXMXHOSTS + 1];
  878. char *pv[MAXPV + 1];
  879. char tobuf[TOBUFSIZE]; /* text line of to people */
  880. char buf[MAXNAME + 1];
  881. char rpathbuf[MAXNAME + 1]; /* translated return path */
  882. errno = 0;
  883. if (!QS_IS_OK(to->q_state))
  884. return 0;
  885. suidwarn = geteuid() == 0;
  886. m = to->q_mailer;
  887. host = to->q_host;
  888. CurEnv = e; /* just in case */
  889. e->e_statmsg = NULL;
  890. #if SMTP
  891. SmtpError[0] = '';
  892. #endif /* SMTP */
  893. xstart = curtime();
  894. if (tTd(10, 1))
  895. dprintf("n--deliver, id=%s, mailer=%s, host=`%s', first user=`%s'n",
  896. e->e_id, m->m_name, host, to->q_user);
  897. if (tTd(10, 100))
  898. printopenfds(FALSE);
  899. /*
  900. **  Clear $&{client_*} macros if this is a bounce message to
  901. **  prevent rejection by check_compat ruleset.
  902. */
  903. if (bitset(EF_RESPONSE, e->e_flags))
  904. {
  905. define(macid("{client_name}", NULL), "", e);
  906. define(macid("{client_addr}", NULL), "", e);
  907. define(macid("{client_port}", NULL), "", e);
  908. }
  909. /*
  910. **  Do initial argv setup.
  911. ** Insert the mailer name.  Notice that $x expansion is
  912. ** NOT done on the mailer name.  Then, if the mailer has
  913. ** a picky -f flag, we insert it as appropriate.  This
  914. ** code does not check for 'pv' overflow; this places a
  915. ** manifest lower limit of 4 for MAXPV.
  916. ** The from address rewrite is expected to make
  917. ** the address relative to the other end.
  918. */
  919. /* rewrite from address, using rewriting rules */
  920. rcode = EX_OK;
  921. if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags))
  922. p = e->e_sender;
  923. else
  924. p = e->e_from.q_paddr;
  925. p = remotename(p, m, RF_SENDERADDR|RF_CANONICAL, &rcode, e);
  926. if (strlen(p) >= (SIZE_T) sizeof rpathbuf)
  927. {
  928. p = shortenstring(p, MAXSHORTSTR);
  929. syserr("remotename: huge return %s", p);
  930. }
  931. snprintf(rpathbuf, sizeof rpathbuf, "%s", p);
  932. define('g', rpathbuf, e); /* translated return path */
  933. define('h', host, e); /* to host */
  934. Errors = 0;
  935. pvp = pv;
  936. *pvp++ = m->m_argv[0];
  937. /* insert -f or -r flag as appropriate */
  938. if (FromFlag &&
  939.     (bitnset(M_FOPT, m->m_flags) ||
  940.      bitnset(M_ROPT, m->m_flags)))
  941. {
  942. if (bitnset(M_FOPT, m->m_flags))
  943. *pvp++ = "-f";
  944. else
  945. *pvp++ = "-r";
  946. *pvp++ = newstr(rpathbuf);
  947. }
  948. /*
  949. **  Append the other fixed parts of the argv.  These run
  950. **  up to the first entry containing "$u".  There can only
  951. **  be one of these, and there are only a few more slots
  952. **  in the pv after it.
  953. */
  954. for (mvp = m->m_argv; (p = *++mvp) != NULL; )
  955. {
  956. /* can't use strchr here because of sign extension problems */
  957. while (*p != '')
  958. {
  959. if ((*p++ & 0377) == MACROEXPAND)
  960. {
  961. if (*p == 'u')
  962. break;
  963. }
  964. }
  965. if (*p != '')
  966. break;
  967. /* this entry is safe -- go ahead and process it */
  968. expand(*mvp, buf, sizeof buf, e);
  969. *pvp++ = newstr(buf);
  970. if (pvp >= &pv[MAXPV - 3])
  971. {
  972. syserr("554 5.3.5 Too many parameters to %s before $u",
  973.        pv[0]);
  974. return -1;
  975. }
  976. }
  977. /*
  978. **  If we have no substitution for the user name in the argument
  979. **  list, we know that we must supply the names otherwise -- and
  980. **  SMTP is the answer!!
  981. */
  982. if (*mvp == NULL)
  983. {
  984. /* running SMTP */
  985. #if SMTP
  986. clever = TRUE;
  987. *pvp = NULL;
  988. #else /* SMTP */
  989. /* oops!  we don't implement SMTP */
  990. syserr("554 5.3.5 SMTP style mailer not implemented");
  991. return EX_SOFTWARE;
  992. #endif /* SMTP */
  993. }
  994. /*
  995. **  At this point *mvp points to the argument with $u.  We
  996. **  run through our address list and append all the addresses
  997. **  we can.  If we run out of space, do not fret!  We can
  998. **  always send another copy later.
  999. */
  1000. tobuf[0] = '';
  1001. e->e_to = tobuf;
  1002. ctladdr = NULL;
  1003. firstsig = hostsignature(firstto->q_mailer, firstto->q_host);
  1004. for (; to != NULL; to = to->q_next)
  1005. {
  1006. /* avoid sending multiple recipients to dumb mailers */
  1007. if (tobuf[0] != '' && !bitnset(M_MUSER, m->m_flags))
  1008. break;
  1009. /* if already sent or not for this host, don't send */
  1010. if (!QS_IS_OK(to->q_state) ||
  1011.     to->q_mailer != firstto->q_mailer ||
  1012.     strcmp(hostsignature(to->q_mailer, to->q_host),
  1013.    firstsig) != 0)
  1014. continue;
  1015. /* avoid overflowing tobuf */
  1016. if (sizeof tobuf < (strlen(to->q_paddr) + strlen(tobuf) + 2))
  1017. break;
  1018. if (tTd(10, 1))
  1019. {
  1020. dprintf("nsend to ");
  1021. printaddr(to, FALSE);
  1022. }
  1023. /* compute effective uid/gid when sending */
  1024. if (bitnset(M_RUNASRCPT, to->q_mailer->m_flags))
  1025. contextaddr = ctladdr = getctladdr(to);
  1026. if (tTd(10, 2))
  1027. {
  1028. dprintf("ctladdr=");
  1029. printaddr(ctladdr, FALSE);
  1030. }
  1031. user = to->q_user;
  1032. e->e_to = to->q_paddr;
  1033. /*
  1034. **  Check to see that these people are allowed to
  1035. **  talk to each other.
  1036. */
  1037. if (m->m_maxsize != 0 && e->e_msgsize > m->m_maxsize)
  1038. {
  1039. e->e_flags |= EF_NO_BODY_RETN;
  1040. if (bitnset(M_LOCALMAILER, to->q_mailer->m_flags))
  1041. to->q_status = "5.2.3";
  1042. else
  1043. to->q_status = "5.3.4";
  1044. /* set to->q_rstatus = NULL; or to the following? */
  1045. usrerrenh(to->q_status,
  1046.        "552 Message is too large; %ld bytes max",
  1047.        m->m_maxsize);
  1048. markfailure(e, to, NULL, EX_UNAVAILABLE, FALSE);
  1049. giveresponse(EX_UNAVAILABLE, m, NULL, ctladdr, xstart,
  1050.      e);
  1051. continue;
  1052. }
  1053. #if NAMED_BIND
  1054. h_errno = 0;
  1055. #endif /* NAMED_BIND */
  1056. ovr = TRUE;
  1057. /* do config file checking of compatibility */
  1058. rcode = rscheck("check_compat",
  1059. e->e_from.q_paddr, to->q_paddr, e, TRUE, TRUE);
  1060. if (rcode == EX_OK)
  1061. {
  1062. /* do in-code checking if not discarding */
  1063. if (!bitset(EF_DISCARD, e->e_flags))
  1064. {
  1065. rcode = checkcompat(to, e);
  1066. ovr = FALSE;
  1067. }
  1068. }
  1069. if (rcode != EX_OK)
  1070. {
  1071. markfailure(e, to, NULL, rcode, ovr);
  1072. giveresponse(rcode, m, NULL, ctladdr, xstart, e);
  1073. continue;
  1074. }
  1075. if (bitset(EF_DISCARD, e->e_flags))
  1076. {
  1077. if (tTd(10, 5))
  1078. {
  1079. dprintf("deliver: discarding recipient ");
  1080. printaddr(to, FALSE);
  1081. }
  1082. /* pretend the message was sent */
  1083. /* XXX should we log something here? */
  1084. to->q_state = QS_DISCARDED;
  1085. /*
  1086. **  Remove discard bit to prevent discard of
  1087. **  future recipients.  This is safe because the
  1088. **  true "global discard" has been handled before
  1089. **  we get here.
  1090. */
  1091. e->e_flags &= ~EF_DISCARD;
  1092. continue;
  1093. }
  1094. /*
  1095. **  Strip quote bits from names if the mailer is dumb
  1096. ** about them.
  1097. */
  1098. if (bitnset(M_STRIPQ, m->m_flags))
  1099. {
  1100. stripquotes(user);
  1101. stripquotes(host);
  1102. }
  1103. /* hack attack -- delivermail compatibility */
  1104. if (m == ProgMailer && *user == '|')
  1105. user++;
  1106. /*
  1107. **  If an error message has already been given, don't
  1108. ** bother to send to this address.
  1109. **
  1110. ** >>>>>>>>>> This clause assumes that the local mailer
  1111. ** >> NOTE >> cannot do any further aliasing; that
  1112. ** >>>>>>>>>> function is subsumed by sendmail.
  1113. */
  1114. if (!QS_IS_OK(to->q_state))
  1115. continue;
  1116. /*
  1117. **  See if this user name is "special".
  1118. ** If the user name has a slash in it, assume that this
  1119. ** is a file -- send it off without further ado.  Note
  1120. ** that this type of addresses is not processed along
  1121. ** with the others, so we fudge on the To person.
  1122. */
  1123. if (strcmp(m->m_mailer, "[FILE]") == 0)
  1124. {
  1125. define('u', user, e); /* to user */
  1126. p = to->q_home;
  1127. if (p == NULL && ctladdr != NULL)
  1128. p = ctladdr->q_home;
  1129. define('z', p, e); /* user's home */
  1130. expand(m->m_argv[1], buf, sizeof buf, e);
  1131. if (strlen(buf) > 0)
  1132. rcode = mailfile(buf, m, ctladdr, SFF_CREAT, e);
  1133. else
  1134. {
  1135. syserr("empty filename specification for mailer %s",
  1136.        m->m_name);
  1137. rcode = EX_CONFIG;
  1138. }
  1139. giveresponse(rcode, m, NULL, ctladdr, xstart, e);
  1140. markfailure(e, to, NULL, rcode, TRUE);
  1141. e->e_nsent++;
  1142. if (rcode == EX_OK)
  1143. {
  1144. to->q_state = QS_SENT;
  1145. if (bitnset(M_LOCALMAILER, m->m_flags) &&
  1146.     bitset(QPINGONSUCCESS, to->q_flags))
  1147. {
  1148. to->q_flags |= QDELIVERED;
  1149. to->q_status = "2.1.5";
  1150. fprintf(e->e_xfp, "%s... Successfully deliveredn",
  1151. to->q_paddr);
  1152. }
  1153. }
  1154. to->q_statdate = curtime();
  1155. markstats(e, to, FALSE);
  1156. continue;
  1157. }
  1158. /*
  1159. **  Address is verified -- add this user to mailer
  1160. **  argv, and add it to the print list of recipients.
  1161. */
  1162. /* link together the chain of recipients */
  1163. to->q_tchain = tochain;
  1164. tochain = to;
  1165. /* create list of users for error messages */
  1166. (void) strlcat(tobuf, ",", sizeof tobuf);
  1167. (void) strlcat(tobuf, to->q_paddr, sizeof tobuf);
  1168. define('u', user, e); /* to user */
  1169. p = to->q_home;
  1170. if (p == NULL && ctladdr != NULL)
  1171. p = ctladdr->q_home;
  1172. define('z', p, e); /* user's home */
  1173. /* set the ${dsn_notify} macro if applicable */
  1174. if (bitset(QHASNOTIFY, to->q_flags))
  1175. {
  1176. char notify[MAXLINE];
  1177. notify[0] = '';
  1178. if (bitset(QPINGONSUCCESS, to->q_flags))
  1179. (void) strlcat(notify, "SUCCESS,",
  1180.        sizeof notify);
  1181. if (bitset(QPINGONFAILURE, to->q_flags))
  1182. (void) strlcat(notify, "FAILURE,",
  1183.        sizeof notify);
  1184. if (bitset(QPINGONDELAY, to->q_flags))
  1185. (void) strlcat(notify, "DELAY,", sizeof notify);
  1186. /* Set to NEVER or drop trailing comma */
  1187. if (notify[0] == '')
  1188. (void) strlcat(notify, "NEVER", sizeof notify);
  1189. else
  1190. notify[strlen(notify) - 1] = '';
  1191. define(macid("{dsn_notify}", NULL), newstr(notify), e);
  1192. }
  1193. else
  1194. define(macid("{dsn_notify}", NULL), NULL, e);
  1195. /*
  1196. **  Expand out this user into argument list.
  1197. */
  1198. if (!clever)
  1199. {
  1200. expand(*mvp, buf, sizeof buf, e);
  1201. *pvp++ = newstr(buf);
  1202. if (pvp >= &pv[MAXPV - 2])
  1203. {
  1204. /* allow some space for trailing parms */
  1205. break;
  1206. }
  1207. }
  1208. }
  1209. /* see if any addresses still exist */
  1210. if (tobuf[0] == '')
  1211. {
  1212. define('g', (char *) NULL, e);
  1213. return 0;
  1214. }
  1215. /* print out messages as full list */
  1216. e->e_to = tobuf + 1;
  1217. /*
  1218. **  Fill out any parameters after the $u parameter.
  1219. */
  1220. while (!clever && *++mvp != NULL)
  1221. {
  1222. expand(*mvp, buf, sizeof buf, e);
  1223. *pvp++ = newstr(buf);
  1224. if (pvp >= &pv[MAXPV])
  1225. syserr("554 5.3.0 deliver: pv overflow after $u for %s",
  1226.        pv[0]);
  1227. }
  1228. *pvp++ = NULL;
  1229. /*
  1230. **  Call the mailer.
  1231. ** The argument vector gets built, pipes
  1232. ** are created as necessary, and we fork & exec as
  1233. ** appropriate.
  1234. ** If we are running SMTP, we just need to clean up.
  1235. */
  1236. /* XXX this seems a bit wierd */
  1237. if (ctladdr == NULL && m != ProgMailer && m != FileMailer &&
  1238.     bitset(QGOODUID, e->e_from.q_flags))
  1239. ctladdr = &e->e_from;
  1240. #if NAMED_BIND
  1241. if (ConfigLevel < 2)
  1242. _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */
  1243. #endif /* NAMED_BIND */
  1244. if (tTd(11, 1))
  1245. {
  1246. dprintf("openmailer:");
  1247. printav(pv);
  1248. }
  1249. errno = 0;
  1250. #if NAMED_BIND
  1251. h_errno = 0;
  1252. #endif /* NAMED_BIND */
  1253. CurHostName = NULL;
  1254. /*
  1255. **  Deal with the special case of mail handled through an IPC
  1256. **  connection.
  1257. ** In this case we don't actually fork.  We must be
  1258. ** running SMTP for this to work.  We will return a
  1259. ** zero pid to indicate that we are running IPC.
  1260. **  We also handle a debug version that just talks to stdin/out.
  1261. */
  1262. curhost = NULL;
  1263. SmtpPhase = NULL;
  1264. mci = NULL;
  1265. #if XDEBUG
  1266. {
  1267. char wbuf[MAXLINE];
  1268. /* make absolutely certain 0, 1, and 2 are in use */
  1269. snprintf(wbuf, sizeof wbuf, "%s... openmailer(%s)",
  1270. shortenstring(e->e_to, MAXSHORTSTR), m->m_name);
  1271. checkfd012(wbuf);
  1272. }
  1273. #endif /* XDEBUG */
  1274. /* check for 8-bit available */
  1275. if (bitset(EF_HAS8BIT, e->e_flags) &&
  1276.     bitnset(M_7BITS, m->m_flags) &&
  1277.     (bitset(EF_DONT_MIME, e->e_flags) ||
  1278.      !(bitset(MM_MIME8BIT, MimeMode) ||
  1279.        (bitset(EF_IS_MIME, e->e_flags) &&
  1280. bitset(MM_CVTMIME, MimeMode)))))
  1281. {
  1282. e->e_status = "5.6.3";
  1283. usrerrenh(e->e_status,
  1284.        "554 Cannot send 8-bit data to 7-bit destination");
  1285. rcode = EX_DATAERR;
  1286. goto give_up;
  1287. }
  1288. if (tTd(62, 8))
  1289. checkfds("before delivery");
  1290. /* check for Local Person Communication -- not for mortals!!! */
  1291. if (strcmp(m->m_mailer, "[LPC]") == 0)
  1292. {
  1293. mci = (MCI *) xalloc(sizeof *mci);
  1294. memset((char *) mci, '', sizeof *mci);
  1295. mci->mci_in = stdin;
  1296. mci->mci_out = stdout;
  1297. mci->mci_state = clever ? MCIS_OPENING : MCIS_OPEN;
  1298. mci->mci_mailer = m;
  1299. }
  1300. else if (strcmp(m->m_mailer, "[IPC]") == 0 ||
  1301.  strcmp(m->m_mailer, "[TCP]") == 0)
  1302. {
  1303. #if DAEMON
  1304. register int i;
  1305. if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '')
  1306. {
  1307. syserr("null destination for %s mailer", m->m_mailer);
  1308. rcode = EX_CONFIG;
  1309. goto give_up;
  1310. }
  1311. # if NETUNIX
  1312. if (strcmp(pv[0], "FILE") == 0)
  1313. {
  1314. curhost = CurHostName = "localhost";
  1315. mux_path = pv[1];
  1316. }
  1317. else
  1318. # endif /* NETUNIX */
  1319. {
  1320. CurHostName = pv[1];
  1321. curhost = hostsignature(m, pv[1]);
  1322. }
  1323. if (curhost == NULL || curhost[0] == '')
  1324. {
  1325. syserr("null host signature for %s", pv[1]);
  1326. rcode = EX_CONFIG;
  1327. goto give_up;
  1328. }
  1329. if (!clever)
  1330. {
  1331. syserr("554 5.3.5 non-clever IPC");
  1332. rcode = EX_CONFIG;
  1333. goto give_up;
  1334. }
  1335. if (pv[2] != NULL
  1336. # if NETUNIX
  1337.     && mux_path == NULL
  1338. # endif /* NETUNIX */
  1339.     )
  1340. {
  1341. port = htons(atoi(pv[2]));
  1342. if (port == 0)
  1343. {
  1344. # ifdef NO_GETSERVBYNAME
  1345. syserr("Invalid port number: %s", pv[2]);
  1346. # else /* NO_GETSERVBYNAME */
  1347. struct servent *sp = getservbyname(pv[2], "tcp");
  1348. if (sp == NULL)
  1349. syserr("Service %s unknown", pv[2]);
  1350. else
  1351. port = sp->s_port;
  1352. # endif /* NO_GETSERVBYNAME */
  1353. }
  1354. }
  1355. nummxhosts = parse_hostsignature(curhost, mxhosts, m);
  1356. tryhost:
  1357. while (hostnum < nummxhosts)
  1358. {
  1359. char sep = ':';
  1360. char *endp;
  1361. static char hostbuf[MAXNAME + 1];
  1362. # if NETINET6
  1363. if (*mxhosts[hostnum] == '[')
  1364. {
  1365. endp = strchr(mxhosts[hostnum] + 1, ']');
  1366. if (endp != NULL)
  1367. endp = strpbrk(endp + 1, ":,");
  1368. }
  1369. else
  1370. endp = strpbrk(mxhosts[hostnum], ":,");
  1371. # else /* NETINET6 */
  1372. endp = strpbrk(mxhosts[hostnum], ":,");
  1373. # endif /* NETINET6 */
  1374. if (endp != NULL)
  1375. {
  1376. sep = *endp;
  1377. *endp = '';
  1378. }
  1379. if (*mxhosts[hostnum] == '')
  1380. {
  1381. syserr("deliver: null host name in signature");
  1382. hostnum++;
  1383. if (endp != NULL)
  1384. *endp = sep;
  1385. continue;
  1386. }
  1387. (void) strlcpy(hostbuf, mxhosts[hostnum],
  1388.        sizeof hostbuf);
  1389. hostnum++;
  1390. if (endp != NULL)
  1391. *endp = sep;
  1392. /* see if we already know that this host is fried */
  1393. CurHostName = hostbuf;
  1394. mci = mci_get(hostbuf, m);
  1395. if (mci->mci_state != MCIS_CLOSED)
  1396. {
  1397. if (tTd(11, 1))
  1398. {
  1399. dprintf("openmailer: ");
  1400. mci_dump(mci, FALSE);
  1401. }
  1402. CurHostName = mci->mci_host;
  1403. message("Using cached %sSMTP connection to %s via %s...",
  1404. bitset(MCIF_ESMTP, mci->mci_flags) ? "E" : "",
  1405. hostbuf, m->m_name);
  1406. mci->mci_deliveries++;
  1407. break;
  1408. }
  1409. mci->mci_mailer = m;
  1410. if (mci->mci_exitstat != EX_OK)
  1411. {
  1412. if (mci->mci_exitstat == EX_TEMPFAIL)
  1413. goodmxfound = TRUE;
  1414. continue;
  1415. }
  1416. if (mci_lock_host(mci) != EX_OK)
  1417. {
  1418. mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL);
  1419. goodmxfound = TRUE;
  1420. continue;
  1421. }
  1422. /* try the connection */
  1423. sm_setproctitle(TRUE, e, "%s %s: %s",
  1424. qid_printname(e),
  1425. hostbuf, "user open");
  1426. # if NETUNIX
  1427. if (mux_path != NULL)
  1428. {
  1429. message("Connecting to %s via %s...",
  1430. mux_path, m->m_name);
  1431. i = makeconnection_ds(mux_path, mci);
  1432. }
  1433. else
  1434. # endif /* NETUNIX */
  1435. {
  1436. if (port == 0)
  1437. message("Connecting to %s via %s...",
  1438. hostbuf, m->m_name);
  1439. else
  1440. message("Connecting to %s port %d via %s...",
  1441. hostbuf, ntohs(port),
  1442. m->m_name);
  1443. i = makeconnection(hostbuf, port, mci, e);
  1444. }
  1445. mci->mci_lastuse = curtime();
  1446. mci->mci_deliveries = 0;
  1447. mci->mci_exitstat = i;
  1448. mci->mci_errno = errno;
  1449. # if NAMED_BIND
  1450. mci->mci_herrno = h_errno;
  1451. # endif /* NAMED_BIND */
  1452. if (i == EX_OK)
  1453. {
  1454. goodmxfound = TRUE;
  1455. mci->mci_state = MCIS_OPENING;
  1456. mci_cache(mci);
  1457. if (TrafficLogFile != NULL)
  1458. fprintf(TrafficLogFile, "%05d === CONNECT %sn",
  1459. (int) getpid(), hostbuf);
  1460. break;
  1461. }
  1462. else
  1463. {
  1464. if (tTd(11, 1))
  1465. dprintf("openmailer: makeconnection => stat=%d, errno=%dn",
  1466. i, errno);
  1467. if (i == EX_TEMPFAIL)
  1468. goodmxfound = TRUE;
  1469. mci_unlock_host(mci);
  1470. }
  1471. /* enter status of this host */
  1472. setstat(i);
  1473. /* should print some message here for -v mode */
  1474. }
  1475. if (mci == NULL)
  1476. {
  1477. syserr("deliver: no host name");
  1478. rcode = EX_SOFTWARE;
  1479. goto give_up;
  1480. }
  1481. mci->mci_pid = 0;
  1482. #else /* DAEMON */
  1483. syserr("554 5.3.5 openmailer: no IPC");
  1484. if (tTd(11, 1))
  1485. dprintf("openmailer: NULLn");
  1486. rcode = EX_UNAVAILABLE;
  1487. goto give_up;
  1488. #endif /* DAEMON */
  1489. }
  1490. else
  1491. {
  1492. /* flush any expired connections */
  1493. (void) mci_scan(NULL);
  1494. mci = NULL;
  1495. #if SMTP
  1496. if (bitnset(M_LMTP, m->m_flags))
  1497. {
  1498. /* try to get a cached connection */
  1499. mci = mci_get(m->m_name, m);
  1500. if (mci->mci_host == NULL)
  1501. mci->mci_host = m->m_name;
  1502. CurHostName = mci->mci_host;
  1503. if (mci->mci_state != MCIS_CLOSED)
  1504. {
  1505. message("Using cached LMTP connection for %s...",
  1506. m->m_name);
  1507. mci->mci_deliveries++;
  1508. goto do_transfer;
  1509. }
  1510. }
  1511. #endif /* SMTP */
  1512. /* announce the connection to verbose listeners */
  1513. if (host == NULL || host[0] == '')
  1514. message("Connecting to %s...", m->m_name);
  1515. else
  1516. message("Connecting to %s via %s...", host, m->m_name);
  1517. if (TrafficLogFile != NULL)
  1518. {
  1519. char **av;
  1520. fprintf(TrafficLogFile, "%05d === EXEC", (int) getpid());
  1521. for (av = pv; *av != NULL; av++)
  1522. fprintf(TrafficLogFile, " %s", *av);
  1523. fprintf(TrafficLogFile, "n");
  1524. }
  1525. #if XDEBUG
  1526. checkfd012("before creating mail pipe");
  1527. #endif /* XDEBUG */
  1528. /* create a pipe to shove the mail through */
  1529. if (pipe(mpvect) < 0)
  1530. {
  1531. syserr("%s... openmailer(%s): pipe (to mailer)",
  1532. shortenstring(e->e_to, MAXSHORTSTR), m->m_name);
  1533. if (tTd(11, 1))
  1534. dprintf("openmailer: NULLn");
  1535. rcode = EX_OSERR;
  1536. goto give_up;
  1537. }
  1538. #if XDEBUG
  1539. /* make sure we didn't get one of the standard I/O files */
  1540. if (mpvect[0] < 3 || mpvect[1] < 3)
  1541. {
  1542. syserr("%s... openmailer(%s): bogus mpvect %d %d",
  1543. shortenstring(e->e_to, MAXSHORTSTR), m->m_name,
  1544. mpvect[0], mpvect[1]);
  1545. printopenfds(TRUE);
  1546. if (tTd(11, 1))
  1547. dprintf("openmailer: NULLn");
  1548. rcode = EX_OSERR;
  1549. goto give_up;
  1550. }
  1551. /* make sure system call isn't dead meat */
  1552. checkfdopen(mpvect[0], "mpvect[0]");
  1553. checkfdopen(mpvect[1], "mpvect[1]");
  1554. if (mpvect[0] == mpvect[1] ||
  1555.     (e->e_lockfp != NULL &&
  1556.      (mpvect[0] == fileno(e->e_lockfp) ||
  1557.       mpvect[1] == fileno(e->e_lockfp))))
  1558. {
  1559. if (e->e_lockfp == NULL)
  1560. syserr("%s... openmailer(%s): overlapping mpvect %d %d",
  1561. shortenstring(e->e_to, MAXSHORTSTR),
  1562. m->m_name, mpvect[0], mpvect[1]);
  1563. else
  1564. syserr("%s... openmailer(%s): overlapping mpvect %d %d, lockfp = %d",
  1565. shortenstring(e->e_to, MAXSHORTSTR),
  1566. m->m_name, mpvect[0], mpvect[1],
  1567. fileno(e->e_lockfp));
  1568. }
  1569. #endif /* XDEBUG */
  1570. /* create a return pipe */
  1571. if (pipe(rpvect) < 0)
  1572. {
  1573. syserr("%s... openmailer(%s): pipe (from mailer)",
  1574. shortenstring(e->e_to, MAXSHORTSTR),
  1575. m->m_name);
  1576. (void) close(mpvect[0]);
  1577. (void) close(mpvect[1]);
  1578. if (tTd(11, 1))
  1579. dprintf("openmailer: NULLn");
  1580. rcode = EX_OSERR;
  1581. goto give_up;
  1582. }
  1583. #if XDEBUG
  1584. checkfdopen(rpvect[0], "rpvect[0]");
  1585. checkfdopen(rpvect[1], "rpvect[1]");
  1586. #endif /* XDEBUG */
  1587. /*
  1588. **  Actually fork the mailer process.
  1589. ** DOFORK is clever about retrying.
  1590. **
  1591. ** Dispose of SIGCHLD signal catchers that may be laying
  1592. ** around so that endmailer will get it.
  1593. */
  1594. if (e->e_xfp != NULL)
  1595. (void) fflush(e->e_xfp); /* for debugging */
  1596. (void) fflush(stdout);
  1597. (void) setsignal(SIGCHLD, SIG_DFL);
  1598. DOFORK(FORK);
  1599. /* pid is set by DOFORK */
  1600. if (pid < 0)
  1601. {
  1602. /* failure */
  1603. syserr("%s... openmailer(%s): cannot fork",
  1604. shortenstring(e->e_to, MAXSHORTSTR), m->m_name);
  1605. (void) close(mpvect[0]);
  1606. (void) close(mpvect[1]);
  1607. (void) close(rpvect[0]);
  1608. (void) close(rpvect[1]);
  1609. if (tTd(11, 1))
  1610. dprintf("openmailer: NULLn");
  1611. rcode = EX_OSERR;
  1612. goto give_up;
  1613. }
  1614. else if (pid == 0)
  1615. {
  1616. int i;
  1617. int save_errno;
  1618. int new_euid = NO_UID;
  1619. int new_ruid = NO_UID;
  1620. int new_gid = NO_GID;
  1621. struct stat stb;
  1622. extern int DtableSize;
  1623. if (e->e_lockfp != NULL)
  1624. (void) close(fileno(e->e_lockfp));
  1625. /* child -- set up input & exec mailer */
  1626. (void) setsignal(SIGINT, SIG_IGN);
  1627. (void) setsignal(SIGHUP, SIG_IGN);
  1628. (void) setsignal(SIGTERM, SIG_DFL);
  1629. if (m != FileMailer || stat(tochain->q_user, &stb) < 0)
  1630. stb.st_mode = 0;
  1631. #if HASSETUSERCONTEXT
  1632. /*
  1633. **  Set user resources.
  1634. */
  1635. if (contextaddr != NULL)
  1636. {
  1637. struct passwd *pwd;
  1638. if (contextaddr->q_ruser != NULL)
  1639. pwd = sm_getpwnam(contextaddr->q_ruser);
  1640. else
  1641. pwd = sm_getpwnam(contextaddr->q_user);
  1642. if (pwd != NULL)
  1643. (void) setusercontext(NULL,
  1644. pwd, pwd->pw_uid,
  1645. LOGIN_SETRESOURCES|LOGIN_SETPRIORITY);
  1646. }
  1647. #endif /* HASSETUSERCONTEXT */
  1648. /* tweak niceness */
  1649. if (m->m_nice != 0)
  1650. (void) nice(m->m_nice);
  1651. /* reset group id */
  1652. if (bitnset(M_SPECIFIC_UID, m->m_flags))
  1653. new_gid = m->m_gid;
  1654. else if (bitset(S_ISGID, stb.st_mode))
  1655. new_gid = stb.st_gid;
  1656. else if (ctladdr != NULL && ctladdr->q_gid != 0)
  1657. {
  1658. if (!DontInitGroups)
  1659. {
  1660. char *u = ctladdr->q_ruser;
  1661. if (u == NULL)
  1662. u = ctladdr->q_user;
  1663. if (initgroups(u, ctladdr->q_gid) == -1 && suidwarn)
  1664. syserr("openmailer: initgroups(%s, %d) failed",
  1665. u, ctladdr->q_gid);
  1666. }
  1667. else
  1668. {
  1669. GIDSET_T gidset[1];
  1670. gidset[0] = ctladdr->q_gid;
  1671. if (setgroups(1, gidset) == -1 && suidwarn)
  1672. syserr("openmailer: setgroups() failed");
  1673. }
  1674. new_gid = ctladdr->q_gid;
  1675. }
  1676. else
  1677. {
  1678. if (!DontInitGroups)
  1679. {
  1680. if (initgroups(DefUser, DefGid) == -1 && suidwarn)
  1681. syserr("openmailer: initgroups(%s, %d) failed",
  1682. DefUser, DefGid);
  1683. }
  1684. else
  1685. {
  1686. GIDSET_T gidset[1];
  1687. gidset[0] = DefGid;
  1688. if (setgroups(1, gidset) == -1 && suidwarn)
  1689. syserr("openmailer: setgroups() failed");
  1690. }
  1691. if (m->m_gid == 0)
  1692. new_gid = DefGid;
  1693. else
  1694. new_gid = m->m_gid;
  1695. }
  1696. if (new_gid != NO_GID && setgid(new_gid) < 0 && suidwarn)
  1697. syserr("openmailer: setgid(%ld) failed",
  1698. (long) new_gid);
  1699. /* change root to some "safe" directory */
  1700. if (m->m_rootdir != NULL)
  1701. {
  1702. expand(m->m_rootdir, buf, sizeof buf, e);
  1703. if (tTd(11, 20))
  1704. dprintf("openmailer: chroot %sn",
  1705. buf);
  1706. if (chroot(buf) < 0)
  1707. syserr("openmailer: Cannot chroot(%s)",
  1708.        buf);
  1709. if (chdir("/") < 0)
  1710. syserr("openmailer: cannot chdir(/)");
  1711. }
  1712. /* reset user id */
  1713. endpwent();
  1714. if (bitnset(M_SPECIFIC_UID, m->m_flags))
  1715. new_euid = m->m_uid;
  1716. else if (bitset(S_ISUID, stb.st_mode))
  1717. new_ruid = stb.st_uid;
  1718. else if (ctladdr != NULL && ctladdr->q_uid != 0)
  1719. new_ruid = ctladdr->q_uid;
  1720. else if (m->m_uid != 0)
  1721. new_ruid = m->m_uid;
  1722. else
  1723. new_ruid = DefUid;
  1724. if (new_euid != NO_UID)
  1725. {
  1726. vendor_set_uid(new_euid);
  1727. #if MAILER_SETUID_METHOD == USE_SETEUID
  1728. if (seteuid(new_euid) < 0 && suidwarn)
  1729. syserr("openmailer: seteuid(%ld) failed",
  1730. (long) new_euid);
  1731. #endif /* MAILER_SETUID_METHOD == USE_SETEUID */
  1732. #if MAILER_SETUID_METHOD == USE_SETREUID
  1733. if (setreuid(new_ruid, new_euid) < 0 && suidwarn)
  1734. syserr("openmailer: setreuid(%ld, %ld) failed",
  1735. (long) new_ruid, (long) new_euid);
  1736. #endif /* MAILER_SETUID_METHOD == USE_SETREUID */
  1737. #if MAILER_SETUID_METHOD == USE_SETUID
  1738. if (new_euid != geteuid() && setuid(new_euid) < 0 && suidwarn)
  1739. syserr("openmailer: setuid(%ld) failed",
  1740. (long) new_euid);
  1741. #endif /* MAILER_SETUID_METHOD == USE_SETUID */
  1742. }
  1743. else if (new_ruid != NO_UID)
  1744. {
  1745. vendor_set_uid(new_ruid);
  1746. if (setuid(new_ruid) < 0 && suidwarn)
  1747. syserr("openmailer: setuid(%ld) failed",
  1748. (long) new_ruid);
  1749. }
  1750. if (tTd(11, 2))
  1751. dprintf("openmailer: running as r/euid=%d/%d, r/egid=%d/%dn",
  1752. (int) getuid(), (int) geteuid(),
  1753. (int) getgid(), (int) getegid());
  1754. /* move into some "safe" directory */
  1755. if (m->m_execdir != NULL)
  1756. {
  1757. char *q;
  1758. for (p = m->m_execdir; p != NULL; p = q)
  1759. {
  1760. q = strchr(p, ':');
  1761. if (q != NULL)
  1762. *q = '';
  1763. expand(p, buf, sizeof buf, e);
  1764. if (q != NULL)
  1765. *q++ = ':';
  1766. if (tTd(11, 20))
  1767. dprintf("openmailer: trydir %sn",
  1768. buf);
  1769. if (buf[0] != '' && chdir(buf) >= 0)
  1770. break;
  1771. }
  1772. }
  1773. /* arrange to filter std & diag output of command */
  1774. (void) close(rpvect[0]);
  1775. if (dup2(rpvect[1], STDOUT_FILENO) < 0)
  1776. {
  1777. syserr("%s... openmailer(%s): cannot dup pipe %d for stdout",
  1778.        shortenstring(e->e_to, MAXSHORTSTR),
  1779.        m->m_name, rpvect[1]);
  1780. _exit(EX_OSERR);
  1781. }
  1782. (void) close(rpvect[1]);
  1783. if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0)
  1784. {
  1785. syserr("%s... openmailer(%s): cannot dup stdout for stderr",
  1786. shortenstring(e->e_to, MAXSHORTSTR),
  1787. m->m_name);
  1788. _exit(EX_OSERR);
  1789. }
  1790. /* arrange to get standard input */
  1791. (void) close(mpvect[1]);
  1792. if (dup2(mpvect[0], STDIN_FILENO) < 0)
  1793. {
  1794. syserr("%s... openmailer(%s): cannot dup pipe %d for stdin",
  1795. shortenstring(e->e_to, MAXSHORTSTR),
  1796. m->m_name, mpvect[0]);
  1797. _exit(EX_OSERR);
  1798. }
  1799. (void) close(mpvect[0]);
  1800. /* arrange for all the files to be closed */
  1801. for (i = 3; i < DtableSize; i++)
  1802. {
  1803. register int j;
  1804. if ((j = fcntl(i, F_GETFD, 0)) != -1)
  1805. (void) fcntl(i, F_SETFD,
  1806.      j | FD_CLOEXEC);
  1807. }
  1808. /* run disconnected from terminal */
  1809. (void) setsid();
  1810. /* try to execute the mailer */
  1811. (void) execve(m->m_mailer, (ARGV_T) pv,
  1812.       (ARGV_T) UserEnviron);
  1813. save_errno = errno;
  1814. syserr("Cannot exec %s", m->m_mailer);
  1815. if (bitnset(M_LOCALMAILER, m->m_flags) ||
  1816.     transienterror(save_errno))
  1817. _exit(EX_OSERR);
  1818. _exit(EX_UNAVAILABLE);
  1819. }
  1820. /*
  1821. **  Set up return value.
  1822. */
  1823. if (mci == NULL)
  1824. {
  1825. mci = (MCI *) xalloc(sizeof *mci);
  1826. memset((char *) mci, '', sizeof *mci);
  1827. }
  1828. mci->mci_mailer = m;
  1829. if (clever)
  1830. {
  1831. mci->mci_state = MCIS_OPENING;
  1832. mci_cache(mci);
  1833. }
  1834. else
  1835. {
  1836. mci->mci_state = MCIS_OPEN;
  1837. }
  1838. mci->mci_pid = pid;
  1839. (void) close(mpvect[0]);
  1840. mci->mci_out = fdopen(mpvect[1], "w");
  1841. if (mci->mci_out == NULL)
  1842. {
  1843. syserr("deliver: cannot create mailer output channel, fd=%d",
  1844. mpvect[1]);
  1845. (void) close(mpvect[1]);
  1846. (void) close(rpvect[0]);
  1847. (void) close(rpvect[1]);
  1848. rcode = EX_OSERR;
  1849. goto give_up;
  1850. }
  1851. (void) close(rpvect[1]);
  1852. mci->mci_in = fdopen(rpvect[0], "r");
  1853. if (mci->mci_in == NULL)
  1854. {
  1855. syserr("deliver: cannot create mailer input channel, fd=%d",
  1856.        mpvect[1]);
  1857. (void) close(rpvect[0]);
  1858. (void) fclose(mci->mci_out);
  1859. mci->mci_out = NULL;
  1860. rcode = EX_OSERR;
  1861. goto give_up;
  1862. }
  1863. /* Don't cache non-clever connections */
  1864. if (!clever)
  1865. mci->mci_flags |= MCIF_TEMP;
  1866. }
  1867. /*
  1868. **  If we are in SMTP opening state, send initial protocol.
  1869. */
  1870. if (bitnset(M_7BITS, m->m_flags) &&
  1871.     (!clever || mci->mci_state == MCIS_OPENING))
  1872. mci->mci_flags |= MCIF_7BIT;
  1873. #if SMTP
  1874. if (clever && mci->mci_state != MCIS_CLOSED)
  1875. {
  1876. static u_short again = 0;
  1877. # define ONLY_HELO_B 0x04
  1878. # define ONLY_HELO bitset(ONLY_HELO_B, again)
  1879. # define SET_HELO again |= ONLY_HELO_B
  1880. # define CLR_HELO again &= ~ONLY_HELO_B
  1881. # if SASL
  1882. mci->mci_saslcap = NULL;
  1883. # endif /* SASL */
  1884. smtpinit(m, mci, e, ONLY_HELO);
  1885. CLR_HELO;
  1886. # if SASL
  1887. /* if other server supports authentication let's authenticate */
  1888. if (mci->mci_state != MCIS_CLOSED &&
  1889.     mci->mci_saslcap != NULL &&
  1890.     SASLInfo != NULL)
  1891. {
  1892. /*
  1893. **  should we require some minimum authentication?
  1894. **  XXX ignore result?
  1895. */
  1896. if (smtpauth(m, mci, e) == EX_OK)
  1897. {
  1898. }
  1899. }
  1900. # endif /* SASL */
  1901. }
  1902. #endif /* SMTP */
  1903. do_transfer:
  1904. /* clear out per-message flags from connection structure */
  1905. mci->mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7);
  1906. if (bitset(EF_HAS8BIT, e->e_flags) &&
  1907.     !bitset(EF_DONT_MIME, e->e_flags) &&
  1908.     bitnset(M_7BITS, m->m_flags))
  1909. mci->mci_flags |= MCIF_CVT8TO7;
  1910. #if MIME7TO8
  1911. if (bitnset(M_MAKE8BIT, m->m_flags) &&
  1912.     !bitset(MCIF_7BIT, mci->mci_flags) &&
  1913.     (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL &&
  1914.      (strcasecmp(p, "quoted-printable") == 0 ||
  1915.       strcasecmp(p, "base64") == 0) &&
  1916.     (p = hvalue("Content-Type", e->e_header)) != NULL)
  1917. {
  1918. /* may want to convert 7 -> 8 */
  1919. /* XXX should really parse it here -- and use a class XXX */
  1920. if (strncasecmp(p, "text/plain", 10) == 0 &&
  1921.     (p[10] == '' || p[10] == ' ' || p[10] == ';'))
  1922. mci->mci_flags |= MCIF_CVT7TO8;
  1923. }
  1924. #endif /* MIME7TO8 */
  1925. if (tTd(11, 1))
  1926. {
  1927. dprintf("openmailer: ");
  1928. mci_dump(mci, FALSE);
  1929. }
  1930. if (mci->mci_state != MCIS_OPEN)
  1931. {
  1932. /* couldn't open the mailer */
  1933. rcode = mci->mci_exitstat;
  1934. errno = mci->mci_errno;
  1935. #if NAMED_BIND
  1936. h_errno = mci->mci_herrno;
  1937. #endif /* NAMED_BIND */
  1938. if (rcode == EX_OK)
  1939. {
  1940. /* shouldn't happen */
  1941. syserr("554 5.3.5 deliver: mci=%lx rcode=%d errno=%d state=%d sig=%s",
  1942. (u_long) mci, rcode, errno, mci->mci_state,
  1943. firstsig);
  1944. mci_dump_all(TRUE);
  1945. rcode = EX_SOFTWARE;
  1946. }
  1947. #if DAEMON
  1948. else if (nummxhosts > hostnum)
  1949. {
  1950. /* try next MX site */
  1951. goto tryhost;
  1952. }
  1953. #endif /* DAEMON */
  1954. }
  1955. else if (!clever)
  1956. {
  1957. /*
  1958. **  Format and send message.
  1959. */
  1960. putfromline(mci, e);
  1961. (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER);
  1962. (*e->e_putbody)(mci, e, NULL);
  1963. /* get the exit status */
  1964. rcode = endmailer(mci, e, pv);
  1965. }
  1966. else
  1967. #if SMTP
  1968. {
  1969. /*
  1970. **  Send the MAIL FROM: protocol
  1971. */
  1972. rcode = smtpmailfrom(m, mci, e);
  1973. if (rcode == EX_OK)
  1974. {
  1975. register char *t = tobuf;
  1976. register int i;
  1977. /* send the recipient list */
  1978. tobuf[0] = '';
  1979. for (to = tochain; to != NULL; to = to->q_tchain)
  1980. {
  1981. e->e_to = to->q_paddr;
  1982. if (strlen(to->q_paddr) +
  1983.     (t - tobuf) + 2 > sizeof tobuf)
  1984. {
  1985. /* not enough room */
  1986. continue;
  1987. }
  1988. else if ((i = smtprcpt(to, m, mci, e)) != EX_OK)
  1989. {
  1990. markfailure(e, to, mci, i, FALSE);
  1991. giveresponse(i, m, mci, ctladdr,
  1992.      xstart, e);
  1993. }
  1994. else
  1995. {
  1996. *t++ = ',';
  1997. for (p = to->q_paddr; *p; *t++ = *p++)
  1998. continue;
  1999. *t = '';
  2000. }
  2001. }
  2002. /* now send the data */
  2003. if (tobuf[0] == '')
  2004. {
  2005. rcode = EX_OK;
  2006. e->e_to = NULL;
  2007. if (bitset(MCIF_CACHED, mci->mci_flags))
  2008. smtprset(m, mci, e);
  2009. }
  2010. else
  2011. {
  2012. e->e_to = tobuf + 1;
  2013. rcode = smtpdata(m, mci, e);
  2014. }
  2015. }
  2016. # if DAEMON
  2017. if (rcode == EX_TEMPFAIL && nummxhosts > hostnum)
  2018. {
  2019. /* try next MX site */
  2020. goto tryhost;
  2021. }
  2022. # endif /* DAEMON */
  2023. }
  2024. #else /* SMTP */
  2025. {
  2026. syserr("554 5.3.5 deliver: need SMTP compiled to use clever mailer");
  2027. rcode = EX_CONFIG;
  2028. goto give_up;
  2029. }
  2030. #endif /* SMTP */
  2031. #if NAMED_BIND
  2032. if (ConfigLevel < 2)
  2033. _res.options |= RES_DEFNAMES | RES_DNSRCH; /* XXX */
  2034. #endif /* NAMED_BIND */
  2035. if (tTd(62, 1))
  2036. checkfds("after delivery");
  2037. /*
  2038. **  Do final status disposal.
  2039. ** We check for something in tobuf for the SMTP case.
  2040. ** If we got a temporary failure, arrange to queue the
  2041. ** addressees.
  2042. */
  2043.   give_up:
  2044. #if SMTP
  2045. if (bitnset(M_LMTP, m->m_flags))
  2046. {
  2047. lmtp_rcode = rcode;
  2048. tobuf[0] = '';
  2049. anyok = FALSE;
  2050. }
  2051. else
  2052. #endif /* SMTP */
  2053. anyok = rcode == EX_OK;
  2054. for (to = tochain; to != NULL; to = to->q_tchain)
  2055. {
  2056. /* see if address already marked */
  2057. if (!QS_IS_OK(to->q_state))
  2058. continue;
  2059. #if SMTP
  2060. /* if running LMTP, get the status for each address */
  2061. if (bitnset(M_LMTP, m->m_flags))
  2062. {
  2063. if (lmtp_rcode == EX_OK)
  2064. rcode = smtpgetstat(m, mci, e);
  2065. if (rcode == EX_OK)
  2066. {
  2067. if (strlen(to->q_paddr) +
  2068.     strlen(tobuf) + 2 > sizeof tobuf)
  2069. {
  2070. syserr("LMTP tobuf overflow");
  2071. }
  2072. else
  2073. {
  2074. (void) strlcat(tobuf, ",",
  2075.        sizeof tobuf);
  2076. (void) strlcat(tobuf, to->q_paddr,
  2077.        sizeof tobuf);
  2078. }
  2079. anyok = TRUE;
  2080. }
  2081. else
  2082. {
  2083. e->e_to = to->q_paddr;
  2084. markfailure(e, to, mci, rcode, TRUE);
  2085. giveresponse(rcode, m, mci, ctladdr, xstart, e);
  2086. e->e_to = tobuf + 1;
  2087. continue;
  2088. }
  2089. }
  2090. else
  2091. #endif /* SMTP */
  2092. {
  2093. /* mark bad addresses */
  2094. if (rcode != EX_OK)
  2095. {
  2096. if (goodmxfound && rcode == EX_NOHOST)
  2097. rcode = EX_TEMPFAIL;
  2098. markfailure(e, to, mci, rcode, TRUE);
  2099. continue;
  2100. }
  2101. }
  2102. /* successful delivery */
  2103. to->q_state = QS_SENT;
  2104. to->q_statdate = curtime();
  2105. e->e_nsent++;
  2106. #if QUEUE
  2107. /*
  2108. **  Checkpoint the send list every few addresses
  2109. */
  2110. if (e->e_nsent >= CheckpointInterval)
  2111. {
  2112. queueup(e, FALSE);
  2113. e->e_nsent = 0;
  2114. }
  2115. #endif /* QUEUE */
  2116. if (bitnset(M_LOCALMAILER, m->m_flags) &&
  2117.     bitset(QPINGONSUCCESS, to->q_flags))
  2118. {
  2119. to->q_flags |= QDELIVERED;
  2120. to->q_status = "2.1.5";
  2121. fprintf(e->e_xfp, "%s... Successfully deliveredn",
  2122. to->q_paddr);
  2123. }
  2124. else if (bitset(QPINGONSUCCESS, to->q_flags) &&
  2125.  bitset(QPRIMARY, to->q_flags) &&
  2126.  !bitset(MCIF_DSN, mci->mci_flags))
  2127. {
  2128. to->q_flags |= QRELAYED;
  2129. fprintf(e->e_xfp, "%s... relayed; expect no further notificationsn",
  2130. to->q_paddr);
  2131. }
  2132. }
  2133. #if SMTP
  2134. if (bitnset(M_LMTP, m->m_flags))
  2135. {
  2136. /*
  2137. **  Global information applies to the last recipient only;
  2138. **  clear it out to avoid bogus errors.
  2139. */
  2140. rcode = EX_OK;
  2141. e->e_statmsg = NULL;
  2142. /* reset the mci state for the next transaction */
  2143. if (mci != NULL && mci->mci_state == MCIS_ACTIVE)
  2144. mci->mci_state = MCIS_OPEN;
  2145. }
  2146. #endif /* SMTP */
  2147. if (tobuf[0] != '')
  2148. giveresponse(rcode, m, mci, ctladdr, xstart, e);
  2149. if (anyok)
  2150. markstats(e, tochain, FALSE);
  2151. mci_store_persistent(mci);
  2152. #if SMTP
  2153. /* now close the connection */
  2154. if (clever && mci != NULL && mci->mci_state != MCIS_CLOSED &&
  2155.     !bitset(MCIF_CACHED, mci->mci_flags))
  2156. smtpquit(m, mci, e);
  2157. #endif /* SMTP */
  2158. /*
  2159. **  Restore state and return.
  2160. */
  2161. #if XDEBUG
  2162. {
  2163. char wbuf[MAXLINE];
  2164. /* make absolutely certain 0, 1, and 2 are in use */
  2165. snprintf(wbuf, sizeof wbuf, "%s... end of deliver(%s)",
  2166. e->e_to == NULL ? "NO-TO-LIST"
  2167. : shortenstring(e->e_to, MAXSHORTSTR),
  2168. m->m_name);
  2169. checkfd012(wbuf);
  2170. }
  2171. #endif /* XDEBUG */
  2172. errno = 0;
  2173. define('g', (char *) NULL, e);
  2174. return rcode;
  2175. }
  2176. /*
  2177. **  MARKFAILURE -- mark a failure on a specific address.
  2178. **
  2179. ** Parameters:
  2180. ** e -- the envelope we are sending.
  2181. ** q -- the address to mark.
  2182. ** mci -- mailer connection information.
  2183. ** rcode -- the code signifying the particular failure.
  2184. ** ovr -- override an existing code?
  2185. **
  2186. ** Returns:
  2187. ** none.
  2188. **
  2189. ** Side Effects:
  2190. ** marks the address (and possibly the envelope) with the
  2191. ** failure so that an error will be returned or
  2192. ** the message will be queued, as appropriate.
  2193. */
  2194. static void
  2195. markfailure(e, q, mci, rcode, ovr)
  2196. register ENVELOPE *e;
  2197. register ADDRESS *q;
  2198. register MCI *mci;
  2199. int rcode;
  2200. bool ovr;
  2201. {
  2202. char *status = NULL;
  2203. char *rstatus = NULL;
  2204. switch (rcode)
  2205. {
  2206.   case EX_OK:
  2207. break;
  2208.   case EX_TEMPFAIL:
  2209.   case EX_IOERR:
  2210.   case EX_OSERR:
  2211. q->q_state = QS_QUEUEUP;
  2212. break;
  2213.   default:
  2214. q->q_state = QS_BADADDR;
  2215. break;
  2216. }
  2217. /* find most specific error code possible */
  2218. if (mci != NULL && mci->mci_status != NULL)
  2219. {
  2220. status = mci->mci_status;
  2221. if (mci->mci_rstatus != NULL)
  2222. rstatus = newstr(mci->mci_rstatus);
  2223. else
  2224. rstatus = NULL;
  2225. }
  2226. else if (e->e_status != NULL)
  2227. {
  2228. status = e->e_status;
  2229. rstatus = NULL;
  2230. }
  2231. else
  2232. {
  2233. switch (rcode)
  2234. {
  2235.   case EX_USAGE:
  2236. status = "5.5.4";
  2237. break;
  2238.   case EX_DATAERR:
  2239. status = "5.5.2";
  2240. break;
  2241.   case EX_NOUSER:
  2242. status = "5.1.1";
  2243. break;
  2244.   case EX_NOHOST:
  2245. status = "5.1.2";
  2246. break;
  2247.   case EX_NOINPUT:
  2248.   case EX_CANTCREAT:
  2249.   case EX_NOPERM:
  2250. status = "5.3.0";
  2251. break;
  2252.   case EX_UNAVAILABLE:
  2253.   case EX_SOFTWARE:
  2254.   case EX_OSFILE:
  2255.   case EX_PROTOCOL:
  2256.   case EX_CONFIG:
  2257. status = "5.5.0";
  2258. break;
  2259.   case EX_OSERR:
  2260.   case EX_IOERR:
  2261. status = "4.5.0";
  2262. break;
  2263.   case EX_TEMPFAIL:
  2264. status = "4.2.0";
  2265. break;
  2266. }
  2267. }
  2268. /* new status? */
  2269. if (status != NULL && *status != '' && (ovr || q->q_status == NULL ||
  2270.     *q->q_status == '' || *q->q_status < *status))
  2271. {
  2272. q->q_status = status;
  2273. q->q_rstatus = rstatus;
  2274. }
  2275. if (rcode != EX_OK && q->q_rstatus == NULL &&
  2276.     q->q_mailer != NULL && q->q_mailer->m_diagtype != NULL &&
  2277.     strcasecmp(q->q_mailer->m_diagtype, "X-UNIX") == 0)
  2278. {
  2279. char buf[16];
  2280. (void) snprintf(buf, sizeof buf, "%d", rcode);
  2281. q->q_rstatus = newstr(buf);
  2282. }
  2283. q->q_statdate = curtime();
  2284. if (CurHostName != NULL && CurHostName[0] != '' &&
  2285.     mci != NULL && !bitset(M_LOCALMAILER, mci->mci_flags))
  2286. q->q_statmta = newstr(CurHostName);
  2287. }
  2288. /*
  2289. **  ENDMAILER -- Wait for mailer to terminate.
  2290. **
  2291. ** We should never get fatal errors (e.g., segmentation
  2292. ** violation), so we report those specially.  For other
  2293. ** errors, we choose a status message (into statmsg),
  2294. ** and if it represents an error, we print it.
  2295. **
  2296. ** Parameters:
  2297. ** pid -- pid of mailer.
  2298. ** e -- the current envelope.
  2299. ** pv -- the parameter vector that invoked the mailer
  2300. ** (for error messages).
  2301. **
  2302. ** Returns:
  2303. ** exit code of mailer.
  2304. **
  2305. ** Side Effects:
  2306. ** none.
  2307. */
  2308. static jmp_buf EndWaitTimeout;
  2309. static void
  2310. endwaittimeout()
  2311. {
  2312. errno = ETIMEDOUT;
  2313. longjmp(EndWaitTimeout, 1);
  2314. }
  2315. int
  2316. endmailer(mci, e, pv)
  2317. register MCI *mci;
  2318. register ENVELOPE *e;
  2319. char **pv;
  2320. {
  2321. int st;
  2322. int save_errno = errno;
  2323. char buf[MAXLINE];
  2324. EVENT *ev = NULL;
  2325. mci_unlock_host(mci);
  2326. /* close output to mailer */
  2327. if (mci->mci_out != NULL)
  2328. (void) fclose(mci->mci_out);
  2329. /* copy any remaining input to transcript */
  2330. if (mci->mci_in != NULL && e->e_xfp != NULL)
  2331. {
  2332. while (sfgets(buf, sizeof buf, mci->mci_in,
  2333.        TimeOuts.to_quit, "Draining Input") != NULL)
  2334. /* while (fgets(buf, sizeof buf, mci->mci_in) != NULL) */
  2335. (void) fputs(buf, e->e_xfp);
  2336. }
  2337. /* now close the input */
  2338. if (mci->mci_in != NULL)
  2339. (void) fclose(mci->mci_in);
  2340. mci->mci_in = mci->mci_out = NULL;
  2341. mci->mci_state = MCIS_CLOSED;
  2342. errno = save_errno;
  2343. /* in the IPC case there is nothing to wait for */
  2344. if (mci->mci_pid == 0)
  2345. return EX_OK;
  2346. /* put a timeout around the wait */
  2347. if (mci->mci_mailer->m_wait > 0)
  2348. {
  2349. if (setjmp(EndWaitTimeout) == 0)
  2350. ev = setevent(mci->mci_mailer->m_wait,
  2351.       endwaittimeout, 0);
  2352. else
  2353. {
  2354. syserr("endmailer %s: wait timeout (%d)",
  2355.        mci->mci_mailer->m_name,
  2356.        mci->mci_mailer->m_wait);
  2357. return EX_TEMPFAIL;
  2358. }
  2359. }
  2360. /* wait for the mailer process, collect status */
  2361. st = waitfor(mci->mci_pid);
  2362. save_errno = errno;
  2363. if (ev != NULL)
  2364. clrevent(ev);
  2365. errno = save_errno;
  2366. if (st == -1)
  2367. {
  2368. syserr("endmailer %s: wait", mci->mci_mailer->m_name);
  2369. return EX_SOFTWARE;
  2370. }
  2371. if (WIFEXITED(st))
  2372. {
  2373. /* normal death -- return status */
  2374. return (WEXITSTATUS(st));
  2375. }
  2376. /* it died a horrid death */
  2377. syserr("451 4.3.0 mailer %s died with signal %d%s",
  2378. mci->mci_mailer->m_name, WTERMSIG(st),
  2379. WCOREDUMP(st) ? " (core dumped)" :
  2380. (WIFSTOPPED(st) ? " (stopped)" : ""));
  2381. /* log the arguments */
  2382. if (pv != NULL && e->e_xfp != NULL)
  2383. {
  2384. register char **av;
  2385. fprintf(e->e_xfp, "Arguments:");
  2386. for (av = pv; *av != NULL; av++)
  2387. fprintf(e->e_xfp, " %s", *av);
  2388. fprintf(e->e_xfp, "n");
  2389. }
  2390. ExitStat = EX_TEMPFAIL;
  2391. return EX_TEMPFAIL;
  2392. }
  2393. /*
  2394. **  GIVERESPONSE -- Interpret an error response from a mailer
  2395. **
  2396. ** Parameters:
  2397. ** status -- the status code from the mailer (high byte
  2398. ** only; core dumps must have been taken care of
  2399. ** already).
  2400. ** m -- the mailer info for this mailer.
  2401. ** mci -- the mailer connection info -- can be NULL if the
  2402. ** response is given before the connection is made.
  2403. ** ctladdr -- the controlling address for the recipient
  2404. ** address(es).
  2405. ** xstart -- the transaction start time, for computing
  2406. ** transaction delays.
  2407. ** e -- the current envelope.
  2408. **
  2409. ** Returns:
  2410. ** none.
  2411. **
  2412. ** Side Effects:
  2413. ** Errors may be incremented.
  2414. ** ExitStat may be set.
  2415. */
  2416. void
  2417. giveresponse(status, m, mci, ctladdr, xstart, e)
  2418. int status;
  2419. register MAILER *m;
  2420. register MCI *mci;
  2421. ADDRESS *ctladdr;
  2422. time_t xstart;
  2423. ENVELOPE *e;
  2424. {
  2425. register const char *statmsg;
  2426. extern char *SysExMsg[];
  2427. register int i;
  2428. int errnum = errno;
  2429. int off = 4;
  2430. extern int N_SysEx;
  2431. char buf[MAXLINE];
  2432. if (e == NULL)
  2433. syserr("giveresponse: null envelope");
  2434. /*
  2435. **  Compute status message from code.
  2436. */
  2437. i = status - EX__BASE;
  2438. if (status == 0)
  2439. {
  2440. statmsg = "250 2.0.0 Sent";
  2441. if (e->e_statmsg != NULL)
  2442. {
  2443. (void) snprintf(buf, sizeof buf, "%s (%s)",
  2444. statmsg, shortenstring(e->e_statmsg, 403));
  2445. statmsg = buf;
  2446. }
  2447. }
  2448. else if (i < 0 || i >= N_SysEx)
  2449. {
  2450. (void) snprintf(buf, sizeof buf, "554 5.3.0 unknown mailer error %d",
  2451. status);
  2452. status = EX_UNAVAILABLE;
  2453. statmsg = buf;
  2454. }
  2455. else if (status == EX_TEMPFAIL)
  2456. {
  2457. char *bp = buf;
  2458. snprintf(bp, SPACELEFT(buf, bp), "%s", SysExMsg[i] + 1);
  2459. bp += strlen(bp);
  2460. #if NAMED_BIND
  2461. if (h_errno == TRY_AGAIN)
  2462. statmsg = errstring(h_errno+E_DNSBASE);
  2463. else
  2464. #endif /* NAMED_BIND */
  2465. {
  2466. if (errnum != 0)
  2467. statmsg = errstring(errnum);
  2468. else
  2469. {
  2470. #if SMTP
  2471. statmsg = SmtpError;
  2472. #else /* SMTP */
  2473. statmsg = NULL;
  2474. #endif /* SMTP */
  2475. }
  2476. }
  2477. if (statmsg != NULL && statmsg[0] != '')
  2478. {
  2479. switch (errnum)
  2480. {
  2481. #ifdef ENETDOWN
  2482.   case ENETDOWN: /* Network is down */
  2483. #endif /* ENETDOWN */
  2484. #ifdef ENETUNREACH
  2485.   case ENETUNREACH: /* Network is unreachable */
  2486. #endif /* ENETUNREACH */
  2487. #ifdef ENETRESET
  2488.   case ENETRESET: /* Network dropped connection on reset */
  2489. #endif /* ENETRESET */
  2490. #ifdef ECONNABORTED
  2491.   case ECONNABORTED: /* Software caused connection abort */
  2492. #endif /* ECONNABORTED */
  2493. #ifdef EHOSTDOWN
  2494.   case EHOSTDOWN: /* Host is down */
  2495. #endif /* EHOSTDOWN */
  2496. #ifdef EHOSTUNREACH
  2497.   case EHOSTUNREACH: /* No route to host */
  2498. #endif /* EHOSTUNREACH */
  2499. if (mci->mci_host != NULL)
  2500. {
  2501. snprintf(bp, SPACELEFT(buf, bp),
  2502.  ": %s", mci->mci_host);
  2503. bp += strlen(bp);
  2504. }
  2505. break;
  2506. }
  2507. snprintf(bp, SPACELEFT(buf, bp), ": %s", statmsg);
  2508. }
  2509. statmsg = buf;
  2510. }
  2511. #if NAMED_BIND
  2512. else if (status == EX_NOHOST && h_errno != 0)
  2513. {
  2514. statmsg = errstring(h_errno + E_DNSBASE);
  2515. (void) snprintf(buf, sizeof buf, "%s (%s)",
  2516. SysExMsg[i] + 1, statmsg);
  2517. statmsg = buf;
  2518. }
  2519. #endif /* NAMED_BIND */
  2520. else
  2521. {
  2522. statmsg = SysExMsg[i];
  2523. if (*statmsg++ == ':' && errnum != 0)
  2524. {
  2525. (void) snprintf(buf, sizeof buf, "%s: %s",
  2526. statmsg, errstring(errnum));
  2527. statmsg = buf;
  2528. }
  2529. }
  2530. /*
  2531. **  Print the message as appropriate
  2532. */
  2533. if (status == EX_OK || status == EX_TEMPFAIL)
  2534. {
  2535. extern char MsgBuf[];
  2536. if ((off = isenhsc(statmsg + 4, ' ')) > 0)
  2537. off += 5;
  2538. else
  2539. off = 4;
  2540. message("%s", statmsg + off);
  2541. if (status == EX_TEMPFAIL && e->e_xfp != NULL)
  2542. fprintf(e->e_xfp, "%sn", &MsgBuf[4]);
  2543. }
  2544. else
  2545. {
  2546. char mbuf[ENHSCLEN + 4];
  2547. Errors++;
  2548. if ((off = isenhsc(statmsg + 4, ' ')) > 0 &&
  2549.     off < sizeof mbuf - 4)
  2550. {
  2551. off += 5;
  2552. (void) strlcpy(mbuf, statmsg, off);
  2553. (void) strlcat(mbuf, " %s", sizeof mbuf);
  2554. }
  2555. else
  2556. {
  2557. (void) snprintf(mbuf, sizeof mbuf, "%.3s %%s", statmsg);
  2558. off = 4;
  2559. }
  2560. usrerr(mbuf, &statmsg[off]);
  2561. }
  2562. /*
  2563. **  Final cleanup.
  2564. ** Log a record of the transaction.  Compute the new
  2565. ** ExitStat -- if we already had an error, stick with
  2566. ** that.
  2567. */
  2568. if (OpMode != MD_VERIFY && !bitset(EF_VRFYONLY, e->e_flags) &&
  2569.     LogLevel > ((status == EX_TEMPFAIL) ? 8 : (status == EX_OK) ? 7 : 6))
  2570. logdelivery(m, mci, statmsg, ctladdr, xstart, e);
  2571. if (tTd(11, 2))
  2572. dprintf("giveresponse: status=%d, e->e_message=%sn",
  2573. status, e->e_message == NULL ? "<NULL>" : e->e_message);
  2574. if (status != EX_TEMPFAIL)
  2575. setstat(status);
  2576. if (status != EX_OK && (status != EX_TEMPFAIL || e->e_message == NULL))
  2577. {
  2578. if (e->e_message != NULL)
  2579. free(e->e_message);
  2580. e->e_message = newstr(statmsg);
  2581. }
  2582. errno = 0;
  2583. #if NAMED_BIND
  2584. h_errno = 0;
  2585. #endif /* NAMED_BIND */
  2586. }
  2587. /*
  2588. **  LOGDELIVERY -- log the delivery in the system log
  2589. **
  2590. ** Care is taken to avoid logging lines that are too long, because
  2591. ** some versions of syslog have an unfortunate proclivity for core
  2592. ** dumping.  This is a hack, to be sure, that is at best empirical.
  2593. **
  2594. ** Parameters:
  2595. ** m -- the mailer info.  Can be NULL for initial queue.
  2596. ** mci -- the mailer connection info -- can be NULL if the
  2597. ** log is occurring when no connection is active.
  2598. ** status -- the message to print for the status.
  2599. ** ctladdr -- the controlling address for the to list.
  2600. ** xstart -- the transaction start time, used for
  2601. ** computing transaction delay.
  2602. ** e -- the current envelope.
  2603. **
  2604. ** Returns:
  2605. ** none
  2606. **
  2607. ** Side Effects:
  2608. ** none
  2609. */
  2610. void
  2611. logdelivery(m, mci, status, ctladdr, xstart, e)
  2612. MAILER *m;
  2613. register MCI *mci;
  2614. const char *status;
  2615. ADDRESS *ctladdr;
  2616. time_t xstart;
  2617. register ENVELOPE *e;
  2618. {
  2619. register char *bp;
  2620. register char *p;
  2621. int l;
  2622. char buf[1024];
  2623. #if (SYSLOG_BUFSIZE) >= 256
  2624. /* ctladdr: max 106 bytes */
  2625. bp = buf;
  2626. if (ctladdr != NULL)
  2627. {
  2628. snprintf(bp, SPACELEFT(buf, bp), ", ctladdr=%s",
  2629.  shortenstring(ctladdr->q_paddr, 83));
  2630. bp += strlen(bp);
  2631. if (bitset(QGOODUID, ctladdr->q_flags))
  2632. {
  2633. (void) snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)",
  2634. (int) ctladdr->q_uid,
  2635. (int) ctladdr->q_gid);
  2636. bp += strlen(bp);
  2637. }
  2638. }
  2639. /* delay & xdelay: max 41 bytes */
  2640. snprintf(bp, SPACELEFT(buf, bp), ", delay=%s",
  2641.  pintvl(curtime() - e->e_ctime, TRUE));
  2642. bp += strlen(bp);
  2643. if (xstart != (time_t) 0)
  2644. {
  2645. snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s",
  2646.  pintvl(curtime() - xstart, TRUE));
  2647. bp += strlen(bp);
  2648. }
  2649. /* mailer: assume about 19 bytes (max 10 byte mailer name) */
  2650. if (m != NULL)
  2651. {
  2652. snprintf(bp, SPACELEFT(buf, bp), ", mailer=%s", m->m_name);
  2653. bp += strlen(bp);
  2654. }
  2655. /* pri: changes with each delivery attempt */
  2656. snprintf(bp, SPACELEFT(buf, bp), ", pri=%ld", e->e_msgpriority);
  2657. bp += strlen(bp);
  2658. /* relay: max 66 bytes for IPv4 addresses */
  2659. if (mci != NULL && mci->mci_host != NULL)
  2660. {
  2661. # if DAEMON
  2662. extern SOCKADDR CurHostAddr;
  2663. # endif /* DAEMON */
  2664. snprintf(bp, SPACELEFT(buf, bp), ", relay=%s",
  2665.  shortenstring(mci->mci_host, 40));
  2666. bp += strlen(bp);
  2667. # if DAEMON
  2668. if (CurHostAddr.sa.sa_family != 0)
  2669. {
  2670. snprintf(bp, SPACELEFT(buf, bp), " [%s]",
  2671.  anynet_ntoa(&CurHostAddr));
  2672. }
  2673. # endif /* DAEMON */
  2674. }
  2675. else if (strcmp(status, "queued") != 0)
  2676. {
  2677. p = macvalue('h', e);
  2678. if (p != NULL && p[0] != '')
  2679. {
  2680. snprintf(bp, SPACELEFT(buf, bp), ", relay=%s",
  2681.  shortenstring(p, 40));
  2682. }
  2683. }
  2684. bp += strlen(bp);
  2685. # define STATLEN (((SYSLOG_BUFSIZE) - 100) / 4)
  2686. # if (STATLEN) < 63
  2687. #  undef STATLEN
  2688. #  define STATLEN 63
  2689. # endif /* (STATLEN) < 63 */
  2690. # if (STATLEN) > 203
  2691. #  undef STATLEN
  2692. #  define STATLEN 203
  2693. # endif /* (STATLEN) > 203 */
  2694. /* stat: max 210 bytes */
  2695. if ((bp - buf) > (sizeof buf - ((STATLEN) + 20)))
  2696. {
  2697. /* desperation move -- truncate data */
  2698. bp = buf + sizeof buf - ((STATLEN) + 17);
  2699. (void) strlcpy(bp, "...", SPACELEFT(buf, bp));
  2700. bp += 3;
  2701. }
  2702. (void) strlcpy(bp, ", stat=", SPACELEFT(buf, bp));
  2703. bp += strlen(bp);
  2704. (void) strlcpy(bp, shortenstring(status, STATLEN), SPACELEFT(buf, bp));
  2705. /* id, to: max 13 + TOBUFSIZE bytes */
  2706. l = SYSLOG_BUFSIZE - 100 - strlen(buf);
  2707. p = e->e_to;
  2708. while (strlen(p) >= (SIZE_T) l)
  2709. {
  2710. register char *q = strchr(p + l, ',');
  2711. if (q == NULL)
  2712. break;
  2713. sm_syslog(LOG_INFO, e->e_id,
  2714.   "to=%.*s [more]%s",
  2715.   ++q - p, p, buf);
  2716. p = q;
  2717. }
  2718. sm_syslog(LOG_INFO, e->e_id, "to=%s%s", p, buf);
  2719. #else /* (SYSLOG_BUFSIZE) >= 256 */
  2720. l = SYSLOG_BUFSIZE - 85;
  2721. p = e->e_to;
  2722. while (strlen(p) >= (SIZE_T) l)
  2723. {
  2724. register char *q = strchr(p + l, ',');
  2725. if (q == NULL)
  2726. break;
  2727. sm_syslog(LOG_INFO, e->e_id,
  2728.   "to=%.*s [more]",
  2729.   ++q - p, p);
  2730. p = q;
  2731. }
  2732. sm_syslog(LOG_INFO, e->e_id, "to=%s", p);
  2733. if (ctladdr != NULL)
  2734. {
  2735. bp = buf;
  2736. snprintf(bp, SPACELEFT(buf, bp), "ctladdr=%s",
  2737.  shortenstring(ctladdr->q_paddr, 83));
  2738. bp += strlen(bp);
  2739. if (bitset(QGOODUID, ctladdr->q_flags))
  2740. {
  2741. (void) snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)",
  2742. ctladdr->q_uid, ctladdr->q_gid);
  2743. bp += strlen(bp);
  2744. }
  2745. sm_syslog(LOG_INFO, e->e_id, "%s", buf);
  2746. }
  2747. bp = buf;
  2748. snprintf(bp, SPACELEFT(buf, bp), "delay=%s",
  2749.  pintvl(curtime() - e->e_ctime, TRUE));
  2750. bp += strlen(bp);
  2751. if (xstart != (time_t) 0)
  2752. {
  2753. snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s",
  2754.  pintvl(curtime() - xstart, TRUE));
  2755. bp += strlen(bp);
  2756. }
  2757. if (m != NULL)
  2758. {
  2759. snprintf(bp, SPACELEFT(buf, bp), ", mailer=%s", m->m_name);
  2760. bp += strlen(bp);
  2761. }
  2762. sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf);
  2763. buf[0] = '';
  2764. bp = buf;
  2765. if (mci != NULL && mci->mci_host != NULL)
  2766. {
  2767. # if DAEMON
  2768. extern SOCKADDR CurHostAddr;
  2769. # endif /* DAEMON */
  2770. snprintf(bp, SPACELEFT(buf, bp), "relay=%.100s", mci->mci_host);
  2771. bp += strlen(bp);
  2772. # if DAEMON
  2773. if (CurHostAddr.sa.sa_family != 0)
  2774. snprintf(bp, SPACELEFT(buf, bp), " [%.100s]",
  2775. anynet_ntoa(&CurHostAddr));
  2776. # endif /* DAEMON */
  2777. }
  2778. else if (strcmp(status, "queued") != 0)
  2779. {
  2780. p = macvalue('h', e);
  2781. if (p != NULL && p[0] != '')
  2782. snprintf(buf, sizeof buf, "relay=%.100s", p);
  2783. }
  2784. if (buf[0] != '')
  2785. sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf);
  2786. sm_syslog(LOG_INFO, e->e_id, "stat=%s", shortenstring(status, 63));
  2787. #endif /* (SYSLOG_BUFSIZE) >= 256 */
  2788. }
  2789. /*
  2790. **  PUTFROMLINE -- output a UNIX-style from line (or whatever)
  2791. **
  2792. ** This can be made an arbitrary message separator by changing $l
  2793. **
  2794. ** One of the ugliest hacks seen by human eyes is contained herein:
  2795. ** UUCP wants those stupid "remote from <host>" lines.  Why oh why
  2796. ** does a well-meaning programmer such as myself have to deal with
  2797. ** this kind of antique garbage????
  2798. **
  2799. ** Parameters:
  2800. ** mci -- the connection information.
  2801. ** e -- the envelope.
  2802. **
  2803. ** Returns:
  2804. ** none
  2805. **
  2806. ** Side Effects:
  2807. ** outputs some text to fp.
  2808. */
  2809. void
  2810. putfromline(mci, e)
  2811. register MCI *mci;
  2812. ENVELOPE *e;
  2813. {
  2814. char *template = UnixFromLine;
  2815. char buf[MAXLINE];
  2816. char xbuf[MAXLINE];
  2817. if (bitnset(M_NHDR, mci->mci_mailer->m_flags))
  2818. return;
  2819. mci->mci_flags |= MCIF_INHEADER;
  2820. if (bitnset(M_UGLYUUCP, mci->mci_mailer->m_flags))
  2821. {
  2822. char *bang;
  2823. expand("201g", buf, sizeof buf, e);
  2824. bang = strchr(buf, '!');
  2825. if (bang == NULL)
  2826. {
  2827. char *at;
  2828. char hname[MAXNAME];
  2829. /*
  2830. **  If we can construct a UUCP path, do so
  2831. */
  2832. at = strrchr(buf, '@');
  2833. if (at == NULL)
  2834. {
  2835. expand("201k", hname, sizeof hname, e);
  2836. at = hname;
  2837. }
  2838. else
  2839. *at++ = '';
  2840. (void) snprintf(xbuf, sizeof xbuf,
  2841. "From %.800s  201d remote from %.100sn",
  2842. buf, at);
  2843. }
  2844. else
  2845. {
  2846. *bang++ = '';
  2847. (void) snprintf(xbuf, sizeof xbuf,
  2848. "From %.800s  201d remote from %.100sn",
  2849. bang, buf);
  2850. template = xbuf;
  2851. }
  2852. }
  2853. expand(template, buf, sizeof buf, e);
  2854. putxline(buf, strlen(buf), mci, PXLF_HEADER);
  2855. }
  2856. /*
  2857. **  PUTBODY -- put the body of a message.
  2858. **
  2859. ** Parameters:
  2860. ** mci -- the connection information.
  2861. ** e -- the envelope to put out.
  2862. ** separator -- if non-NULL, a message separator that must
  2863. ** not be permitted in the resulting message.
  2864. **
  2865. ** Returns:
  2866. ** none.
  2867. **
  2868. ** Side Effects:
  2869. ** The message is written onto fp.
  2870. */
  2871. /* values for output state variable */
  2872. #define OS_HEAD 0 /* at beginning of line */
  2873. #define OS_CR 1 /* read a carriage return */
  2874. #define OS_INLINE 2 /* putting rest of line */
  2875. void
  2876. putbody(mci, e, separator)
  2877. register MCI *mci;
  2878. register ENVELOPE *e;
  2879. char *separator;
  2880. {
  2881. bool dead = FALSE;
  2882. char buf[MAXLINE];
  2883. char *boundaries[MAXMIMENESTING + 1];
  2884. /*
  2885. **  Output the body of the message
  2886. */
  2887. if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags))
  2888. {
  2889. char *df = queuename(e, 'd');
  2890. e->e_dfp = fopen(df, "r");
  2891. if (e->e_dfp == NULL)
  2892. syserr("putbody: Cannot open %s for %s from %s",
  2893. df, e->e_to, e->e_from.q_paddr);
  2894. }
  2895. if (e->e_dfp == NULL)
  2896. {
  2897. if (bitset(MCIF_INHEADER, mci->mci_flags))
  2898. {
  2899. putline("", mci);
  2900. mci->mci_flags &= ~MCIF_INHEADER;
  2901. }
  2902. putline("<<< No Message Collected >>>", mci);
  2903. goto endofmessage;
  2904. }
  2905. if (e->e_dfino == (ino_t) 0)
  2906. {
  2907. struct stat stbuf;
  2908. if (fstat(fileno(e->e_dfp), &stbuf) < 0)
  2909. e->e_dfino = -1;
  2910. else
  2911. {
  2912. e->e_dfdev = stbuf.st_dev;
  2913. e->e_dfino = stbuf.st_ino;
  2914. }
  2915. }
  2916. /* paranoia: the df file should always be in a rewound state */
  2917. (void) bfrewind(e->e_dfp);
  2918. #if MIME8TO7
  2919. if (bitset(MCIF_CVT8TO7, mci->mci_flags))
  2920. {
  2921. /*
  2922. **  Do 8 to 7 bit MIME conversion.
  2923. */
  2924. /* make sure it looks like a MIME message */
  2925. if (hvalue("MIME-Version", e->e_header) == NULL)
  2926. putline("MIME-Version: 1.0", mci);
  2927. if (hvalue("Content-Type", e->e_header) == NULL)
  2928. {
  2929. snprintf(buf, sizeof buf,
  2930. "Content-Type: text/plain; charset=%s",
  2931. defcharset(e));
  2932. putline(buf, mci);
  2933. }
  2934. /* now do the hard work */
  2935. boundaries[0] = NULL;
  2936. mci->mci_flags |= MCIF_INHEADER;
  2937. (void) mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER);
  2938. }
  2939. # if MIME7TO8
  2940. else if (bitset(MCIF_CVT7TO8, mci->mci_flags))
  2941. {
  2942. (void) mime7to8(mci, e->e_header, e);
  2943. }
  2944. # endif /* MIME7TO8 */
  2945. else if (MaxMimeHeaderLength > 0 || MaxMimeFieldLength > 0)
  2946. {
  2947. bool oldsuprerrs = SuprErrs;
  2948. /* Use mime8to7 to check multipart for MIME header overflows */
  2949. boundaries[0] = NULL;
  2950. mci->mci_flags |= MCIF_INHEADER;
  2951. /*
  2952. **  If EF_DONT_MIME is set, we have a broken MIME message
  2953. **  and don't want to generate a new bounce message whose
  2954. **  body propagates the broken MIME.  We can't just not call
  2955. **  mime8to7() as is done above since we need the security
  2956. **  checks.  The best we can do is suppress the errors.
  2957. */
  2958. if (bitset(EF_DONT_MIME, e->e_flags))
  2959. SuprErrs = TRUE;
  2960. (void) mime8to7(mci, e->e_header, e, boundaries,
  2961. M87F_OUTER|M87F_NO8TO7);
  2962. /* restore SuprErrs */
  2963. SuprErrs = oldsuprerrs;
  2964. }
  2965. else
  2966. #endif /* MIME8TO7 */
  2967. {
  2968. int ostate;
  2969. register char *bp;
  2970. register char *pbp;
  2971. register int c;
  2972. register char *xp;
  2973. int padc;
  2974. char *buflim;
  2975. int pos = 0;
  2976. char peekbuf[10];
  2977. if (bitset(MCIF_INHEADER, mci->mci_flags))
  2978. {
  2979. putline("", mci);
  2980. mci->mci_flags &= ~MCIF_INHEADER;
  2981. }
  2982. /* determine end of buffer; allow for short mailer lines */
  2983. buflim = &buf[sizeof buf - 1];
  2984. if (mci->mci_mailer->m_linelimit > 0 &&
  2985.     mci->mci_mailer->m_linelimit < sizeof buf - 1)
  2986. buflim = &buf[mci->mci_mailer->m_linelimit - 1];
  2987. /* copy temp file to output with mapping */
  2988. ostate = OS_HEAD;
  2989. bp = buf;
  2990. pbp = peekbuf;
  2991. while (!ferror(mci->mci_out))
  2992. {
  2993. if (pbp > peekbuf)
  2994. c = *--pbp;
  2995. else if ((c = getc(e->e_dfp)) == EOF)
  2996. break;
  2997. if (bitset(MCIF_7BIT, mci->mci_flags))
  2998. c &= 0x7f;
  2999. switch (ostate)
  3000. {
  3001.   case OS_HEAD:
  3002. #if _FFR_NONULLS
  3003. if (c == '' &&
  3004.     bitnset(M_NONULLS, mci->mci_mailer->m_flags))
  3005. break;
  3006. #endif /* _FFR_NONULLS */
  3007. if (c != 'r' && c != 'n' && bp < buflim)
  3008. {
  3009. *bp++ = c;
  3010. break;
  3011. }
  3012. /* check beginning of line for special cases */
  3013. *bp = '';
  3014. pos = 0;
  3015. padc = EOF;
  3016. if (buf[0] == 'F' &&
  3017.     bitnset(M_ESCFROM, mci->mci_mailer->m_flags) &&
  3018.     strncmp(buf, "From ", 5) == 0)
  3019. {
  3020. padc = '>';
  3021. }
  3022. if (buf[0] == '-' && buf[1] == '-' &&
  3023.     separator != NULL)
  3024. {
  3025. /* possible separator */
  3026. int sl = strlen(separator);
  3027. if (strncmp(&buf[2], separator, sl) == 0)
  3028. padc = ' ';
  3029. }
  3030. if (buf[0] == '.' &&
  3031.     bitnset(M_XDOT, mci->mci_mailer->m_flags))
  3032. {
  3033. padc = '.';
  3034. }
  3035. /* now copy out saved line */
  3036. if (TrafficLogFile != NULL)
  3037. {
  3038. fprintf(TrafficLogFile, "%05d >>> ",
  3039. (int) getpid());
  3040. if (padc != EOF)
  3041. (void) putc(padc,
  3042.     TrafficLogFile);
  3043. for (xp = buf; xp < bp; xp++)
  3044. (void) putc(*xp, TrafficLogFile);
  3045. if (c == 'n')
  3046. (void) fputs(mci->mci_mailer->m_eol,
  3047.       TrafficLogFile);
  3048. }
  3049. if (padc != EOF)
  3050. {
  3051. if (putc(padc, mci->mci_out) == EOF)
  3052. continue;
  3053. pos++;
  3054. }
  3055. for (xp = buf; xp < bp; xp++)
  3056. {
  3057. if (putc(*xp, mci->mci_out) == EOF)
  3058. {
  3059. dead = TRUE;
  3060. break;
  3061. }
  3062. /* record progress for DATA timeout */
  3063. DataProgress = TRUE;
  3064. }
  3065. if (dead)
  3066. continue;
  3067. if (c == 'n')
  3068. {
  3069. if (fputs(mci->mci_mailer->m_eol,
  3070.   mci->mci_out) == EOF)
  3071. break;
  3072. pos = 0;
  3073. }
  3074. else
  3075. {
  3076. pos += bp - buf;
  3077. if (c != 'r')
  3078. *pbp++ = c;
  3079. }
  3080. /* record progress for DATA timeout */
  3081. DataProgress = TRUE;
  3082. bp = buf;
  3083. /* determine next state */
  3084. if (c == 'n')
  3085. ostate = OS_HEAD;
  3086. else if (c == 'r')
  3087. ostate = OS_CR;
  3088. else
  3089. ostate = OS_INLINE;
  3090. continue;
  3091.   case OS_CR:
  3092. if (c == 'n')
  3093. {
  3094. /* got CRLF */
  3095. if (fputs(mci->mci_mailer->m_eol,
  3096.   mci->mci_out) == EOF)
  3097. continue;
  3098. /* record progress for DATA timeout */
  3099. DataProgress = TRUE;
  3100. if (TrafficLogFile != NULL)
  3101. {
  3102. (void) fputs(mci->mci_mailer->m_eol,
  3103.      TrafficLogFile);
  3104. }
  3105. ostate = OS_HEAD;
  3106. continue;
  3107. }
  3108. /* had a naked carriage return */
  3109. *pbp++ = c;
  3110. c = 'r';
  3111. ostate = OS_INLINE;
  3112. goto putch;
  3113.   case OS_INLINE:
  3114. if (c == 'r')
  3115. {
  3116. ostate = OS_CR;
  3117. continue;
  3118. }
  3119. #if _FFR_NONULLS
  3120. if (c == '' &&
  3121.     bitnset(M_NONULLS, mci->mci_mailer->m_flags))
  3122. break;
  3123. #endif /* _FFR_NONULLS */
  3124. putch:
  3125. if (mci->mci_mailer->m_linelimit > 0 &&
  3126.     pos > mci->mci_mailer->m_linelimit &&
  3127.     c != 'n')
  3128. {
  3129. if (putc('!', mci->mci_out) == EOF ||
  3130.     fputs(mci->mci_mailer->m_eol,
  3131.   mci->mci_out) == EOF)
  3132. continue;
  3133. /* record progress for DATA timeout */
  3134. DataProgress = TRUE;
  3135. if (TrafficLogFile != NULL)
  3136. {
  3137. fprintf(TrafficLogFile, "!%s",
  3138. mci->mci_mailer->m_eol);
  3139. }
  3140. ostate = OS_HEAD;
  3141. *pbp++ = c;
  3142. continue;
  3143. }
  3144. if (c == 'n')
  3145. {
  3146. if (TrafficLogFile != NULL)
  3147. (void) fputs(mci->mci_mailer->m_eol,
  3148.       TrafficLogFile);
  3149. if (fputs(mci->mci_mailer->m_eol,
  3150.   mci->mci_out) == EOF)
  3151. continue;
  3152. pos = 0;
  3153. ostate = OS_HEAD;
  3154. }
  3155. else
  3156. {
  3157. if (TrafficLogFile != NULL)
  3158. (void) putc(c, TrafficLogFile);
  3159. if (putc(c, mci->mci_out) == EOF)
  3160. continue;
  3161. pos++;
  3162. ostate = OS_INLINE;
  3163. }
  3164. /* record progress for DATA timeout */
  3165. DataProgress = TRUE;
  3166. break;
  3167. }
  3168. }
  3169. /* make sure we are at the beginning of a line */
  3170. if (bp > buf)
  3171. {
  3172. if (TrafficLogFile != NULL)
  3173. {
  3174. for (xp = buf; xp < bp; xp++)
  3175. (void) putc(*xp, TrafficLogFile);
  3176. }
  3177. for (xp = buf; xp < bp; xp++)
  3178. {
  3179. if (putc(*xp, mci->mci_out) == EOF)
  3180. {
  3181. dead = TRUE;
  3182. break;
  3183. }
  3184. /* record progress for DATA timeout */
  3185. DataProgress = TRUE;
  3186. }
  3187. pos += bp - buf;
  3188. }
  3189. if (!dead && pos > 0)
  3190. {
  3191. if (TrafficLogFile != NULL)
  3192. (void) fputs(mci->mci_mailer->m_eol,
  3193.      TrafficLogFile);
  3194. (void) fputs(mci->mci_mailer->m_eol, mci->mci_out);
  3195. /* record progress for DATA timeout */
  3196. DataProgress = TRUE;
  3197. }
  3198. }
  3199. if (ferror(e->e_dfp))
  3200. {
  3201. syserr("putbody: %s/df%s: read error",
  3202.        qid_printqueue(e->e_queuedir), e->e_id);
  3203. ExitStat = EX_IOERR;
  3204. }
  3205. endofmessage:
  3206. /*
  3207. **  Since mailfile() uses e_dfp in a child process,
  3208. **  the file offset in the stdio library for the
  3209. **  parent process will not agree with the in-kernel
  3210. **  file offset since the file descriptor is shared
  3211. **  between the processes.  Therefore, it is vital
  3212. **  that the file always be rewound.  This forces the
  3213. **  kernel offset (lseek) and stdio library (ftell)
  3214. **  offset to match.
  3215. */
  3216. (void) bfrewind(e->e_dfp);
  3217. /* some mailers want extra blank line at end of message */
  3218. if (bitnset(M_BLANKEND, mci->mci_mailer->m_flags) &&
  3219.     buf[0] != '' && buf[0] != 'n')
  3220. putline("", mci);
  3221. (void) fflush(mci->mci_out);
  3222. if (ferror(mci->mci_out) && errno != EPIPE)
  3223. {
  3224. syserr("putbody: write error");
  3225. ExitStat = EX_IOERR;
  3226. }
  3227. errno = 0;
  3228. }
  3229. /*
  3230. **  MAILFILE -- Send a message to a file.
  3231. **
  3232. ** If the file has the setuid/setgid bits set, but NO execute
  3233. ** bits, sendmail will try to become the owner of that file
  3234. ** rather than the real user.  Obviously, this only works if
  3235. ** sendmail runs as root.
  3236. **
  3237. ** This could be done as a subordinate mailer, except that it
  3238. ** is used implicitly to save messages in ~/dead.letter.  We
  3239. ** view this as being sufficiently important as to include it
  3240. ** here.  For example, if the system is dying, we shouldn't have
  3241. ** to create another process plus some pipes to save the message.
  3242. **
  3243. ** Parameters:
  3244. ** filename -- the name of the file to send to.
  3245. ** mailer -- mailer definition for recipient -- if NULL,
  3246. ** use FileMailer.
  3247. ** ctladdr -- the controlling address header -- includes
  3248. ** the userid/groupid to be when sending.
  3249. ** sfflags -- flags for opening.
  3250. ** e -- the current envelope.
  3251. **
  3252. ** Returns:
  3253. ** The exit code associated with the operation.
  3254. **
  3255. ** Side Effects:
  3256. ** none.
  3257. */
  3258. static jmp_buf CtxMailfileTimeout;
  3259. int
  3260. mailfile(filename, mailer, ctladdr, sfflags, e)
  3261. char *volatile filename;
  3262. MAILER *volatile mailer;
  3263. ADDRESS *ctladdr;
  3264. volatile long sfflags;
  3265. register ENVELOPE *e;
  3266. {
  3267. register FILE *f;
  3268. register pid_t pid = -1;
  3269. volatile int mode;
  3270. int len;
  3271. off_t curoff;
  3272. bool suidwarn = geteuid() == 0;
  3273. char *p;
  3274. char *volatile realfile;
  3275. EVENT *ev;
  3276. char buf[MAXLINE + 1];
  3277. char targetfile[MAXPATHLEN + 1];
  3278. if (tTd(11, 1))
  3279. {
  3280. dprintf("mailfile %sn  ctladdr=", filename);
  3281. printaddr(ctladdr, FALSE);
  3282. }
  3283. if (mailer == NULL)
  3284. mailer = FileMailer;
  3285. if (e->e_xfp != NULL)
  3286. (void) fflush(e->e_xfp);
  3287. /*
  3288. **  Special case /dev/null.  This allows us to restrict file
  3289. **  delivery to regular files only.
  3290. */
  3291. if (strcmp(filename, "/dev/null") == 0)
  3292. return EX_OK;
  3293. /* check for 8-bit available */
  3294. if (bitset(EF_HAS8BIT, e->e_flags) &&
  3295.     bitnset(M_7BITS, mailer->m_flags) &&
  3296.     (bitset(EF_DONT_MIME, e->e_flags) ||
  3297.      !(bitset(MM_MIME8BIT, MimeMode) ||
  3298.        (bitset(EF_IS_MIME, e->e_flags) &&
  3299. bitset(MM_CVTMIME, MimeMode)))))
  3300. {
  3301. e->e_status = "5.6.3";
  3302. usrerrenh(e->e_status,
  3303.        "554 Cannot send 8-bit data to 7-bit destination");
  3304. return EX_DATAERR;
  3305. }
  3306. /* Find the actual file */
  3307. if (SafeFileEnv != NULL && SafeFileEnv[0] != '')
  3308. {
  3309. len = strlen(SafeFileEnv);
  3310. if (strncmp(SafeFileEnv, filename, len) == 0)
  3311. filename += len;
  3312. if (len + strlen(filename) + 1 > MAXPATHLEN)
  3313. {
  3314. syserr("mailfile: filename too long (%s/%s)",
  3315.        SafeFileEnv, filename);
  3316. return EX_CANTCREAT;
  3317. }
  3318. (void) strlcpy(targetfile, SafeFileEnv, sizeof targetfile);
  3319. realfile = targetfile + len;
  3320. if (targetfile[len - 1] != '/')
  3321. (void) strlcat(targetfile, "/", sizeof targetfile);
  3322. if (*filename == '/')
  3323. filename++;
  3324. (void) strlcat(targetfile, filename, sizeof targetfile);
  3325. }
  3326. else if (mailer->m_rootdir != NULL)
  3327. {
  3328. expand(mailer->m_rootdir, targetfile, sizeof targetfile, e);
  3329. len = strlen(targetfile);
  3330. if (strncmp(targetfile, filename, len) == 0)
  3331. filename += len;
  3332. if (len + strlen(filename) + 1 > MAXPATHLEN)
  3333. {
  3334. syserr("mailfile: filename too long (%s/%s)",
  3335.        targetfile, filename);
  3336. return EX_CANTCREAT;
  3337. }
  3338. realfile = targetfile + len;
  3339. if (targetfile[len - 1] != '/')
  3340. (void) strlcat(targetfile, "/", sizeof targetfile);
  3341. if (*filename == '/')
  3342. (void) strlcat(targetfile, filename + 1,
  3343.        sizeof targetfile);
  3344. else
  3345. (void) strlcat(targetfile, filename, sizeof targetfile);
  3346. }
  3347. else
  3348. {
  3349. if (strlen(filename) > MAXPATHLEN)
  3350. {
  3351. syserr("mailfile: filename too long (%s)", filename);
  3352. return EX_CANTCREAT;
  3353. }
  3354. (void) strlcpy(targetfile, filename, sizeof targetfile);
  3355. realfile = targetfile;
  3356. }
  3357. /*
  3358. **  Fork so we can change permissions here.
  3359. ** Note that we MUST use fork, not vfork, because of
  3360. ** the complications of calling subroutines, etc.
  3361. */
  3362. DOFORK(fork);
  3363. if (pid < 0)
  3364. return EX_OSERR;
  3365. else if (pid == 0)
  3366. {
  3367. /* child -- actually write to file */
  3368. struct stat stb;
  3369. MCI mcibuf;
  3370. int err;
  3371. volatile int oflags = O_WRONLY|O_APPEND;
  3372. if (e->e_lockfp != NULL)
  3373. (void) close(fileno(e->e_lockfp));
  3374. (void) setsignal(SIGINT, SIG_DFL);
  3375. (void) setsignal(SIGHUP, SIG_DFL);
  3376. (void) setsignal(SIGTERM, SIG_DFL);
  3377. (void) umask(OldUmask);
  3378. e->e_to = filename;
  3379. ExitStat = EX_OK;
  3380. if (setjmp(CtxMailfileTimeout) != 0)
  3381. {
  3382. exit(EX_TEMPFAIL);
  3383. }
  3384. if (TimeOuts.to_fileopen > 0)
  3385. ev = setevent(TimeOuts.to_fileopen, mailfiletimeout, 0);
  3386. else
  3387. ev = NULL;
  3388. /* check file mode to see if setuid */
  3389. if (stat(targetfile, &stb) < 0)
  3390. mode = FileMode;
  3391. else
  3392. mode = stb.st_mode;
  3393. /* limit the errors to those actually caused in the child */
  3394. errno = 0;
  3395. ExitStat = EX_OK;
  3396. if (ctladdr != NULL || bitset(SFF_RUNASREALUID, sfflags))
  3397. {
  3398. /* ignore setuid and setgid bits */
  3399. mode &= ~(S_ISGID|S_ISUID);
  3400. }
  3401. /* we have to open the dfile BEFORE setuid */
  3402. if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags))
  3403. {
  3404. char *df = queuename(e, 'd');
  3405. e->e_dfp = fopen(df, "r");
  3406. if (e->e_dfp == NULL)
  3407. {
  3408. syserr("mailfile: Cannot open %s for %s from %s",
  3409. df, e->e_to, e->e_from.q_paddr);
  3410. }
  3411. }
  3412. /* select a new user to run as */
  3413. if (!bitset(SFF_RUNASREALUID, sfflags))
  3414. {
  3415. if (bitnset(M_SPECIFIC_UID, mailer->m_flags))
  3416. {
  3417. RealUserName = NULL;
  3418. RealUid = mailer->m_uid;
  3419. }
  3420. else if (bitset(S_ISUID, mode))
  3421. {
  3422. RealUserName = NULL;
  3423. RealUid = stb.st_uid;
  3424. }
  3425. else if (ctladdr != NULL && ctladdr->q_uid != 0)
  3426. {
  3427. if (ctladdr->q_ruser != NULL)
  3428. RealUserName = ctladdr->q_ruser;
  3429. else
  3430. RealUserName = ctladdr->q_user;
  3431. RealUid = ctladdr->q_uid;
  3432. }
  3433. else if (mailer != NULL && mailer->m_uid != 0)
  3434. {
  3435. RealUserName = DefUser;
  3436. RealUid = mailer->m_uid;
  3437. }
  3438. else
  3439. {
  3440. RealUserName = DefUser;
  3441. RealUid = DefUid;
  3442. }
  3443. /* select a new group to run as */
  3444. if (bitnset(M_SPECIFIC_UID, mailer->m_flags))
  3445. RealGid = mailer->m_gid;
  3446. else if (bitset(S_ISGID, mode))
  3447. RealGid = stb.st_gid;
  3448. else if (ctladdr != NULL && ctladdr->q_uid != 0)
  3449. RealGid = ctladdr->q_gid;
  3450. else if (ctladdr != NULL &&
  3451.  ctladdr->q_uid == DefUid &&
  3452.  ctladdr->q_gid == 0)
  3453. RealGid = DefGid;
  3454. else if (mailer != NULL && mailer->m_gid != 0)
  3455. RealGid = mailer->m_gid;
  3456. else
  3457. RealGid = DefGid;
  3458. }
  3459. /* last ditch */
  3460. if (!bitset(SFF_ROOTOK, sfflags))
  3461. {
  3462. if (RealUid == 0)
  3463. RealUid = DefUid;
  3464. if (RealGid == 0)
  3465. RealGid = DefGid;
  3466. }
  3467. /* set group id list (needs /etc/group access) */
  3468. if (RealUserName != NULL && !DontInitGroups)
  3469. {
  3470. if (initgroups(RealUserName, RealGid) == -1 && suidwarn)
  3471. syserr("mailfile: initgroups(%s, %d) failed",
  3472. RealUserName, RealGid);
  3473. }
  3474. else
  3475. {
  3476. GIDSET_T gidset[1];
  3477. gidset[0] = RealGid;
  3478. if (setgroups(1, gidset) == -1 && suidwarn)
  3479. syserr("mailfile: setgroups() failed");
  3480. }
  3481. /*
  3482. **  If you have a safe environment, go into it.
  3483. */
  3484. if (realfile != targetfile)
  3485. {
  3486. *realfile = '';
  3487. if (tTd(11, 20))
  3488. dprintf("mailfile: chroot %sn", targetfile);
  3489. if (chroot(targetfile) < 0)
  3490. {
  3491. syserr("mailfile: Cannot chroot(%s)",
  3492.        targetfile);
  3493. exit(EX_CANTCREAT);
  3494. }
  3495. *realfile = '/';
  3496. }
  3497. if (tTd(11, 40))
  3498. dprintf("mailfile: deliver to %sn", realfile);
  3499. if (chdir("/") < 0)
  3500. syserr("mailfile: cannot chdir(/)");
  3501. /* now reset the group and user ids */
  3502. endpwent();
  3503. if (setgid(RealGid) < 0 && suidwarn)
  3504. syserr("mailfile: setgid(%ld) failed", (long) RealGid);
  3505. vendor_set_uid(RealUid);
  3506. if (setuid(RealUid) < 0 && suidwarn)
  3507. syserr("mailfile: setuid(%ld) failed", (long) RealUid);
  3508. if (tTd(11, 2))
  3509. dprintf("mailfile: running as r/euid=%d/%d, r/egid=%d/%dn",
  3510. (int) getuid(), (int) geteuid(),
  3511. (int) getgid(), (int) getegid());
  3512. /* move into some "safe" directory */
  3513. if (mailer->m_execdir != NULL)
  3514. {
  3515. char *q;
  3516. for (p = mailer->m_execdir; p != NULL; p = q)
  3517. {
  3518. q = strchr(p, ':');
  3519. if (q != NULL)
  3520. *q = '';
  3521. expand(p, buf, sizeof buf, e);
  3522. if (q != NULL)
  3523. *q++ = ':';
  3524. if (tTd(11, 20))
  3525. dprintf("mailfile: trydir %sn", buf);
  3526. if (buf[0] != '' && chdir(buf) >= 0)
  3527. break;
  3528. }
  3529. }
  3530. /*
  3531. **  Recheck the file after we have assumed the ID of the
  3532. **  delivery user to make sure we can deliver to it as
  3533. **  that user.  This is necessary if sendmail is running
  3534. **  as root and the file is on an NFS mount which treats
  3535. **  root as nobody.
  3536. */
  3537. #if HASLSTAT
  3538. if (bitnset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail))
  3539. err = stat(realfile, &stb);
  3540. else
  3541. err = lstat(realfile, &stb);
  3542. #else /* HASLSTAT */
  3543. err = stat(realfile, &stb);
  3544. #endif /* HASLSTAT */
  3545. if (err < 0)
  3546. {
  3547. stb.st_mode = ST_MODE_NOFILE;
  3548. mode = FileMode;
  3549. oflags |= O_CREAT|O_EXCL;
  3550. }
  3551. else if (bitset(S_IXUSR|S_IXGRP|S_IXOTH, mode) ||
  3552.  (!bitnset(DBS_FILEDELIVERYTOHARDLINK,
  3553.    DontBlameSendmail) &&
  3554.   stb.st_nlink != 1) ||
  3555.  (realfile != targetfile && !S_ISREG(mode)))
  3556. exit(EX_CANTCREAT);
  3557. else
  3558. mode = stb.st_mode;
  3559. if (!bitnset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail))
  3560. sfflags |= SFF_NOSLINK;
  3561. if (!bitnset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail))
  3562. sfflags |= SFF_NOHLINK;
  3563. sfflags &= ~SFF_OPENASROOT;
  3564. f = safefopen(realfile, oflags, mode, sfflags);
  3565. if (f == NULL)
  3566. {
  3567. if (transienterror(errno))
  3568. {
  3569. usrerr("454 4.3.0 cannot open %s: %s",
  3570.        shortenstring(realfile, MAXSHORTSTR),
  3571.        errstring(errno));
  3572. exit(EX_TEMPFAIL);
  3573. }
  3574. else
  3575. {
  3576. usrerr("554 5.3.0 cannot open %s: %s",
  3577.        shortenstring(realfile, MAXSHORTSTR),
  3578.        errstring(errno));
  3579. exit(EX_CANTCREAT);
  3580. }
  3581. }
  3582. if (filechanged(realfile, fileno(f), &stb))
  3583. {
  3584. syserr("554 5.3.0 file changed after open");
  3585. exit(EX_CANTCREAT);
  3586. }
  3587. if (fstat(fileno(f), &stb) < 0)
  3588. {
  3589. syserr("554 5.3.0 cannot fstat %s", errstring(errno));
  3590. exit(EX_CANTCREAT);
  3591. }
  3592. curoff = stb.st_size;
  3593. if (ev != NULL)
  3594. clrevent(ev);
  3595. memset(&mcibuf, '', sizeof mcibuf);
  3596. mcibuf.mci_mailer = mailer;
  3597. mcibuf.mci_out = f;
  3598. if (bitnset(M_7BITS, mailer->m_flags))
  3599. mcibuf.mci_flags |= MCIF_7BIT;
  3600. /* clear out per-message flags from connection structure */
  3601. mcibuf.mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7);
  3602. if (bitset(EF_HAS8BIT, e->e_flags) &&
  3603.     !bitset(EF_DONT_MIME, e->e_flags) &&
  3604.     bitnset(M_7BITS, mailer->m_flags))
  3605. mcibuf.mci_flags |= MCIF_CVT8TO7;
  3606. #if MIME7TO8
  3607. if (bitnset(M_MAKE8BIT, mailer->m_flags) &&
  3608.     !bitset(MCIF_7BIT, mcibuf.mci_flags) &&
  3609.     (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL &&
  3610.     (strcasecmp(p, "quoted-printable") == 0 ||
  3611.      strcasecmp(p, "base64") == 0) &&
  3612.     (p = hvalue("Content-Type", e->e_header)) != NULL)
  3613. {
  3614. /* may want to convert 7 -> 8 */
  3615. /* XXX should really parse it here -- and use a class XXX */
  3616. if (strncasecmp(p, "text/plain", 10) == 0 &&
  3617.     (p[10] == '' || p[10] == ' ' || p[10] == ';'))
  3618. mcibuf.mci_flags |= MCIF_CVT7TO8;
  3619. }
  3620. #endif /* MIME7TO8 */
  3621. putfromline(&mcibuf, e);
  3622. (*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER);
  3623. (*e->e_putbody)(&mcibuf, e, NULL);
  3624. putline("n", &mcibuf);
  3625. if (fflush(f) < 0 ||
  3626.     (SuperSafe && fsync(fileno(f)) < 0) ||
  3627.     ferror(f))
  3628. {
  3629. setstat(EX_IOERR);
  3630. #if !NOFTRUNCATE
  3631. (void) ftruncate(fileno(f), curoff);
  3632. #endif /* !NOFTRUNCATE */
  3633. }
  3634. /* reset ISUID & ISGID bits for paranoid systems */
  3635. #if HASFCHMOD
  3636. (void) fchmod(fileno(f), (MODE_T) mode);
  3637. #else /* HASFCHMOD */
  3638. (void) chmod(filename, (MODE_T) mode);
  3639. #endif /* HASFCHMOD */
  3640. if (fclose(f) < 0)
  3641. setstat(EX_IOERR);
  3642. (void) fflush(stdout);
  3643. (void) setuid(RealUid);
  3644. exit(ExitStat);
  3645. /* NOTREACHED */
  3646. }
  3647. else
  3648. {
  3649. /* parent -- wait for exit status */
  3650. int st;
  3651. st = waitfor(pid);
  3652. if (st == -1)
  3653. {
  3654. syserr("mailfile: %s: wait", mailer->m_name);
  3655. return EX_SOFTWARE;
  3656. }
  3657. if (WIFEXITED(st))
  3658. return (WEXITSTATUS(st));
  3659. else
  3660. {
  3661. syserr("mailfile: %s: child died on signal %d",
  3662.        mailer->m_name, st);
  3663. return EX_UNAVAILABLE;
  3664. }
  3665. /* NOTREACHED */
  3666. }
  3667. return EX_UNAVAILABLE; /* avoid compiler warning on IRIX */
  3668. }
  3669. static void
  3670. mailfiletimeout()
  3671. {
  3672. longjmp(CtxMailfileTimeout, 1);
  3673. }
  3674. /*
  3675. **  HOSTSIGNATURE -- return the "signature" for a host.
  3676. **
  3677. ** The signature describes how we are going to send this -- it
  3678. ** can be just the hostname (for non-Internet hosts) or can be
  3679. ** an ordered list of MX hosts.
  3680. **
  3681. ** Parameters:
  3682. ** m -- the mailer describing this host.
  3683. ** host -- the host name.
  3684. **
  3685. ** Returns:
  3686. ** The signature for this host.
  3687. **
  3688. ** Side Effects:
  3689. ** Can tweak the symbol table.
  3690. */
  3691. #define MAXHOSTSIGNATURE 8192 /* max len of hostsignature */
  3692. static char *
  3693. hostsignature(m, host)
  3694. register MAILER *m;
  3695. char *host;
  3696. {
  3697. register char *p;
  3698. register STAB *s;
  3699. #if NAMED_BIND
  3700. char sep = ':';
  3701. char prevsep = ':';
  3702. int i;
  3703. int len;
  3704. int nmx;
  3705. int hl;
  3706. char *hp;
  3707. char *endp;
  3708. int oldoptions = _res.options;
  3709. char *mxhosts[MAXMXHOSTS + 1];
  3710. u_short mxprefs[MAXMXHOSTS + 1];
  3711. #endif /* NAMED_BIND */
  3712. if (tTd(17, 3))
  3713. dprintf("hostsignature(%s)n", host);
  3714. /*
  3715. **  If local delivery, just return a constant.
  3716. */
  3717. if (bitnset(M_LOCALMAILER, m->m_flags))
  3718. return "localhost";
  3719. /*
  3720. **  Check to see if this uses IPC -- if not, it can't have MX records.
  3721. */
  3722. p = m->m_mailer;
  3723. if (strcmp(p, "[IPC]") != 0 &&
  3724.     strcmp(p, "[TCP]") != 0)
  3725. {
  3726. /* just an ordinary mailer */
  3727. return host;
  3728. }
  3729. #if NETUNIX
  3730. else
  3731. {
  3732. if (m->m_argv[0] != NULL &&
  3733.     strcmp(m->m_argv[0], "FILE") == 0)
  3734. {
  3735. /* rendezvous in the file system, no MX records */
  3736. return host;
  3737. }
  3738. }
  3739. #endif /* NETUNIX */
  3740. /*
  3741. **  Look it up in the symbol table.
  3742. */
  3743. s = stab(host, ST_HOSTSIG, ST_ENTER);
  3744. if (s->s_hostsig != NULL)
  3745. {
  3746. if (tTd(17, 3))
  3747. dprintf("hostsignature(): stab(%s) found %sn", host,
  3748. s->s_hostsig);
  3749. return s->s_hostsig;
  3750. }
  3751. /*
  3752. **  Not already there -- create a signature.
  3753. */
  3754. #if NAMED_BIND
  3755. if (ConfigLevel < 2)
  3756. _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */
  3757. for (hp = host; hp != NULL; hp = endp)
  3758. {
  3759. #if NETINET6
  3760. if (*hp == '[')
  3761. {
  3762. endp = strchr(hp + 1, ']');
  3763. if (endp != NULL)
  3764. endp = strpbrk(endp + 1, ":,");
  3765. }
  3766. else
  3767. endp = strpbrk(hp, ":,");
  3768. #else /* NETINET6 */
  3769. endp = strpbrk(hp, ":,");
  3770. #endif /* NETINET6 */
  3771. if (endp != NULL)
  3772. {
  3773. sep = *endp;
  3774. *endp = '';
  3775. }
  3776. if (bitnset(M_NOMX, m->m_flags))
  3777. {
  3778. /* skip MX lookups */
  3779. nmx = 1;
  3780. mxhosts[0] = hp;
  3781. }
  3782. else
  3783. {
  3784. auto int rcode;
  3785. nmx = getmxrr(hp, mxhosts, mxprefs, TRUE, &rcode);
  3786. if (nmx <= 0)
  3787. {
  3788. register MCI *mci;
  3789. /* update the connection info for this host */
  3790. mci = mci_get(hp, m);
  3791. mci->mci_errno = errno;
  3792. mci->mci_herrno = h_errno;
  3793. mci->mci_lastuse = curtime();
  3794. if (rcode == EX_NOHOST)
  3795. mci_setstat(mci, rcode, "5.1.2",
  3796. "550 Host unknown");
  3797. else
  3798. mci_setstat(mci, rcode, NULL, NULL);
  3799. /* use the original host name as signature */
  3800. nmx = 1;
  3801. mxhosts[0] = hp;
  3802. }
  3803. if (tTd(17, 3))
  3804. dprintf("hostsignature(): getmxrr() returned %d, mxhosts[0]=%sn",
  3805. nmx, mxhosts[0]);
  3806. }
  3807. len = 0;
  3808. for (i = 0; i < nmx; i++)
  3809. len += strlen(mxhosts[i]) + 1;
  3810. if (s->s_hostsig != NULL)
  3811. len += strlen(s->s_hostsig) + 1;
  3812. if (len >= MAXHOSTSIGNATURE)
  3813. {
  3814. sm_syslog(LOG_WARNING, NOQID, "hostsignature for host '%s' exceeds maxlen (%d): %d",
  3815.   host, MAXHOSTSIGNATURE, len);
  3816. len = MAXHOSTSIGNATURE;
  3817. }
  3818. p = xalloc(len);
  3819. if (s->s_hostsig != NULL)
  3820. {
  3821. (void) strlcpy(p, s->s_hostsig, len);
  3822. free(s->s_hostsig);
  3823. s->s_hostsig = p;
  3824. hl = strlen(p);
  3825. p += hl;
  3826. *p++ = prevsep;
  3827. len -= hl + 1;
  3828. }
  3829. else
  3830. s->s_hostsig = p;
  3831. for (i = 0; i < nmx; i++)
  3832. {
  3833. hl = strlen(mxhosts[i]);
  3834. if (len - 1 < hl || len <= 1)
  3835. {
  3836. /* force to drop out of outer loop */
  3837. len = -1;
  3838. break;
  3839. }
  3840. if (i != 0)
  3841. {
  3842. if (mxprefs[i] == mxprefs[i - 1])
  3843. *p++ = ',';
  3844. else
  3845. *p++ = ':';
  3846. len--;
  3847. }
  3848. (void) strlcpy(p, mxhosts[i], len);
  3849. p += hl;
  3850. len -= hl;
  3851. }
  3852. /*
  3853. **  break out of loop if len exceeded MAXHOSTSIGNATURE
  3854. **  because we won't have more space for further hosts
  3855. **  anyway (separated by : in the .cf file).
  3856. */
  3857. if (len < 0)
  3858. break;
  3859. if (endp != NULL)
  3860. *endp++ = sep;
  3861. prevsep = sep;
  3862. }
  3863. makelower(s->s_hostsig);
  3864. if (ConfigLevel < 2)
  3865. _res.options = oldoptions;
  3866. #else /* NAMED_BIND */
  3867. /* not using BIND -- the signature is just the host name */
  3868. s->s_hostsig = host;
  3869. #endif /* NAMED_BIND */
  3870. if (tTd(17, 1))
  3871. dprintf("hostsignature(%s) = %sn", host, s->s_hostsig);
  3872. return s->s_hostsig;
  3873. }
  3874. /*
  3875. **  PARSE_HOSTSIGNATURE -- parse the "signature" and return MX host array.
  3876. **
  3877. ** The signature describes how we are going to send this -- it
  3878. ** can be just the hostname (for non-Internet hosts) or can be
  3879. ** an ordered list of MX hosts which must be randomized for equal
  3880. ** MX preference values.
  3881. **
  3882. ** Parameters:
  3883. ** sig -- the host signature.
  3884. ** mxhosts -- array to populate.
  3885. **
  3886. ** Returns:
  3887. ** The number of hosts inserted into mxhosts array.
  3888. **
  3889. ** Side Effects:
  3890. ** Randomizes equal MX preference hosts in mxhosts.
  3891. */
  3892. static int
  3893. parse_hostsignature(sig, mxhosts, mailer)
  3894. char *sig;
  3895. char **mxhosts;
  3896. MAILER *mailer;
  3897. {
  3898. int nmx = 0;
  3899. int curpref = 0;
  3900. int i, j;
  3901. char *hp, *endp;
  3902. u_short prefer[MAXMXHOSTS];
  3903. long rndm[MAXMXHOSTS];
  3904. for (hp = sig; hp != NULL; hp = endp)
  3905. {
  3906. char sep = ':';
  3907. #if NETINET6
  3908. if (*hp == '[')
  3909. {
  3910. endp = strchr(hp + 1, ']');
  3911. if (endp != NULL)
  3912. endp = strpbrk(endp + 1, ":,");
  3913. }
  3914. else
  3915. endp = strpbrk(hp, ":,");
  3916. #else /* NETINET6 */
  3917. endp = strpbrk(hp, ":,");
  3918. #endif /* NETINET6 */
  3919. if (endp != NULL)
  3920. {
  3921. sep = *endp;
  3922. *endp = '';
  3923. }
  3924. mxhosts[nmx] = hp;
  3925. prefer[nmx] = curpref;
  3926. if (mci_match(hp, mailer))
  3927. rndm[nmx] = 0;
  3928. else
  3929. rndm[nmx] = get_random();
  3930. if (endp != NULL)
  3931. {
  3932. /*
  3933. **  Since we don't have the original MX prefs,
  3934. **  make our own.  If the separator is a ':', that
  3935. **  means the preference for the next host will be
  3936. **  higher than this one, so simply increment curpref.
  3937. */
  3938. if (sep == ':')
  3939. curpref++;
  3940. *endp++ = sep;
  3941. }
  3942. if (++nmx >= MAXMXHOSTS)
  3943. break;
  3944. }
  3945. /* sort the records using the random factor for equal preferences */
  3946. for (i = 0; i < nmx; i++)
  3947. {
  3948. for (j = i + 1; j < nmx; j++)
  3949. {
  3950. /*
  3951. **  List is already sorted by MX preference, only
  3952. **  need to look for equal preference MX records
  3953. */
  3954. if (prefer[i] < prefer[j])
  3955. break;
  3956. if (prefer[i] > prefer[j] ||
  3957.     (prefer[i] == prefer[j] && rndm[i] > rndm[j]))
  3958. {
  3959. register u_short tempp;
  3960. register long tempr;
  3961. register char *temp1;
  3962. tempp = prefer[i];
  3963. prefer[i] = prefer[j];
  3964. prefer[j] = tempp;
  3965. temp1 = mxhosts[i];
  3966. mxhosts[i] = mxhosts[j];
  3967. mxhosts[j] = temp1;
  3968. tempr = rndm[i];
  3969. rndm[i] = rndm[j];
  3970. rndm[j] = tempr;
  3971. }
  3972. }
  3973. }
  3974. return nmx;
  3975. }
  3976. #if SMTP
  3977. #endif /* SMTP */