- p = NULL;
- if (CurEnv->e_returnto->q_mailer == LocalMailer)
- {
- if (CurEnv->e_returnto->q_home != NULL)
- p = CurEnv->e_returnto->q_home;
- else if ((pw = getpwnam(CurEnv->e_returnto->q_user)) != NULL)
- p = pw->pw_dir;
- }
- if (p == NULL)
- {
- syserr("Can't return mail to %s", CurEnv->e_returnto->q_paddr);
-# ifdef DEBUG
- p = "/usr/tmp";
-# endif
- }
- if (p != NULL && e->e_dfp != NULL)
- {
- auto ADDRESS *q;
- bool oldverb = Verbose;
-
- /* we have a home directory; open dead.letter */
- define('z', p, e);
- expand("$z/dead.letter", buf, &buf[sizeof buf - 1], e);
- Verbose = TRUE;
- message(Arpa_Info, "Saving message in %s", buf);
- Verbose = oldverb;
- e->e_to = buf;
- q = NULL;
- sendtolist(buf, (ADDRESS *) NULL, &q);
- (void) deliver(e, q);
- }
+ q = NULL;
+ if (sendtolist("postmaster", NULL, &q, e) <= 0)
+ {
+ syserr("553 cannot parse postmaster!");
+ ExitStat = EX_SOFTWARE;
+ state = ESM_USRTMP;
+ break;
+ }
+ if (returntosender(e->e_message,
+ q, (e->e_class >= 0), e) == 0)
+ {
+ state = ESM_DONE;
+ break;
+ }
+
+ /* didn't work -- last resort */
+ state = ESM_USRTMP;
+ break;
+
+ case ESM_DEADLETTER:
+ /*
+ ** Save the message in dead.letter.
+ ** If we weren't mailing back, and the user is
+ ** local, we should save the message in
+ ** ~/dead.letter so that the poor person doesn't
+ ** have to type it over again -- and we all know
+ ** what poor typists UNIX users are.
+ */
+
+ p = NULL;
+ if (e->e_from.q_mailer == LocalMailer)
+ {
+ if (e->e_from.q_home != NULL)
+ p = e->e_from.q_home;
+ else if ((pw = getpwnam(e->e_from.q_user)) != NULL)
+ p = pw->pw_dir;
+ }
+ if (p == NULL)
+ {
+ /* no local directory */
+ state = ESM_MAIL;
+ break;
+ }
+ if (e->e_dfp != NULL)
+ {
+ bool oldverb = Verbose;
+
+ /* we have a home directory; open dead.letter */
+ define('z', p, e);
+ expand("\201z/dead.letter", buf, &buf[sizeof buf - 1], e);
+ Verbose = TRUE;
+ message("Saving message in %s", buf);
+ Verbose = oldverb;
+ e->e_to = buf;
+ q = NULL;
+ (void) sendtolist(buf, &e->e_from, &q, e);
+ if (deliver(e, q) == 0)
+ state = ESM_DONE;
+ else
+ state = ESM_MAIL;
+ }
+ else
+ {
+ /* no data file -- try mailing back */
+ state = ESM_MAIL;
+ }
+ break;
+
+ case ESM_USRTMP:
+ /*
+ ** Log the mail in /usr/tmp/dead.letter.
+ */
+
+ if (e->e_class < 0)
+ {
+ state = ESM_DONE;
+ break;
+ }
+
+ fp = dfopen("/usr/tmp/dead.letter",
+ O_WRONLY|O_CREAT|O_APPEND, FileMode);
+ if (fp == NULL)
+ {
+ state = ESM_PANIC;
+ break;
+ }
+
+ putfromline(fp, FileMailer, e);
+ (*e->e_puthdr)(fp, FileMailer, e);
+ putline("\n", fp, FileMailer);
+ (*e->e_putbody)(fp, FileMailer, e, NULL);
+ putline("\n", fp, FileMailer);
+ (void) fflush(fp);
+ state = ferror(fp) ? ESM_PANIC : ESM_DONE;
+ (void) xfclose(fp, "savemail", "/usr/tmp/dead.letter");
+ break;