|
|
1.1 root 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:
12: /*
13: * Find out who the user is, copy his mail file (if exists) into
14: * /tmp/Rxxxxx and set up the message pointers. Then, print out the
15: * message headers and read user commands.
16: *
17: * Command line syntax:
18: * Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ]
19: * or:
20: * Mail [ -i ] [ -r address ] [ -h number ] people ...
21: */
22:
23: main(argc, argv)
24: char **argv;
25: {
26: register char *ef;
27: register int i, argp;
28: int mustsend, uflag;
29: FILE *ibuf;
30: extern char tempMesg[], _sobuf[];
31:
32: #ifdef signal
33: Siginit();
34: #endif
35:
36: /*
37: * Set up a reasonable environment. We clobber the last
38: * element of argument list for compatibility with version 6,
39: * figure out whether we are being run interactively, set up
40: * all the temporary files, buffer standard output, and so forth.
41: */
42:
43: uflag = 0;
44: argv[argc] = (char *) -1;
45: mypid = getpid();
46: intty = isatty(0);
47: outtty = isatty(1);
48: image = -1;
49: setbuf(stdout, _sobuf);
50:
51: /*
52: * Now, determine how we are being used.
53: * We successively pick off instances of -r, -h, -f, and -i.
54: * If there is anything left, it is the base of the list
55: * of users to mail to. Argp will be set to point to the
56: * first of these users.
57: */
58:
59: ef = NOSTR;
60: argp = -1;
61: mustsend = 0;
62: for (i = 1; i < argc; i++) {
63:
64: /*
65: * If current argument is not a flag, then the
66: * rest of the arguments must be recipients.
67: */
68:
69: if (*argv[i] != '-') {
70: argp = i;
71: break;
72: }
73: switch (argv[i][1]) {
74: case 'r':
75: /*
76: * Next argument is address to be sent along
77: * to the mailer.
78: */
79: if (i >= argc - 1) {
80: fprintf(stderr, "Address required after -r\n");
81: exit(1);
82: }
83: mustsend++;
84: rflag = argv[i+1];
85: i++;
86: break;
87:
88: case 'u':
89: /*
90: * Next argument is person to pretend to be.
91: */
92: uflag++;
93: if (i >= argc - 1) {
94: fprintf(stderr, "You obviously dont know what you're doing\n");
95: exit(1);
96: }
97: strcpy(myname, argv[i+1]);
98: i++;
99: break;
100:
101: case 'i':
102: /*
103: * User wants to ignore interrupts.
104: * Set the variable "ignore"
105: */
106: assign("ignore", "");
107: break;
108:
109: case 'd':
110: debug++;
111: break;
112:
113: case 'h':
114: /*
115: * Specified sequence number for network.
116: * This is the number of "hops" made so
117: * far (count of times message has been
118: * forwarded) to help avoid infinite mail loops.
119: */
120: if (i >= argc - 1) {
121: fprintf(stderr, "Number required for -h\n");
122: exit(1);
123: }
124: mustsend++;
125: hflag = atoi(argv[i+1]);
126: if (hflag == 0) {
127: fprintf(stderr, "-h needs non-zero number\n");
128: exit(1);
129: }
130: i++;
131: break;
132:
133: case 'f':
134: /*
135: * User is specifying file to "edit" with Mail,
136: * as opposed to reading system mailbox.
137: * If no argument is given after -f, we read his
138: * mbox file in his home directory.
139: */
140: if (i >= argc - 1)
141: ef = mbox;
142: else
143: ef = argv[i + 1];
144: i++;
145: break;
146:
147: default:
148: fprintf(stderr, "Unknown flag: %s\n", argv[i]);
149: exit(1);
150: }
151: }
152:
153: /*
154: * Check for inconsistent arguments.
155: */
156:
157: if (ef != NOSTR && argp != -1) {
158: fprintf(stderr, "Cannot give -f and people to send to.\n");
159: exit(1);
160: }
161: if (mustsend && argp == -1) {
162: fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n");
163: exit(1);
164: }
165: tinit();
166: if (argp != -1) {
167: commands();
168: mail(&argv[argp]);
169:
170: /*
171: * why wait?
172: */
173:
174: exit(0);
175: }
176:
177: /*
178: * Ok, we are reading mail.
179: * Decide whether we are editing a mailbox or reading
180: * the system mailbox, and open up the right stuff.
181: */
182:
183: rcvmode++;
184: if (ef != NOSTR) {
185: edit++;
186: editfile = mailname = ef;
187: if ((ibuf = fopen(mailname, "r")) == NULL) {
188: perror(mailname);
189: exit(1);
190: }
191: if ((i = open(mailname, 1)) < 0)
192: printf("Warning: \"%s\" not writable.\n", mailname);
193: else
194: close(i);
195: }
196: else {
197: if ((ibuf = fopen(mailname, "r")) == NULL) {
198: if (uflag)
199: printf("No mail for %s\n", myname);
200: else
201: printf("No mail.\n");
202: exit(0);
203: }
204: }
205:
206: /*
207: * Copy the messages into /tmp
208: * and set pointers.
209: */
210:
211: mailsize = fsize(ibuf);
212: if ((otf = fopen(tempMesg, "w")) == NULL) {
213: perror(tempMesg);
214: exit(1);
215: }
216: if ((itf = fopen(tempMesg, "r")) == NULL) {
217: perror(tempMesg);
218: exit(1);
219: }
220: remove(tempMesg);
221: setptr(ibuf);
222: fclose(ibuf);
223:
224: /*
225: * print headings and accept user commands.
226: */
227:
228: if (msgCount == 0) {
229: if (uflag)
230: printf("No mail for %s\n", myname);
231: else
232: printf("No messages.\n");
233: exit(1);
234: }
235: commands();
236: if (!edit)
237: quit();
238: exit(0);
239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.