Annotation of 43BSD/ucb/Mail/quit.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char *sccsid = "@(#)quit.c      5.3 (Berkeley) 3/6/86";
                      9: #endif not lint
                     10: 
                     11: #include "rcv.h"
                     12: #include <sys/stat.h>
                     13: #include <sys/file.h>
                     14: 
                     15: /*
                     16:  * Rcv -- receive mail rationally.
                     17:  *
                     18:  * Termination processing.
                     19:  */
                     20: 
                     21: /*
                     22:  * Save all of the undetermined messages at the top of "mbox"
                     23:  * Save all untouched messages back in the system mailbox.
                     24:  * Remove the system mailbox, if none saved there.
                     25:  */
                     26: 
                     27: quit()
                     28: {
                     29:        int mcount, p, modify, autohold, anystat, holdbit, nohold;
                     30:        FILE *ibuf, *obuf, *fbuf, *rbuf, *readstat, *abuf;
                     31:        register struct message *mp;
                     32:        register int c;
                     33:        extern char tempQuit[], tempResid[];
                     34:        struct stat minfo;
                     35:        char *id;
                     36: 
                     37:        /*
                     38:         * If we are read only, we can't do anything,
                     39:         * so just return quickly.
                     40:         */
                     41: 
                     42:        if (readonly)
                     43:                return;
                     44:        /*
                     45:         * See if there any messages to save in mbox.  If no, we
                     46:         * can save copying mbox to /tmp and back.
                     47:         *
                     48:         * Check also to see if any files need to be preserved.
                     49:         * Delete all untouched messages to keep them out of mbox.
                     50:         * If all the messages are to be preserved, just exit with
                     51:         * a message.
                     52:         *
                     53:         * If the luser has sent mail to himself, refuse to do
                     54:         * anything with the mailbox, unless mail locking works.
                     55:         */
                     56: 
                     57:        fbuf = fopen(mailname, "r");
                     58:        if (fbuf == NULL)
                     59:                goto newmail;
                     60:        flock(fileno(fbuf), LOCK_EX);
                     61: #ifndef CANLOCK
                     62:        if (selfsent) {
                     63:                printf("You have new mail.\n");
                     64:                fclose(fbuf);
                     65:                return;
                     66:        }
                     67: #endif
                     68:        rbuf = NULL;
                     69:        if (fstat(fileno(fbuf), &minfo) >= 0 && minfo.st_size > mailsize) {
                     70:                printf("New mail has arrived.\n");
                     71:                rbuf = fopen(tempResid, "w");
                     72:                if (rbuf == NULL || fbuf == NULL)
                     73:                        goto newmail;
                     74: #ifdef APPEND
                     75:                fseek(fbuf, mailsize, 0);
                     76:                while ((c = getc(fbuf)) != EOF)
                     77:                        putc(c, rbuf);
                     78: #else
                     79:                p = minfo.st_size - mailsize;
                     80:                while (p-- > 0) {
                     81:                        c = getc(fbuf);
                     82:                        if (c == EOF)
                     83:                                goto newmail;
                     84:                        putc(c, rbuf);
                     85:                }
                     86: #endif
                     87:                fclose(rbuf);
                     88:                if ((rbuf = fopen(tempResid, "r")) == NULL)
                     89:                        goto newmail;
                     90:                remove(tempResid);
                     91:        }
                     92: 
                     93:        /*
                     94:         * Adjust the message flags in each message.
                     95:         */
                     96: 
                     97:        anystat = 0;
                     98:        autohold = value("hold") != NOSTR;
                     99:        holdbit = autohold ? MPRESERVE : MBOX;
                    100:        nohold = MBOX|MSAVED|MDELETED|MPRESERVE;
                    101:        if (value("keepsave") != NOSTR)
                    102:                nohold &= ~MSAVED;
                    103:        for (mp = &message[0]; mp < &message[msgCount]; mp++) {
                    104:                if (mp->m_flag & MNEW) {
                    105:                        mp->m_flag &= ~MNEW;
                    106:                        mp->m_flag |= MSTATUS;
                    107:                }
                    108:                if (mp->m_flag & MSTATUS)
                    109:                        anystat++;
                    110:                if ((mp->m_flag & MTOUCH) == 0)
                    111:                        mp->m_flag |= MPRESERVE;
                    112:                if ((mp->m_flag & nohold) == 0)
                    113:                        mp->m_flag |= holdbit;
                    114:        }
                    115:        modify = 0;
                    116:        if (Tflag != NOSTR) {
                    117:                if ((readstat = fopen(Tflag, "w")) == NULL)
                    118:                        Tflag = NOSTR;
                    119:        }
                    120:        for (c = 0, p = 0, mp = &message[0]; mp < &message[msgCount]; mp++) {
                    121:                if (mp->m_flag & MBOX)
                    122:                        c++;
                    123:                if (mp->m_flag & MPRESERVE)
                    124:                        p++;
                    125:                if (mp->m_flag & MODIFY)
                    126:                        modify++;
                    127:                if (Tflag != NOSTR && (mp->m_flag & (MREAD|MDELETED)) != 0) {
                    128:                        id = hfield("article-id", mp);
                    129:                        if (id != NOSTR)
                    130:                                fprintf(readstat, "%s\n", id);
                    131:                }
                    132:        }
                    133:        if (Tflag != NOSTR)
                    134:                fclose(readstat);
                    135:        if (p == msgCount && !modify && !anystat) {
                    136:                if (p == 1)
                    137:                        printf("Held 1 message in %s\n", mailname);
                    138:                else
                    139:                        printf("Held %2d messages in %s\n", p, mailname);
                    140:                fclose(fbuf);
                    141:                return;
                    142:        }
                    143:        if (c == 0) {
                    144:                if (p != 0) {
                    145:                        writeback(rbuf);
                    146:                        fclose(fbuf);
                    147:                        return;
                    148:                }
                    149:                goto cream;
                    150:        }
                    151: 
                    152:        /*
                    153:         * Create another temporary file and copy user's mbox file
                    154:         * darin.  If there is no mbox, copy nothing.
                    155:         * If he has specified "append" don't copy his mailbox,
                    156:         * just copy saveable entries at the end.
                    157:         */
                    158: 
                    159:        mcount = c;
                    160:        if (value("append") == NOSTR) {
                    161:                if ((obuf = fopen(tempQuit, "w")) == NULL) {
                    162:                        perror(tempQuit);
                    163:                        fclose(fbuf);
                    164:                        return;
                    165:                }
                    166:                if ((ibuf = fopen(tempQuit, "r")) == NULL) {
                    167:                        perror(tempQuit);
                    168:                        remove(tempQuit);
                    169:                        fclose(obuf);
                    170:                        fclose(fbuf);
                    171:                        return;
                    172:                }
                    173:                remove(tempQuit);
                    174:                if ((abuf = fopen(mbox, "r")) != NULL) {
                    175:                        while ((c = getc(abuf)) != EOF)
                    176:                                putc(c, obuf);
                    177:                        fclose(abuf);
                    178:                }
                    179:                if (ferror(obuf)) {
                    180:                        perror(tempQuit);
                    181:                        fclose(ibuf);
                    182:                        fclose(obuf);
                    183:                        fclose(fbuf);
                    184:                        return;
                    185:                }
                    186:                fclose(obuf);
                    187:                close(creat(mbox, 0600));
                    188:                if ((obuf = fopen(mbox, "r+")) == NULL) {
                    189:                        perror(mbox);
                    190:                        fclose(ibuf);
                    191:                        fclose(fbuf);
                    192:                        return;
                    193:                }
                    194:        }
                    195:        if (value("append") != NOSTR) {
                    196:                if ((obuf = fopen(mbox, "a")) == NULL) {
                    197:                        perror(mbox);
                    198:                        fclose(fbuf);
                    199:                        return;
                    200:                }
                    201:                fchmod(fileno(obuf), 0600);
                    202:        }
                    203:        for (mp = &message[0]; mp < &message[msgCount]; mp++)
                    204:                if (mp->m_flag & MBOX)
                    205:                        if (send(mp, obuf, 0) < 0) {
                    206:                                perror(mbox);
                    207:                                fclose(ibuf);
                    208:                                fclose(obuf);
                    209:                                fclose(fbuf);
                    210:                                return;
                    211:                        }
                    212: 
                    213:        /*
                    214:         * Copy the user's old mbox contents back
                    215:         * to the end of the stuff we just saved.
                    216:         * If we are appending, this is unnecessary.
                    217:         */
                    218: 
                    219:        if (value("append") == NOSTR) {
                    220:                rewind(ibuf);
                    221:                c = getc(ibuf);
                    222:                while (c != EOF) {
                    223:                        putc(c, obuf);
                    224:                        if (ferror(obuf))
                    225:                                break;
                    226:                        c = getc(ibuf);
                    227:                }
                    228:                fclose(ibuf);
                    229:                fflush(obuf);
                    230:        }
                    231:        trunc(obuf);
                    232:        if (ferror(obuf)) {
                    233:                perror(mbox);
                    234:                fclose(obuf);
                    235:                fclose(fbuf);
                    236:                return;
                    237:        }
                    238:        fclose(obuf);
                    239:        if (mcount == 1)
                    240:                printf("Saved 1 message in mbox\n");
                    241:        else
                    242:                printf("Saved %d messages in mbox\n", mcount);
                    243: 
                    244:        /*
                    245:         * Now we are ready to copy back preserved files to
                    246:         * the system mailbox, if any were requested.
                    247:         */
                    248: 
                    249:        if (p != 0) {
                    250:                writeback(rbuf);
                    251:                fclose(fbuf);
                    252:                return;
                    253:        }
                    254: 
                    255:        /*
                    256:         * Finally, remove his /usr/mail file.
                    257:         * If new mail has arrived, copy it back.
                    258:         */
                    259: 
                    260: cream:
                    261:        if (rbuf != NULL) {
                    262:                abuf = fopen(mailname, "r+");
                    263:                if (abuf == NULL)
                    264:                        goto newmail;
                    265:                while ((c = getc(rbuf)) != EOF)
                    266:                        putc(c, abuf);
                    267:                fclose(rbuf);
                    268:                trunc(abuf);
                    269:                fclose(abuf);
                    270:                alter(mailname);
                    271:                fclose(fbuf);
                    272:                return;
                    273:        }
                    274:        demail();
                    275:        fclose(fbuf);
                    276:        return;
                    277: 
                    278: newmail:
                    279:        printf("Thou hast new mail.\n");
                    280:        if (fbuf != NULL)
                    281:                fclose(fbuf);
                    282: }
                    283: 
                    284: /*
                    285:  * Preserve all the appropriate messages back in the system
                    286:  * mailbox, and print a nice message indicated how many were
                    287:  * saved.  On any error, just return -1.  Else return 0.
                    288:  * Incorporate the any new mail that we found.
                    289:  */
                    290: writeback(res)
                    291:        register FILE *res;
                    292: {
                    293:        register struct message *mp;
                    294:        register int p, c;
                    295:        FILE *obuf;
                    296: 
                    297:        p = 0;
                    298:        if ((obuf = fopen(mailname, "r+")) == NULL) {
                    299:                perror(mailname);
                    300:                return(-1);
                    301:        }
                    302: #ifndef APPEND
                    303:        if (res != NULL)
                    304:                while ((c = getc(res)) != EOF)
                    305:                        putc(c, obuf);
                    306: #endif
                    307:        for (mp = &message[0]; mp < &message[msgCount]; mp++)
                    308:                if ((mp->m_flag&MPRESERVE)||(mp->m_flag&MTOUCH)==0) {
                    309:                        p++;
                    310:                        if (send(mp, obuf, 0) < 0) {
                    311:                                perror(mailname);
                    312:                                fclose(obuf);
                    313:                                return(-1);
                    314:                        }
                    315:                }
                    316: #ifdef APPEND
                    317:        if (res != NULL)
                    318:                while ((c = getc(res)) != EOF)
                    319:                        putc(c, obuf);
                    320: #endif
                    321:        fflush(obuf);
                    322:        trunc(obuf);
                    323:        if (ferror(obuf)) {
                    324:                perror(mailname);
                    325:                fclose(obuf);
                    326:                return(-1);
                    327:        }
                    328:        if (res != NULL)
                    329:                fclose(res);
                    330:        fclose(obuf);
                    331:        alter(mailname);
                    332:        if (p == 1)
                    333:                printf("Held 1 message in %s\n", mailname);
                    334:        else
                    335:                printf("Held %d messages in %s\n", p, mailname);
                    336:        return(0);
                    337: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.