{ NULL, 0 }
};
+char *version=VERSION;
/* flags for headers->flags */
#define HNOP 0x0000 /* just used to keep .set around */
{ "Subject", HSUB, 0 },
{ "To", HADR|HTRY, MVIS },
{ "Cc", HADR|HTRY, MVIS },
- { "Dcc", HADR|HTRY|HDCC, MVIS },
+ { "Dcc", HADR|HTRY|HDCC, MINV },
{ "Bcc", HADR|HTRY|HBCC, MINV },
{ "Message-Id", HBAD, 0 },
{ "Fcc", HFCC, 0 },
{ "Resent-Subject", HSUB, 0 },
{ "Resent-To", HADR|HTRY, MVIS },
{ "Resent-Cc", HADR|HTRY, MVIS },
- { "Resent-Dcc", HADR|HTRY|HDCC, MVIS },
+ { "Resent-Dcc", HADR|HTRY|HDCC, MINV },
{ "Resent-Bcc", HADR|HTRY|HBCC, MINV },
{ "Resent-Message-Id", HBAD, 0 },
{ "Resent-Fcc", HFCC, 0 },
static char *tmpfil;
static char *subject = NULL; /* the subject field for BCC'ing */
+static struct mailname *from = NULL; /* the from field for BCC'ing */
static char fccs[BUFSIZ] = "";
struct mailname *bccs = NULL; /* list of the bcc recipients */
struct mailname *recipients = NULL; /* list of the recipients */
int
main(int argc, char **argv)
{
- int state, compnum;
+ enum state state;
+ struct field f = {{0}};
+ int compnum;
char *cp, *msg = NULL, **argp, **arguments;
- char **sargv, buf[BUFSIZ], name[NAMESZ];
+ char **sargv, buf[BUFSIZ];
FILE *in;
setlocale(LC_ALL, "");
verbose++;
out = stdout;
} else {
- tmpfil = getcpy(m_mktemp2("/tmp/", invo_name, NULL, &out));
+ tmpfil = mh_xstrdup(m_mktemp2("/tmp/", invo_name, NULL, &out));
}
/* check for "Aliasfile:" profile entry */
char *dp, **ap;
aliasflg = 1;
- for (ap=brkstring(dp=getcpy(cp), " ", "\n"); ap && *ap;
+ for (ap=brkstring(dp=mh_xstrdup(cp), " ", "\n"); ap && *ap;
ap++) {
if ((state = alias(etcpath(*ap))) != AK_OK) {
adios(EX_IOERR, NULL, "aliasing error in file %s: %s",
hdrtab = (msgstate == normal) ? NHeaders : RHeaders;
- for (compnum = 1, state = FLD;;) {
- switch (state = m_getfld(state, name, buf, sizeof(buf), in)) {
- case FLD:
- case FLDPLUS:
+ for (compnum = 1, state = FLD2;;) {
+ switch (state = m_getfld2(state, &f, in)) {
+ case FLD2:
compnum++;
- cp = getcpy(buf);
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), in);
- cp = add(buf, cp);
- }
- putfmt(name, cp, out);
- free(cp);
+ putfmt(f.name, f.value, out);
continue;
- case BODY:
+ case BODY2:
finish_headers(out);
- fprintf(out, "\n%s", buf);
- while (state == BODY) {
- state = m_getfld(state, name, buf,
- sizeof(buf), in);
- fputs(buf, out);
+ fprintf(out, "\n%s", f.value);
+ while ((state = m_getfld2(state, &f, in)) == BODY2) {
+ if (f.valuelen > NAMESZ+1 || (!f.crlf && f.valuelen > NAMESZ)) {
+ adios(EX_DATAERR, NULL, "Body contains a to long line");
+ }
+ fputs(f.value, out);
}
break;
- case FILEEOF:
+ case FILEEOF2:
finish_headers(out);
break;
- case LENERR:
- case FMTERR:
+ case LENERR2:
+ case FMTERR2:
+ case IOERR2:
adios(EX_DATAERR, NULL, "message format error in component #%d",
compnum);
}
fclose(in);
+ if (state != FILEEOF2) {
+ adios(EX_IOERR, "m_getfld2", "Error while reading body");
+ }
+
if (debug) {
struct mailname *i = recipients;
/* stop here */
adios(EX_DATAERR, NULL, "message has no recipients");
}
- sargv = mh_xmalloc(sizeof(char **) * (recipientsc + 4));
+ sargv = mh_xcalloc(recipientsc + 4, sizeof(char **));
argp = sargv;
*argp++ = "send-mail";
}
while (recipients != NULL) {
- cp = getcpy(recipients->m_mbox);
+ cp = mh_xstrdup(recipients->m_mbox);
if (recipients->m_host) {
cp = add("@", cp);
cp = add(recipients->m_host, cp);
int i;
struct headers *hdr;
struct mailname addr_start, *addr_end;
- size_t addrc;
+ size_t addrc = 0;
+ ssize_t ret;
addr_end = &addr_start;
addr_end->m_next = NULL;
}
if (hdr->flags & HSUB) {
- subject = getcpy(str);
+ subject = mh_xstrdup(str);
}
if (!(hdr->flags & HADR)) {
return;
}
- addrc = getmboxes(str, &addr_end);
+ if ((ret = getmboxes(str, &addr_end)) < 0) {
+ adios(EX_DATAERR, NULL, "can't parse address: %s", str);
+ }
+
+ addrc += ret;
if (aliasflg) {
addrc += do_aliasing(&addr_start, &addr_end);
if (hdr->set & MFRM) {
struct mailname *mp = NULL;
struct mailname *my = NULL;
- unsigned int fromcnt = 0;
/* needed because the address parser holds global state */
ismymbox(NULL);
- for ( mp = addr_start.m_next; mp; mp = mp->m_next) {
+ for (mp = addr_start.m_next; mp; mp = mp->m_next) {
if (ismymbox(mp)) {
msgflags |= MFMM;
if (my == NULL) {
- my = mp;
+ from = my = mp;
}
}
- fromcnt++;
}
- if (fromcnt > 1) {
+ if (addrc > 1) {
sender = my;
}
}
static void
putadr(char *name, struct mailname *nl)
{
- struct mailname *mp, *mp2;
+ struct mailname *mp;
+ char *cp;
int linepos;
int namelen;
fprintf(out, "\n%s: ", name);
linepos = namelen;
}
- linepos = putone(mp->m_text, linepos, namelen);
- mp2 = mp;
+ if (mp->m_ingrp) {
+ if (mp->m_gname != NULL) {
+ cp = mh_xstrdup(mp->m_gname);
+ cp = add(";", cp);
+ linepos = putone(cp, linepos, namelen);
+ mh_free0(&cp);
+ cp = NULL;
+ }
+ } else {
+ linepos = putone(mp->m_text, linepos, namelen);
+ }
mp = mp->m_next;
}
putc('\n', out);
fprintf(stderr, "Skipped %sFcc %s: unable to system().\n",
msgstate == resent ? "Resent-" : "", folders);
} else if (status != 0) {
- fprintf(stderr, "%sFcc %s: Problems occured.\n",
+ fprintf(stderr, "%sFcc %s: Problems occurred.\n",
msgstate == resent ? "Resent-" : "", folders);
}
}
FILE *out = NULL;
for (mp=bccs; mp; mp=mp->m_next) {
- bccdraft = getcpy(m_mktemp2("/tmp/", invo_name, NULL, &out));
+ bccdraft = mh_xstrdup(m_mktemp2("/tmp/", invo_name, NULL, &out));
fprintf(out, "To: %s\n", mp->m_text);
+ if (from) {
+ fprintf(out, "From: %s\n", from->m_text);
+ }
fprintf(out, "Subject: [BCC] %s", subject ? subject : "");
fprintf(out, "%s: %s\n", attach_hdr, origmsg);
fprintf(out, "------------\n");
struct mailname *prev, *cur;
char *cp;
size_t i = 0;
+ ssize_t e;
prev = start;
cur = prev->m_next;
cp = akvalue(cur->m_mbox);
if (strcmp(cp, cur->m_mbox) != 0) {
prev->m_next = cur->m_next;
- i += getmboxes(cp, &prev);
+ if ((e = getmboxes(cp, &prev)) < 0) {
+ goto error;
+ }
+ i += e;
i -= 1;
mnfree(cur);
} else {
}
*end = prev;
return i;
+error:
+ adios(EX_CONFIG, NULL, "can't parse alias %s: %s", cur->m_mbox, cp);
+ return 0; /* not reached */
}