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