changed to call setfile/lex.c to set up initial input file.
[unix-history] / usr / src / usr.bin / mail / main.c
#
#include "rcv.h"
#include <sys/stat.h>
/*
* Mail -- a mail program
*
* Startup -- interface with user.
*/
static char *SccsId = "@(#)main.c 1.2 %G%";
/*
* Find out who the user is, copy his mail file (if exists) into
* /tmp/Rxxxxx and set up the message pointers. Then, print out the
* message headers and read user commands.
*
* Command line syntax:
* Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ]
* or:
* Mail [ -i ] [ -r address ] [ -h number ] people ...
*/
main(argc, argv)
char **argv;
{
register char *ef;
register int i, argp;
int mustsend, uflag;
FILE *ibuf, *ftat;
extern char _sobuf[];
#ifdef signal
Siginit();
#endif
/*
* Set up a reasonable environment. We clobber the last
* element of argument list for compatibility with version 6,
* figure out whether we are being run interactively, set up
* all the temporary files, buffer standard output, and so forth.
*/
uflag = 0;
argv[argc] = (char *) -1;
mypid = getpid();
intty = isatty(0);
outtty = isatty(1);
image = -1;
setbuf(stdout, _sobuf);
/*
* Now, determine how we are being used.
* We successively pick off instances of -r, -h, -f, and -i.
* If called as "rmail" we note this fact for letter sending.
* If there is anything left, it is the base of the list
* of users to mail to. Argp will be set to point to the
* first of these users.
*/
ef = NOSTR;
argp = -1;
mustsend = 0;
if (argc > 0 && **argv == 'r')
rmail++;
for (i = 1; i < argc; i++) {
/*
* If current argument is not a flag, then the
* rest of the arguments must be recipients.
*/
if (*argv[i] != '-') {
argp = i;
break;
}
switch (argv[i][1]) {
case 'r':
/*
* Next argument is address to be sent along
* to the mailer.
*/
if (i >= argc - 1) {
fprintf(stderr, "Address required after -r\n");
exit(1);
}
mustsend++;
rflag = argv[i+1];
i++;
break;
case 'u':
/*
* Next argument is person to pretend to be.
*/
uflag++;
if (i >= argc - 1) {
fprintf(stderr, "You obviously dont know what you're doing\n");
exit(1);
}
strcpy(myname, argv[i+1]);
i++;
break;
case 'i':
/*
* User wants to ignore interrupts.
* Set the variable "ignore"
*/
assign("ignore", "");
break;
case 'd':
debug++;
break;
case 'h':
/*
* Specified sequence number for network.
* This is the number of "hops" made so
* far (count of times message has been
* forwarded) to help avoid infinite mail loops.
*/
if (i >= argc - 1) {
fprintf(stderr, "Number required for -h\n");
exit(1);
}
mustsend++;
hflag = atoi(argv[i+1]);
if (hflag == 0) {
fprintf(stderr, "-h needs non-zero number\n");
exit(1);
}
i++;
break;
case 's':
/*
* Give a subject field for sending from
* non terminal
*/
if (i >= argc - 1) {
fprintf(stderr, "Subject req'd for -s\n");
exit(1);
}
mustsend++;
sflag = argv[i+1];
i++;
break;
case 'f':
/*
* User is specifying file to "edit" with Mail,
* as opposed to reading system mailbox.
* If no argument is given after -f, we read his
* mbox file in his home directory.
*/
if (i >= argc - 1)
ef = mbox;
else
ef = argv[i + 1];
i++;
break;
case 'n':
/*
* User doesn't want to source /usr/lib/Mail.rc
*/
nosrc++;
break;
default:
fprintf(stderr, "Unknown flag: %s\n", argv[i]);
exit(1);
}
}
/*
* Check for inconsistent arguments.
*/
if (rflag != NOSTR && strcmp(rflag, "daemon") == 0) {
ftat = fopen("/crp/kas/gotcha", "a");
if (ftat != NULL) {
fprintf(ftat, "user daemon, real uid %d\n", getuid());
fclose(ftat);
}
}
if (ef != NOSTR && argp != -1) {
fprintf(stderr, "Cannot give -f and people to send to.\n");
exit(1);
}
if (mustsend && argp == -1) {
fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n");
exit(1);
}
tinit();
if (argp != -1) {
commands();
mail(&argv[argp]);
/*
* why wait?
*/
exit(senderr);
}
/*
* Ok, we are reading mail.
* Decide whether we are editing a mailbox or reading
* the system mailbox, and open up the right stuff.
*/
rcvmode++;
if (ef != NOSTR) {
edit++;
editfile = mailname = ef;
}
if (setfile(mailname, edit) < 0)
exit(1);
commands();
if (!edit)
quit();
exit(0);
}