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