|
|
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: char *copyright =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char *sccsid = "@(#)main.c 5.3 (Berkeley) 9/15/85";
15: #endif not lint
16:
17: #include "rcv.h"
18: #include <sys/stat.h>
19:
20: /*
21: * Mail -- a mail program
22: *
23: * Startup -- interface with user.
24: */
25:
26: jmp_buf hdrjmp;
27:
28: /*
29: * Find out who the user is, copy his mail file (if exists) into
30: * /tmp/Rxxxxx and set up the message pointers. Then, print out the
31: * message headers and read user commands.
32: *
33: * Command line syntax:
34: * Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ]
35: * or:
36: * Mail [ -i ] [ -r address ] [ -h number ] people ...
37: */
38:
39: main(argc, argv)
40: char **argv;
41: {
42: register char *ef;
43: register int i, argp;
44: int mustsend, uflag, hdrstop(), (*prevint)(), f;
45: FILE *ibuf, *ftat;
46: struct sgttyb tbuf;
47:
48: #ifdef signal
49: Siginit();
50: #endif
51:
52: /*
53: * Set up a reasonable environment. We clobber the last
54: * element of argument list for compatibility with version 6,
55: * figure out whether we are being run interactively, set up
56: * all the temporary files, buffer standard output, and so forth.
57: */
58:
59: uflag = 0;
60: argv[argc] = (char *) -1;
61: #ifdef GETHOST
62: inithost();
63: #endif GETHOST
64: mypid = getpid();
65: intty = isatty(0);
66: outtty = isatty(1);
67: if (outtty) {
68: gtty(1, &tbuf);
69: baud = tbuf.sg_ospeed;
70: }
71: else
72: baud = B9600;
73: image = -1;
74:
75: /*
76: * Now, determine how we are being used.
77: * We successively pick off instances of -r, -h, -f, and -i.
78: * If called as "rmail" we note this fact for letter sending.
79: * If there is anything left, it is the base of the list
80: * of users to mail to. Argp will be set to point to the
81: * first of these users.
82: */
83:
84: ef = NOSTR;
85: argp = -1;
86: mustsend = 0;
87: if (argc > 0 && **argv == 'r')
88: rmail++;
89: for (i = 1; i < argc; i++) {
90:
91: /*
92: * If current argument is not a flag, then the
93: * rest of the arguments must be recipients.
94: */
95:
96: if (*argv[i] != '-') {
97: argp = i;
98: break;
99: }
100: switch (argv[i][1]) {
101: case 'r':
102: /*
103: * Next argument is address to be sent along
104: * to the mailer.
105: */
106: if (i >= argc - 1) {
107: fprintf(stderr, "Address required after -r\n");
108: exit(1);
109: }
110: mustsend++;
111: rflag = argv[i+1];
112: i++;
113: break;
114:
115: case 'T':
116: /*
117: * Next argument is temp file to write which
118: * articles have been read/deleted for netnews.
119: */
120: if (i >= argc - 1) {
121: fprintf(stderr, "Name required after -T\n");
122: exit(1);
123: }
124: Tflag = argv[i+1];
125: if ((f = creat(Tflag, 0600)) < 0) {
126: perror(Tflag);
127: exit(1);
128: }
129: close(f);
130: i++;
131: break;
132:
133: case 'u':
134: /*
135: * Next argument is person to pretend to be.
136: */
137: uflag++;
138: if (i >= argc - 1) {
139: fprintf(stderr, "Missing user name for -u\n");
140: exit(1);
141: }
142: strcpy(myname, argv[i+1]);
143: i++;
144: break;
145:
146: case 'i':
147: /*
148: * User wants to ignore interrupts.
149: * Set the variable "ignore"
150: */
151: assign("ignore", "");
152: break;
153:
154: case 'd':
155: debug++;
156: break;
157:
158: case 'h':
159: /*
160: * Specified sequence number for network.
161: * This is the number of "hops" made so
162: * far (count of times message has been
163: * forwarded) to help avoid infinite mail loops.
164: */
165: if (i >= argc - 1) {
166: fprintf(stderr, "Number required for -h\n");
167: exit(1);
168: }
169: mustsend++;
170: hflag = atoi(argv[i+1]);
171: if (hflag == 0) {
172: fprintf(stderr, "-h needs non-zero number\n");
173: exit(1);
174: }
175: i++;
176: break;
177:
178: case 's':
179: /*
180: * Give a subject field for sending from
181: * non terminal
182: */
183: if (i >= argc - 1) {
184: fprintf(stderr, "Subject req'd for -s\n");
185: exit(1);
186: }
187: mustsend++;
188: sflag = argv[i+1];
189: i++;
190: break;
191:
192: case 'f':
193: /*
194: * User is specifying file to "edit" with Mail,
195: * as opposed to reading system mailbox.
196: * If no argument is given after -f, we read his
197: * mbox file in his home directory.
198: */
199: if (i >= argc - 1)
200: ef = mbox;
201: else
202: ef = argv[i + 1];
203: i++;
204: break;
205:
206: case 'n':
207: /*
208: * User doesn't want to source /usr/lib/Mail.rc
209: */
210: nosrc++;
211: break;
212:
213: case 'N':
214: /*
215: * Avoid initial header printing.
216: */
217: noheader++;
218: break;
219:
220: case 'v':
221: /*
222: * Send mailer verbose flag
223: */
224: assign("verbose", "");
225: break;
226:
227: case 'I':
228: /*
229: * We're interactive
230: */
231: intty = 1;
232: break;
233:
234: default:
235: fprintf(stderr, "Unknown flag: %s\n", argv[i]);
236: exit(1);
237: }
238: }
239:
240: /*
241: * Check for inconsistent arguments.
242: */
243:
244: if (ef != NOSTR && argp != -1) {
245: fprintf(stderr, "Cannot give -f and people to send to.\n");
246: exit(1);
247: }
248: if (mustsend && argp == -1) {
249: fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n");
250: exit(1);
251: }
252: tinit();
253: input = stdin;
254: rcvmode = argp == -1;
255: if (!nosrc)
256: load(MASTER);
257: load(mailrc);
258: if (argp != -1) {
259: mail(&argv[argp]);
260:
261: /*
262: * why wait?
263: */
264:
265: exit(senderr);
266: }
267:
268: /*
269: * Ok, we are reading mail.
270: * Decide whether we are editing a mailbox or reading
271: * the system mailbox, and open up the right stuff.
272: */
273:
274: if (ef != NOSTR) {
275: char *ename;
276:
277: edit++;
278: ename = expand(ef);
279: if (ename != ef) {
280: ef = (char *) calloc(1, strlen(ename) + 1);
281: strcpy(ef, ename);
282: }
283: editfile = ef;
284: strcpy(mailname, ef);
285: }
286: if (setfile(mailname, edit) < 0) {
287: if (edit)
288: perror(mailname);
289: else
290: fprintf(stderr, "No mail for %s\n", myname);
291: exit(1);
292: }
293: if (!noheader && value("noheader") == NOSTR) {
294: if (setjmp(hdrjmp) == 0) {
295: if ((prevint = sigset(SIGINT, SIG_IGN)) != SIG_IGN)
296: sigset(SIGINT, hdrstop);
297: announce(!0);
298: fflush(stdout);
299: sigset(SIGINT, prevint);
300: }
301: }
302: if (!edit && msgCount == 0) {
303: printf("No mail\n");
304: fflush(stdout);
305: exit(0);
306: }
307: commands();
308: if (!edit) {
309: sigset(SIGHUP, SIG_IGN);
310: sigset(SIGINT, SIG_IGN);
311: sigset(SIGQUIT, SIG_IGN);
312: quit();
313: }
314: exit(0);
315: }
316:
317: /*
318: * Interrupt printing of the headers.
319: */
320: hdrstop()
321: {
322:
323: fflush(stdout);
324: fprintf(stderr, "\nInterrupt\n");
325: longjmp(hdrjmp, 1);
326: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.