|
|
1.1 root 1: #ident "@(#)main.c 1.6 'attmail mail(1) command'"
2: #ident "@(#)mailx:main.c 1.13.3.1"
3: /* Copyright (c) 1984 AT&T */
4: /* All Rights Reserved */
5:
6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
7: /* The copyright notice above does not evidence any */
8: /* actual or intended publication of such source code. */
9:
10: #ident "@(#)mailx:main.c 1.13.1.2"
11:
12: #include "rcv.h"
13: #ifndef preSVr4
14: #include <locale.h>
15: #endif
16:
17: /*
18: * mailx -- a modified version of a University of California at Berkeley
19: * mail program
20: *
21: * Startup -- interface with user.
22: */
23:
24: static void hdrstop();
25:
26: static 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: * mailx [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ]
35: * or:
36: * mailx [ -i ] [ -r address ] [ -h number ] people ...
37: *
38: * and a bunch of other options.
39: */
40:
41: main(argc, argv)
42: char **argv;
43: {
44: register char *ef;
45: register int argp;
46: int mustsend, uflag, f, goerr = 0;
47: void (*prevint)();
48: /* struct termio tbuf; adb */
49: int c;
50: char *cwd, *mf;
51:
52: /*
53: * Set up a reasonable environment.
54: * Figure out whether we are being run interactively, set up
55: * all the temporary files, buffer standard output, and so forth.
56: */
57:
58: #ifndef preSVr4
59: /* (void)setlocale(LC_ALL, ""); */
60: #endif
61: #ifdef SIGCONT
62: # ifdef preSVr4
63: sigset(SIGCONT, SIG_DFL);
64: # else
65: {
66: struct sigaction nsig;
67: nsig.sa_handler = SIG_DFL;
68: sigemptyset(&nsig.sa_mask);
69: nsig.sa_flags = SA_RESTART;
70: (void) sigaction(SIGCONT, &nsig, (struct sigaction*)0);
71: }
72: # endif
73: #endif
74: progname = argv[0];
75: uflag = 0;
76: myegid = getegid();
77: myrgid = getgid();
78: myeuid = geteuid();
79: myruid = getuid();
80: mypid = getpid();
81: setgid(myrgid);
82: setuid(myruid);
83: inithost();
84: intty = isatty(0);
85: baud = getbaud(); /* adb */
86: image = -1;
87:
88: /*
89: * Now, determine how we are being used.
90: * We successively pick off instances of -r, -h, -f, and -i.
91: * If called as "rmail" we note this fact for letter sending.
92: * If there is anything left, it is the base of the list
93: * of users to mail to. Argp will be set to point to the
94: * first of these users.
95: */
96:
97: ef = NOSTR;
98: argp = -1;
99: mustsend = 0;
100: if (argc > 0 && **argv == 'r')
101: rmail++;
102: while ((c = getopt(argc, argv, "efFh:HinNr:s:u:UdIT:V")) != EOF)
103: switch (c) {
104: case 'e':
105: /*
106: * exit status only
107: */
108: exitflg++;
109: break;
110:
111: case 'r':
112: /*
113: * Next argument is address to be sent along
114: * to the mailer.
115: */
116: mustsend++;
117: rflag = optarg;
118: break;
119:
120: case 'T':
121: /*
122: * Next argument is temp file to write which
123: * articles have been read/deleted for netnews.
124: */
125: Tflag = optarg;
126: if ((f = creat(Tflag, TEMPPERM)) < 0) {
127: perror(Tflag);
128: exit(1);
129: }
130: close(f);
131: /* fall through for -I too */
132: /* FALLTHROUGH */
133:
134: case 'I':
135: /*
136: * print newsgroup in header summary
137: */
138: newsflg++;
139: break;
140:
141: case 'u':
142: /*
143: * Next argument is person to pretend to be.
144: */
145: uflag++;
146: strncpy(myname, optarg, PATHSIZE);
147: break;
148:
149: case 'i':
150: /*
151: * User wants to ignore interrupts.
152: * Set the variable "ignore"
153: */
154: assign("ignore", "");
155: break;
156:
157: case 'U':
158: UnUUCP++;
159: break;
160:
161: case 'd':
162: assign("debug", "");
163: break;
164:
165: case 'h':
166: /*
167: * Specified sequence number for network.
168: * This is the number of "hops" made so
169: * far (count of times message has been
170: * forwarded) to help avoid infinite mail loops.
171: */
172: mustsend++;
173: hflag = atoi(optarg);
174: if (hflag == 0) {
175: fprintf(stderr, "-h needs non-zero number\n");
176: goerr++;
177: }
178: break;
179:
180: case 's':
181: /*
182: * Give a subject field for sending from
183: * non terminal
184: */
185: mustsend++;
186: sflag = optarg;
187: break;
188:
189: case 'f':
190: /*
191: * User is specifying file to "edit" with mailx,
192: * as opposed to reading system mailbox.
193: * If no argument is given after -f, we read his/her
194: * $MBOX file or mbox in his/her home directory.
195: */
196: ef = (argc == optind || *argv[optind] == '-')
197: ? "" : argv[optind++];
198: if (*ef && *ef != '/' && *ef != '+')
199: cwd = getcwd(NOSTR, PATHSIZE);
200: break;
201:
202: case 'F':
203: Fflag++;
204: mustsend++;
205: break;
206:
207: case 'n':
208: /*
209: * User doesn't want to source
210: * /etc/mail/mailx.rc
211: */
212: nosrc++;
213: break;
214:
215: case 'N':
216: /*
217: * Avoid initial header printing.
218: */
219: noheader++;
220: break;
221:
222: case 'H':
223: /*
224: * Print headers and exit
225: */
226: Hflag++;
227: break;
228:
229: case 'V':
230: puts(version);
231: return 0;
232:
233: case '?':
234: default:
235: goerr++;
236: break;
237: }
238:
239: if ( optind != argc )
240: argp = optind;
241:
242: /*
243: * Check for inconsistent arguments.
244: */
245:
246: if (newsflg && ef==NOSTR) {
247: fprintf(stderr, "Need -f with -I flag\n");
248: goerr++;
249: }
250: if (ef != NOSTR && argp != -1) {
251: fprintf(stderr, "Cannot give -f and people to send to.\n");
252: goerr++;
253: }
254: if (exitflg && (mustsend || argp != -1))
255: exit(1); /* nonsense flags involving -e simply exit */
256: if (mustsend && argp == -1) {
257: fprintf(stderr, "The flags you gave are used only when sending mail.\n");
258: goerr++;
259: }
260: if (goerr) {
261: fprintf(stderr,"Usage: %s -eiIUdFnNHV -T FILE -u USER -h hops -r address -s SUBJECT -f FILE users\n", progname);
262: exit(1);
263: }
264: tinit();
265: input = stdin;
266: rcvmode = argp == -1;
267: if (!nosrc)
268: load(MASTER);
269: load(Getf("MAILRC"));
270: check_environment();
271:
272: if (argp != -1) {
273: mail(&argv[argp]);
274: exit(senderr);
275: }
276:
277: /*
278: * Ok, we are reading mail.
279: * Decide whether we are editing a mailbox or reading
280: * the system mailbox, and open up the right stuff.
281: */
282:
283: strcpy(origname, mailname);
284:
285: if (ef != NOSTR) {
286: edit++;
287: ef = *ef ? expand(ef) : Getf("MBOX");
288: strcpy(origname, ef);
289: if (ef[0] != '/') {
290: if (cwd == NOSTR)
291: cwd = getcwd(NOSTR, PATHSIZE);
292: strcat(cwd, "/");
293: strcat(cwd, ef);
294: ef = cwd;
295: }
296: strcpy(mailname, ef);
297: editfile = ef;
298: }
299:
300: if (setfile(mailname, edit) < 0)
301: exit(1);
302:
303: if (msgCount > 0 && !noheader && value("header") != NOSTR) {
304: if (setjmp(hdrjmp) == 0) {
305: if ((prevint = sigset(SIGINT, SIG_IGN)) != (void (*)())SIG_IGN) /* adb */
306: sigset(SIGINT, hdrstop);
307: announce();
308: fflush(stdout);
309: sigset(SIGINT, prevint);
310: }
311: }
312: if (Hflag || (!edit && msgCount == 0)) {
313: if (!Hflag)
314: fprintf(stderr, "No mail for %s\n", myname);
315: fflush(stdout);
316: exit(0);
317: }
318: commands();
319: if (!edit) {
320: sigset(SIGHUP, SIG_IGN);
321: sigset(SIGINT, SIG_IGN);
322: sigset(SIGQUIT, SIG_IGN);
323: quit();
324: Verhogen();
325: }
326: exit(0);
327: /* NOTREACHED */
328: }
329:
330: /*
331: * Interrupt printing of the headers.
332: */
333: static void
334: hdrstop()
335: {
336:
337: clrbuf(stdout);
338: printf("\nInterrupt\n");
339: fflush(stdout);
340: sigrelse(SIGINT);
341: longjmp(hdrjmp, 1);
342: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.