X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/865dca9a0fe924292e8331e48d5b8a042891c463..b1064dda7981b58cdaefcb631e8e4dfaa010fae8:/usr/src/usr.bin/mail/quit.c diff --git a/usr/src/usr.bin/mail/quit.c b/usr/src/usr.bin/mail/quit.c index 4dc515c551..10bd7176d5 100644 --- a/usr/src/usr.bin/mail/quit.c +++ b/usr/src/usr.bin/mail/quit.c @@ -9,7 +9,7 @@ * Termination processing. */ -static char *SccsId = "@(#)quit.c 1.1 %G%"; +static char *SccsId = "@(#)quit.c 2.5 %G%"; /* * Save all of the undetermined messages at the top of "mbox" @@ -19,13 +19,21 @@ static char *SccsId = "@(#)quit.c 1.1 %G%"; quit() { - int mcount, p, modify; - FILE *ibuf, *obuf, *fbuf, *rbuf; + int mcount, p, modify, autohold, anystat, holdbit, nohold; + FILE *ibuf, *obuf, *fbuf, *rbuf, *readstat; register struct message *mp; register int c; extern char tempQuit[], tempResid[]; struct stat minfo; + char *id; + /* + * If we are read only, we can't do anything, + * so just return quickly. + */ + + if (readonly) + return; /* * See if there any messages to save in mbox. If no, we * can save copying mbox to /tmp and back. @@ -73,22 +81,50 @@ quit() goto newmail; remove(tempResid); } + + /* + * Adjust the message flags in each message. + */ + + anystat = 0; + autohold = value("hold") != NOSTR; + holdbit = autohold ? MPRESERVE : MBOX; + nohold = MBOX|MSAVED|MDELETED|MPRESERVE; + if (value("keepsave") != NOSTR) + nohold &= ~MSAVED; for (mp = &message[0]; mp < &message[msgCount]; mp++) { - if (mp->m_flag & MDELETED) - mp->m_flag = MDELETED|MTOUCH; + if (mp->m_flag & MNEW) { + mp->m_flag &= ~MNEW; + mp->m_flag |= MSTATUS; + } + if (mp->m_flag & MSTATUS) + anystat++; if ((mp->m_flag & MTOUCH) == 0) - mp->m_flag |= MDELETED; + mp->m_flag |= MPRESERVE; + if ((mp->m_flag & nohold) == 0) + mp->m_flag |= holdbit; } modify = 0; + if (Tflag != NOSTR) { + if ((readstat = fopen(Tflag, "w")) == NULL) + Tflag = NOSTR; + } for (c = 0, p = 0, mp = &message[0]; mp < &message[msgCount]; mp++) { - if ((mp->m_flag & (MSAVED|MDELETED|MPRESERVE)) == 0) + if (mp->m_flag & MBOX) c++; - if ((mp->m_flag & MPRESERVE) || (mp->m_flag & MTOUCH) == 0) + if (mp->m_flag & MPRESERVE) p++; if (mp->m_flag & MODIFY) modify++; + if (Tflag != NOSTR && (mp->m_flag & (MREAD|MDELETED)) != 0) { + id = hfield("article-id", mp); + if (id != NOSTR) + fprintf(readstat, "%s\n", id); + } } - if (p == msgCount && !modify) { + if (Tflag != NOSTR) + fclose(readstat); + if (p == msgCount && !modify && !anystat) { if (p == 1) printf("Held 1 message in %s\n", mailname); else @@ -141,7 +177,7 @@ quit() } fclose(obuf); close(creat(mbox, 0600)); - if ((obuf = fopen(mbox, "w")) == NULL) { + if ((obuf = fopen(mbox, "r+")) == NULL) { perror(mbox); fclose(ibuf); unlock(); @@ -155,8 +191,8 @@ quit() return; } for (mp = &message[0]; mp < &message[msgCount]; mp++) - if ((mp->m_flag & (MDELETED|MSAVED|MPRESERVE)) == 0) - if (send(mp, obuf) < 0) { + if (mp->m_flag & MBOX) + if (send(mp, obuf, 0) < 0) { perror(mbox); fclose(ibuf); fclose(obuf); @@ -212,7 +248,7 @@ quit() cream: if (rbuf != NULL) { - fbuf = fopen(mailname, "w"); + fbuf = fopen(mailname, "r+"); if (fbuf == NULL) goto newmail; while ((c = getc(rbuf)) != EOF) @@ -238,7 +274,6 @@ newmail: * saved. On any error, just return -1. Else return 0. * Incorporate the any new mail that we found. */ - writeback(res) register FILE *res; { @@ -247,7 +282,7 @@ writeback(res) FILE *obuf; p = 0; - if ((obuf = fopen(mailname, "w")) == NULL) { + if ((obuf = fopen(mailname, "r+")) == NULL) { perror(mailname); return(-1); } @@ -259,7 +294,7 @@ writeback(res) for (mp = &message[0]; mp < &message[msgCount]; mp++) if ((mp->m_flag&MPRESERVE)||(mp->m_flag&MTOUCH)==0) { p++; - if (send(mp, obuf) < 0) { + if (send(mp, obuf, 0) < 0) { perror(mailname); fclose(obuf); return(-1);