* 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"
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.
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
}
fclose(obuf);
close(creat(mbox, 0600));
- if ((obuf = fopen(mbox, "w")) == NULL) {
+ if ((obuf = fopen(mbox, "r+")) == NULL) {
perror(mbox);
fclose(ibuf);
unlock();
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);
cream:
if (rbuf != NULL) {
- fbuf = fopen(mailname, "w");
+ fbuf = fopen(mailname, "r+");
if (fbuf == NULL)
goto newmail;
while ((c = getc(rbuf)) != EOF)
* saved. On any error, just return -1. Else return 0.
* Incorporate the any new mail that we found.
*/
-
writeback(res)
register FILE *res;
{
FILE *obuf;
p = 0;
- if ((obuf = fopen(mailname, "w")) == NULL) {
+ if ((obuf = fopen(mailname, "r+")) == NULL) {
perror(mailname);
return(-1);
}
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);