From 18a81ac0bf8a422d1bd6c1f5ac5371936f91b167 Mon Sep 17 00:00:00 2001 From: Eric Allman Date: Tue, 21 Mar 1995 23:28:42 -0800 Subject: [PATCH] eliminate `D' line in qf file SCCS-vsn: usr.sbin/sendmail/src/envelope.c 8.54 SCCS-vsn: usr.sbin/sendmail/src/collect.c 8.31 SCCS-vsn: usr.sbin/sendmail/src/sendmail.h 8.105 SCCS-vsn: usr.sbin/sendmail/src/savemail.c 8.58 SCCS-vsn: usr.sbin/sendmail/src/deliver.c 8.132 SCCS-vsn: usr.sbin/sendmail/src/queue.c 8.72 SCCS-vsn: usr.sbin/sendmail/src/mime.c 8.12 --- usr/src/usr.sbin/sendmail/src/collect.c | 19 ++++---- usr/src/usr.sbin/sendmail/src/deliver.c | 33 +++++++------ usr/src/usr.sbin/sendmail/src/envelope.c | 15 +++--- usr/src/usr.sbin/sendmail/src/mime.c | 6 +-- usr/src/usr.sbin/sendmail/src/queue.c | 60 ++++++++++++++---------- usr/src/usr.sbin/sendmail/src/savemail.c | 4 +- usr/src/usr.sbin/sendmail/src/sendmail.h | 6 +-- 7 files changed, 78 insertions(+), 65 deletions(-) diff --git a/usr/src/usr.sbin/sendmail/src/collect.c b/usr/src/usr.sbin/sendmail/src/collect.c index 1974489b59..3f72621370 100644 --- a/usr/src/usr.sbin/sendmail/src/collect.c +++ b/usr/src/usr.sbin/sendmail/src/collect.c @@ -7,7 +7,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)collect.c 8.30 (Berkeley) %G%"; +static char sccsid[] = "@(#)collect.c 8.31 (Berkeley) %G%"; #endif /* not lint */ # include @@ -74,6 +74,7 @@ maketemp(from) int mstate; char *pbp; char peekbuf[8]; + char dfname[20]; char bufbuf[MAXLINE]; extern bool isheader(); extern void eatheader(); @@ -95,11 +96,10 @@ maketemp(from) { struct stat stbuf; - e->e_df = queuename(e, 'd'); - e->e_df = newstr(e->e_df); - if ((tf = dfopen(e->e_df, O_WRONLY|O_CREAT|O_TRUNC, FileMode)) == NULL) + strcpy(dfname, queuename(e, 'd')); + if ((tf = dfopen(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode)) == NULL) { - syserr("Cannot create %s", e->e_df); + syserr("Cannot create %s", dfname); e->e_flags |= EF_NO_BODY_RETN; finis(); } @@ -112,6 +112,7 @@ maketemp(from) } HasEightBits = FALSE; e->e_msgsize = 0; + e->e_flags |= EF_HAS_DF; } /* @@ -407,7 +408,7 @@ readerr: if (CollectErrno != 0) { errno = CollectErrno; - syserr(CollectErrorMessage, e->e_df); + syserr(CollectErrorMessage, dfname); finis(); } usrerr(CollectErrorMessage); @@ -530,10 +531,10 @@ readerr: usrerr("554 Eight bit data not allowed"); } - if ((e->e_dfp = fopen(e->e_df, "r")) == NULL) + if ((e->e_dfp = fopen(dfname, "r")) == NULL) { /* we haven't acked receipt yet, so just chuck this */ - syserr("Cannot reopen %s", e->e_df); + syserr("Cannot reopen %s", dfname); finis(); } } @@ -580,7 +581,7 @@ tferror(tf, e) e->e_flags |= EF_NO_BODY_RETN; if (fstat(fileno(tf), &st) < 0) st.st_size = 0; - (void) freopen(e->e_df, "w", tf); + (void) freopen(queuename(e, 'd'), "w", tf); if (st.st_size <= 0) fprintf(tf, "\n*** Mail could not be accepted"); else if (sizeof st.st_size > sizeof (long)) diff --git a/usr/src/usr.sbin/sendmail/src/deliver.c b/usr/src/usr.sbin/sendmail/src/deliver.c index af40cf49a2..d0a07bead6 100644 --- a/usr/src/usr.sbin/sendmail/src/deliver.c +++ b/usr/src/usr.sbin/sendmail/src/deliver.c @@ -7,7 +7,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)deliver.c 8.131 (Berkeley) %G%"; +static char sccsid[] = "@(#)deliver.c 8.132 (Berkeley) %G%"; #endif /* not lint */ #include "sendmail.h" @@ -358,7 +358,6 @@ sendall(e, mode) ee->e_from.q_flags |= QDONTSEND; ee->e_dfp = NULL; ee->e_xfp = NULL; - ee->e_df = NULL; ee->e_errormode = EM_MAIL; for (q = e->e_sendqueue; q != NULL; q = q->q_next) @@ -374,15 +373,17 @@ sendall(e, mode) q->q_flags &= ~QQUEUEUP; } - if (e->e_df != NULL && mode != SM_VERIFY) + if (mode != SM_VERIFY && bitset(EF_HAS_DF, e->e_flags)) { + char df1buf[20], df2buf[20]; + ee->e_dfp = NULL; - ee->e_df = queuename(ee, 'd'); - ee->e_df = newstr(ee->e_df); - if (link(e->e_df, ee->e_df) < 0) + strcpy(df1buf, queuename(e, 'd')); + strcpy(df2buf, queuename(ee, 'd')); + if (link(df1buf, df2buf) < 0) { syserr("sendall: link(%s, %s)", - e->e_df, ee->e_df); + df1buf, df2buf); } } #ifdef LOG @@ -2245,12 +2246,14 @@ putbody(mci, e, separator) ** Output the body of the message */ - if (e->e_dfp == NULL && e->e_df != NULL) + if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) { - e->e_dfp = fopen(e->e_df, "r"); + char *df = queuename(e, 'd'); + + e->e_dfp = fopen(df, "r"); if (e->e_dfp == NULL) syserr("putbody: Cannot open %s for %s from %s", - e->e_df, e->e_to, e->e_from.q_paddr); + df, e->e_to, e->e_from.q_paddr); } if (e->e_dfp == NULL) { @@ -2466,7 +2469,7 @@ putch: if (ferror(e->e_dfp)) { - syserr("putbody: %s: read error", e->e_df); + syserr("putbody: df%s: read error", e->e_id); ExitStat = EX_IOERR; } @@ -2585,13 +2588,15 @@ mailfile(filename, ctladdr, e) } /* we have to open the dfile BEFORE setuid */ - if (e->e_dfp == NULL && e->e_df != NULL) + if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) { - e->e_dfp = fopen(e->e_df, "r"); + char *df = queuename(e, 'd'); + + e->e_dfp = fopen(df, "r"); if (e->e_dfp == NULL) { syserr("mailfile: Cannot open %s for %s from %s", - e->e_df, e->e_to, e->e_from.q_paddr); + df, e->e_to, e->e_from.q_paddr); } } diff --git a/usr/src/usr.sbin/sendmail/src/envelope.c b/usr/src/usr.sbin/sendmail/src/envelope.c index 177a317c7b..6b9149b994 100644 --- a/usr/src/usr.sbin/sendmail/src/envelope.c +++ b/usr/src/usr.sbin/sendmail/src/envelope.c @@ -7,7 +7,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)envelope.c 8.53 (Berkeley) %G%"; +static char sccsid[] = "@(#)envelope.c 8.54 (Berkeley) %G%"; #endif /* not lint */ #include "sendmail.h" @@ -119,8 +119,7 @@ dropenvelope(e) queueit = TRUE; /* see if a notification is needed */ - if (e->e_df != NULL && - bitset(QBADADDR, q->q_flags) && + if (bitset(QBADADDR, q->q_flags) && bitset(QPINGONFAILURE, q->q_flags)) { failure_return = TRUE; @@ -282,8 +281,7 @@ dropenvelope(e) if (tTd(50, 1)) printf("\n===== Dropping [dq]f%s (queueit=%d, e_flags=%x) =====\n\n", e->e_id, queueit, e->e_flags); - if (e->e_df != NULL) - xunlink(e->e_df); + xunlink(queuename(e, 'd')); xunlink(queuename(e, 'q')); #ifdef LOG @@ -306,9 +304,10 @@ dropenvelope(e) /* make sure that this envelope is marked unused */ if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "dropenvelope", e->e_df); + (void) xfclose(e->e_dfp, "dropenvelope df", e->e_id); e->e_dfp = NULL; - e->e_id = e->e_df = NULL; + e->e_id = NULL; + e->e_flags &= ~EF_HAS_DF; } /* ** CLEARENVELOPE -- clear an envelope without unlocking @@ -345,7 +344,7 @@ clearenvelope(e, fullclear) if (e->e_xfp != NULL) (void) xfclose(e->e_xfp, "clearenvelope xfp", e->e_id); if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "clearenvelope dfp", e->e_df); + (void) xfclose(e->e_dfp, "clearenvelope dfp", e->e_id); e->e_xfp = e->e_dfp = NULL; } diff --git a/usr/src/usr.sbin/sendmail/src/mime.c b/usr/src/usr.sbin/sendmail/src/mime.c index f07799e81f..c526f68779 100644 --- a/usr/src/usr.sbin/sendmail/src/mime.c +++ b/usr/src/usr.sbin/sendmail/src/mime.c @@ -10,7 +10,7 @@ # include #ifndef lint -static char sccsid[] = "@(#)mime.c 8.11 (Berkeley) %G%"; +static char sccsid[] = "@(#)mime.c 8.12 (Berkeley) %G%"; #endif /* not lint */ /* @@ -238,7 +238,7 @@ mime8to7(mci, header, e, boundaries, flags) /* remember where we were */ offset = ftell(e->e_dfp); if (offset == -1) - syserr("mime8to7: cannot ftell on %s", e->e_df); + syserr("mime8to7: cannot ftell on df%s", e->e_id); /* do a scan of this body type to count character types */ while (fgets(buf, sizeof buf, e->e_dfp) != NULL) @@ -270,7 +270,7 @@ mime8to7(mci, header, e, boundaries, flags) /* return to the original offset for processing */ /* XXX use relative seeks to handle >31 bit file sizes? */ if (fseek(e->e_dfp, offset, SEEK_SET) < 0) - syserr("mime8to7: cannot fseek on %s", e->e_df); + syserr("mime8to7: cannot fseek on df%s", e->e_id); } /* diff --git a/usr/src/usr.sbin/sendmail/src/queue.c b/usr/src/usr.sbin/sendmail/src/queue.c index e67979bb76..d5d37d776b 100644 --- a/usr/src/usr.sbin/sendmail/src/queue.c +++ b/usr/src/usr.sbin/sendmail/src/queue.c @@ -10,9 +10,9 @@ #ifndef lint #ifdef QUEUE -static char sccsid[] = "@(#)queue.c 8.71 (Berkeley) %G% (with queueing)"; +static char sccsid[] = "@(#)queue.c 8.72 (Berkeley) %G% (with queueing)"; #else -static char sccsid[] = "@(#)queue.c 8.71 (Berkeley) %G% (without queueing)"; +static char sccsid[] = "@(#)queue.c 8.72 (Berkeley) %G% (without queueing)"; #endif #endif /* not lint */ @@ -155,18 +155,18 @@ queueup(e, queueall, announce) ** If there is no data file yet, create one. */ - if (e->e_df == NULL) + if (!bitset(EF_HAS_DF, e->e_flags)) { register FILE *dfp; + char dfname[20]; struct stat stbuf; extern putbody(); - e->e_df = queuename(e, 'd'); - e->e_df = newstr(e->e_df); - fd = open(e->e_df, O_WRONLY|O_CREAT|O_TRUNC, FileMode); + strcpy(dfname, queuename(e, 'd')); + fd = open(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode); if (fd < 0 || (dfp = fdopen(fd, "w")) == NULL) syserr("!queueup: cannot create data temp file %s, uid=%d", - e->e_df, geteuid()); + dfname, geteuid()); if (fstat(fd, &stbuf) < 0) e->e_dfino = -1; else @@ -174,6 +174,7 @@ queueup(e, queueall, announce) e->e_dfdev = stbuf.st_dev; e->e_dfino = stbuf.st_ino; } + e->e_flags |= EF_HAS_DF; bzero(&mcibuf, sizeof mcibuf); mcibuf.mci_out = dfp; mcibuf.mci_mailer = FileMailer; @@ -209,10 +210,9 @@ queueup(e, queueall, announce) fprintf(tfp, "I%d/%d/%ld\n", major(e->e_dfdev), minor(e->e_dfdev), e->e_dfino); - /* output type and name of data file */ + /* output body type */ if (e->e_bodytype != NULL) fprintf(tfp, "B%s\n", e->e_bodytype); - fprintf(tfp, "D%s\n", e->e_df); /* message from envelope, if it exists */ if (e->e_message != NULL) @@ -365,8 +365,8 @@ queueup(e, queueall, announce) /* rename (locked) tf to be (locked) qf */ qf = queuename(e, 'q'); if (rename(tf, qf) < 0) - syserr("cannot rename(%s, %s), df=%s, uid=%d", - tf, qf, e->e_df, geteuid()); + syserr("cannot rename(%s, %s), uid=%d", + tf, qf, geteuid()); /* close and unlock old (locked) qf */ if (e->e_lockfp != NULL) @@ -381,7 +381,7 @@ queueup(e, queueall, announce) # ifdef LOG /* save log info */ if (LogLevel > 79) - syslog(LOG_DEBUG, "%s: queueup, qf=%s, df=%s\n", e->e_id, qf, e->e_df); + syslog(LOG_DEBUG, "%s: queueup, qf=%s", e->e_id, qf); # endif /* LOG */ if (tTd(40, 1)) @@ -1258,10 +1258,10 @@ readqf(e) OpMode = MD_DELIVER; ctladdr = NULL; e->e_dfino = -1; + e->e_msgsize = -1; while ((bp = fgetfolded(buf, sizeof buf, qfp)) != NULL) { register char *p; - struct stat st; u_long qflags; ADDRESS *q; @@ -1311,19 +1311,7 @@ readqf(e) break; case 'D': /* data file name */ - e->e_df = newstr(&bp[1]); - e->e_dfp = fopen(e->e_df, "r"); - if (e->e_dfp == NULL) - { - syserr("readqf: cannot open %s", e->e_df); - e->e_msgsize = -1; - } - else if (fstat(fileno(e->e_dfp), &st) >= 0) - { - e->e_msgsize = st.st_size; - e->e_dfdev = st.st_dev; - e->e_dfino = st.st_ino; - } + /* obsolete -- ignore */ break; case 'T': /* init time */ @@ -1400,6 +1388,26 @@ readqf(e) errno = 0; e->e_flags |= EF_CLRQUEUE | EF_FATALERRS | EF_RESPONSE; } + else + { + /* + ** Arrange to read the data file. + */ + + p = queuename(e, 'd'); + e->e_dfp = fopen(p, "r"); + if (e->e_dfp == NULL) + { + syserr("readqf: cannot open %s", p); + } + else if (fstat(fileno(e->e_dfp), &st) >= 0) + { + e->e_msgsize = st.st_size; + e->e_dfdev = st.st_dev; + e->e_dfino = st.st_ino; + } + } + return TRUE; } /* diff --git a/usr/src/usr.sbin/sendmail/src/savemail.c b/usr/src/usr.sbin/sendmail/src/savemail.c index 0c9b2c440f..29acfa93a6 100644 --- a/usr/src/usr.sbin/sendmail/src/savemail.c +++ b/usr/src/usr.sbin/sendmail/src/savemail.c @@ -7,7 +7,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)savemail.c 8.57 (Berkeley) %G%"; +static char sccsid[] = "@(#)savemail.c 8.58 (Berkeley) %G%"; #endif /* not lint */ # include "sendmail.h" @@ -891,7 +891,7 @@ errbody(mci, e, separator) */ putline("", mci); - if (e->e_parent->e_df != NULL) + if (bitset(EF_HAS_DF, e->e_parent->e_flags)) { sendbody = !bitset(EF_NO_BODY_RETN, e->e_parent->e_flags); diff --git a/usr/src/usr.sbin/sendmail/src/sendmail.h b/usr/src/usr.sbin/sendmail/src/sendmail.h index e0e2e396fa..c1669cbffc 100644 --- a/usr/src/usr.sbin/sendmail/src/sendmail.h +++ b/usr/src/usr.sbin/sendmail/src/sendmail.h @@ -5,7 +5,7 @@ * * %sccs.include.redist.c% * - * @(#)sendmail.h 8.104 (Berkeley) %G% + * @(#)sendmail.h 8.105 (Berkeley) %G% */ /* @@ -15,7 +15,7 @@ # ifdef _DEFINE # define EXTERN # ifndef lint -static char SmailSccsId[] = "@(#)sendmail.h 8.104 %G%"; +static char SmailSccsId[] = "@(#)sendmail.h 8.105 %G%"; # endif # else /* _DEFINE */ # define EXTERN extern @@ -372,7 +372,6 @@ ENVELOPE struct envelope *e_parent; /* the message this one encloses */ struct envelope *e_sibling; /* the next envelope of interest */ char *e_bodytype; /* type of message body */ - char *e_df; /* location of temp file */ FILE *e_dfp; /* temporary file */ char *e_id; /* code for this entry in queue */ FILE *e_xfp; /* transcript file */ @@ -412,6 +411,7 @@ ENVELOPE #define EF_NL_NOT_EOL 0x0040000 /* don't accept raw NL as EOLine */ #define EF_CRLF_NOT_EOL 0x0080000 /* don't accept CR-LF as EOLine */ #define EF_RET_PARAM 0x0100000 /* RCPT command had RET argument */ +#define EF_HAS_DF 0x0200000 /* set when df file is instantiated */ EXTERN ENVELOPE *CurEnv; /* envelope currently being processed */ /* -- 2.20.1