|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.