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