Annotation of 3BSD/cmd/ucbmail/quit.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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