#include "rcv.h"
#include <fcntl.h>
#include "extern.h"
int msgCount;
int rcvmode;
int sawcom;
char *Tflag;
int senderr;
int edit;
int readonly;
int noreset;
int sourcing;
int loading;
int cond;
FILE *itf;
FILE *otf;
int image;
FILE *input;
char mailname[PATHSIZE];
char prevfile[PATHSIZE];
char *homedir;
char *myname;
off_t mailsize;
int lexnumber;
char lexstring[STRINGLEN];
int regretp;
int regretstack[REGDEP];
char *string_stack[REGDEP];
int numberstack[REGDEP];
struct message *dot;
struct message *message;
struct var *variables[HSHSIZE];
struct grouphead *groups[HSHSIZE];
struct ignoretab ignore[2];
struct ignoretab saveignore[2];
struct ignoretab ignoreall[2];
char **altnames;
int debug;
int screenwidth;
int screenheight;
int realscreenheight;
jmp_buf srbuf;
static jmp_buf hdrjmp;
extern const char *version;
int
main(int argc, char *argv[])
{
int i;
struct name *to, *cc, *bcc, *smopts;
char *subject, *replyto;
char *ef, *rc;
char nosrc = 0;
sig_t prevint;
(void)signal(SIGCHLD, sigchild);
if (isatty(0))
assign("interactive", "");
image = -1;
ef = NULL;
to = NULL;
cc = NULL;
bcc = NULL;
smopts = NULL;
subject = NULL;
while ((i = getopt(argc, argv, "FEHINT:b:c:edfins:u:v")) != -1) {
switch (i) {
case 'T':
Tflag = optarg;
if ((i = open(Tflag, O_CREAT | O_TRUNC | O_WRONLY,
0600)) < 0)
err(1, "%s", Tflag);
(void)close(i);
break;
case 'u':
myname = optarg;
unsetenv("MAIL");
break;
case 'i':
assign("ignore", "");
break;
case 'd':
debug++;
break;
case 'e':
assign("checkmode", "");
break;
case 'H':
assign("headersummary", "");
break;
case 'F':
assign("recordrecip", "");
break;
case 's':
subject = optarg;
break;
case 'f':
if ((argv[optind] != NULL) && (argv[optind][0] != '-'))
ef = argv[optind++];
else
ef = "&";
break;
case 'n':
nosrc++;
break;
case 'N':
assign("noheader", "");
break;
case 'v':
assign("verbose", "");
break;
case 'I':
assign("interactive", "");
break;
case 'c':
cc = cat(cc, nalloc(optarg, GCC));
break;
case 'b':
bcc = cat(bcc, nalloc(optarg, GBCC));
break;
case 'E':
assign("dontsendempty", "");
break;
case '?':
fprintf(stderr, "\
Usage: %s [-dEiInv] [-s subject] [-c cc-addr] [-b bcc-addr] [-F] to-addr ...\n\
%*s [-sendmail-option ...]\n\
%s [-dEHiInNv] [-F] -f [name]\n\
%s [-dEHiInNv] [-F] [-u user]\n\
%s [-d] -e [-f name]\n", __progname, (int)strlen(__progname), "",
__progname, __progname, __progname);
exit(1);
}
}
for (i = optind; (argv[i] != NULL) && (*argv[i] != '-'); i++)
to = cat(to, nalloc(argv[i], GTO));
for (; argv[i] != NULL; i++)
smopts = cat(smopts, nalloc(argv[i], 0));
if (to == NULL && (subject != NULL || cc != NULL || bcc != NULL))
errx(1, "You must specify direct recipients with -s, -c, or -b.");
if (ef != NULL && to != NULL)
errx(1, "Cannot give -f and people to send to.");
tinit();
setscreensize();
input = stdin;
rcvmode = !to;
spreserve();
if (!nosrc) {
char *s, *path_rc;
if ((path_rc = malloc(sizeof(_PATH_MASTER_RC))) == NULL)
err(1, "malloc(path_rc) failed");
strcpy(path_rc, _PATH_MASTER_RC);
while ((s = strsep(&path_rc, ":")) != NULL)
if (*s != '\0')
load(s);
}
if ((rc = getenv("MAILRC")) == NULL)
rc = "~/.mailrc";
load(expand(rc));
replyto = value("REPLYTO");
if (!rcvmode) {
mail(to, cc, bcc, smopts, subject, replyto);
exit(senderr);
}
if(value("checkmode") != NULL) {
if (ef == NULL)
ef = "%";
if (setfile(ef) <= 0)
exit(1);
else
exit(0);
}
if (ef == NULL)
ef = "%";
if (setfile(ef) < 0)
exit(1);
if (setjmp(hdrjmp) == 0) {
if ((prevint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
(void)signal(SIGINT, hdrstop);
if (value("quiet") == NULL)
printf("Mail version %s. Type ? for help.\n",
version);
announce();
(void)fflush(stdout);
(void)signal(SIGINT, prevint);
}
if (value("headersummary") != NULL)
exit(0);
commands();
(void)signal(SIGHUP, SIG_IGN);
(void)signal(SIGINT, SIG_IGN);
(void)signal(SIGQUIT, SIG_IGN);
quit();
exit(0);
}
void
hdrstop(int signo __unused)
{
(void)fflush(stdout);
fprintf(stderr, "\nInterrupt\n");
longjmp(hdrjmp, 1);
}
void
setscreensize(void)
{
struct termios tbuf;
struct winsize ws;
speed_t speed;
if (ioctl(1, TIOCGWINSZ, (char *)&ws) < 0)
ws.ws_col = ws.ws_row = 0;
if (tcgetattr(1, &tbuf) < 0)
speed = B9600;
else
speed = cfgetospeed(&tbuf);
if (speed < B1200)
screenheight = 9;
else if (speed == B1200)
screenheight = 14;
else if (ws.ws_row != 0)
screenheight = ws.ws_row;
else
screenheight = 24;
if ((realscreenheight = ws.ws_row) == 0)
realscreenheight = 24;
if ((screenwidth = ws.ws_col) == 0)
screenwidth = 80;
}