calls to nonexistant fonts (from gbergman@cartan)
[unix-history] / usr / src / usr.bin / mail / main.c
CommitLineData
9552e6b8
DF
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
2fd8b883 8char *copyright =
9552e6b8
DF
9"@(#) Copyright (c) 1980 Regents of the University of California.\n\
10 All rights reserved.\n";
11#endif not lint
12
2ae9f53f 13#ifndef lint
a86e9bce 14static char *sccsid = "@(#)main.c 5.3 (Berkeley) %G%";
9552e6b8 15#endif not lint
83f7d6ec
KS
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
5807729c 26jmp_buf hdrjmp;
83f7d6ec
KS
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
39main(argc, argv)
40 char **argv;
41{
42 register char *ef;
43 register int i, argp;
e3d4be91 44 int mustsend, uflag, hdrstop(), (*prevint)(), f;
83f7d6ec 45 FILE *ibuf, *ftat;
6b3e20dc 46 struct sgttyb tbuf;
83f7d6ec
KS
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;
15609a06
KM
61#ifdef GETHOST
62 inithost();
63#endif GETHOST
83f7d6ec
KS
64 mypid = getpid();
65 intty = isatty(0);
66 outtty = isatty(1);
6b3e20dc
KS
67 if (outtty) {
68 gtty(1, &tbuf);
69 baud = tbuf.sg_ospeed;
70 }
71 else
72 baud = B9600;
83f7d6ec 73 image = -1;
83f7d6ec
KS
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
12a8dbc7
KS
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];
e3d4be91
KS
125 if ((f = creat(Tflag, 0600)) < 0) {
126 perror(Tflag);
127 exit(1);
128 }
129 close(f);
12a8dbc7
KS
130 i++;
131 break;
132
83f7d6ec
KS
133 case 'u':
134 /*
135 * Next argument is person to pretend to be.
136 */
137 uflag++;
138 if (i >= argc - 1) {
5807729c 139 fprintf(stderr, "Missing user name for -u\n");
83f7d6ec
KS
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
da8590df
KS
213 case 'N':
214 /*
215 * Avoid initial header printing.
216 */
217 noheader++;
218 break;
219
843ac7dd
CL
220 case 'v':
221 /*
222 * Send mailer verbose flag
223 */
224 assign("verbose", "");
225 break;
226
0f016ad0
S
227 case 'I':
228 /*
229 * We're interactive
230 */
231 intty = 1;
232 break;
233
83f7d6ec
KS
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
83f7d6ec
KS
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();
5807729c
KS
253 input = stdin;
254 rcvmode = argp == -1;
255 if (!nosrc)
256 load(MASTER);
257 load(mailrc);
83f7d6ec 258 if (argp != -1) {
83f7d6ec
KS
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
83f7d6ec 274 if (ef != NOSTR) {
5807729c
KS
275 char *ename;
276
83f7d6ec 277 edit++;
5807729c
KS
278 ename = expand(ef);
279 if (ename != ef) {
280 ef = (char *) calloc(1, strlen(ename) + 1);
281 strcpy(ef, ename);
282 }
927ecb14
KS
283 editfile = ef;
284 strcpy(mailname, ef);
83f7d6ec 285 }
b57443b2
KS
286 if (setfile(mailname, edit) < 0) {
287 if (edit)
288 perror(mailname);
289 else
290 fprintf(stderr, "No mail for %s\n", myname);
83f7d6ec 291 exit(1);
b57443b2 292 }
a86e9bce 293 if (!noheader && value("noheader") == NOSTR) {
5807729c
KS
294 if (setjmp(hdrjmp) == 0) {
295 if ((prevint = sigset(SIGINT, SIG_IGN)) != SIG_IGN)
296 sigset(SIGINT, hdrstop);
843ac7dd 297 announce(!0);
5807729c
KS
298 fflush(stdout);
299 sigset(SIGINT, prevint);
300 }
301 }
ab9ca2ea
KS
302 if (!edit && msgCount == 0) {
303 printf("No mail\n");
304 fflush(stdout);
305 exit(0);
306 }
83f7d6ec 307 commands();
714288d2
KS
308 if (!edit) {
309 sigset(SIGHUP, SIG_IGN);
310 sigset(SIGINT, SIG_IGN);
311 sigset(SIGQUIT, SIG_IGN);
83f7d6ec 312 quit();
714288d2 313 }
83f7d6ec
KS
314 exit(0);
315}
5807729c
KS
316
317/*
318 * Interrupt printing of the headers.
319 */
320hdrstop()
321{
322
5807729c 323 fflush(stdout);
80187484 324 fprintf(stderr, "\nInterrupt\n");
5807729c
KS
325 longjmp(hdrjmp, 1);
326}