projects
/
mmh
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
make m_getfld2() called with an error state a noop
[mmh]
/
uip
/
mhbuild.c
diff --git
a/uip/mhbuild.c
b/uip/mhbuild.c
index
c862bc3
..
ec5623a
100644
(file)
--- a/
uip/mhbuild.c
+++ b/
uip/mhbuild.c
@@
-24,6
+24,7
@@
#include <ctype.h>
#include <sys/stat.h>
#include <locale.h>
#include <ctype.h>
#include <sys/stat.h>
#include <locale.h>
+#include <sysexits.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
@@
-118,7
+119,7
@@
main(int argc, char **argv)
FILE *fp_out = NULL;
if (atexit(unlink_done) != 0) {
FILE *fp_out = NULL;
if (atexit(unlink_done) != 0) {
- adios(NULL, "atexit failed");
+ adios(EX_OSERR, NULL, "atexit failed");
}
setlocale(LC_ALL, "");
}
setlocale(LC_ALL, "");
@@
-133,7
+134,7
@@
main(int argc, char **argv)
while ((cp = *argp++)) {
if (cp[0] == '-' && cp[1] == '\0') {
if (compfile)
while ((cp = *argp++)) {
if (cp[0] == '-' && cp[1] == '\0') {
if (compfile)
- adios(NULL, "cannot specify both standard input and a file");
+ adios(EX_USAGE, NULL, "cannot specify both standard input and a file");
else
compfile = cp;
verbosw = 0; /* turn off -verbose listings */
else
compfile = cp;
verbosw = 0; /* turn off -verbose listings */
@@
-143,18
+144,17
@@
main(int argc, char **argv)
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- /* sysexits.h EX_USAGE */
- exit(1);
+ exit(EX_USAGE);
case UNKWNSW:
case UNKWNSW:
- adios(NULL, "-%s unknown", cp);
+ adios(EX_USAGE, NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] file", invo_name);
print_help(buf, switches, 1);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] file", invo_name);
print_help(buf, switches, 1);
- exit(0);
+ exit(argc == 2 ? EX_OK : EX_USAGE);
case VERSIONSW:
print_version(invo_name);
case VERSIONSW:
print_version(invo_name);
- exit(0);
+ exit(argc == 2 ? EX_OK : EX_USAGE);
case VERBSW:
verbosw++;
case VERBSW:
verbosw++;
@@
-168,7
+168,7
@@
main(int argc, char **argv)
}
}
if (compfile)
}
}
if (compfile)
- adios(NULL, "only one composition file allowed");
+ adios(EX_USAGE, NULL, "only one composition file allowed");
else
compfile = cp;
}
else
compfile = cp;
}
@@
-208,7
+208,7
@@
main(int argc, char **argv)
/* Check if we have a file to process */
if (!compfile)
/* Check if we have a file to process */
if (!compfile)
- adios(NULL, "need to specify a %s composition file",
+ adios(EX_USAGE, NULL, "need to specify a %s composition file",
invo_name);
/*
invo_name);
/*
@@
-237,7
+237,7
@@
main(int argc, char **argv)
/* output the temp file to standard output */
if ((fp = fopen(outfile, "r")) == NULL)
/* output the temp file to standard output */
if ((fp = fopen(outfile, "r")) == NULL)
- adios(outfile, "unable to open");
+ adios(EX_IOERR, outfile, "unable to open");
while (fgets(buffer, BUFSIZ, fp))
fputs(buffer, stdout);
fclose(fp);
while (fgets(buffer, BUFSIZ, fp))
fputs(buffer, stdout);
fclose(fp);
@@
-249,7
+249,7
@@
main(int argc, char **argv)
unlink_outfile = 0;
free_content(ct);
unlink_outfile = 0;
free_content(ct);
- exit(0);
+ exit(EX_OK);
}
/*
}
/*
@@
-271,15
+271,14
@@
main(int argc, char **argv)
/* Rename composition draft */
snprintf(buffer, sizeof(buffer), "%s.orig", compfile);
if (rename(compfile, buffer) == NOTOK) {
/* Rename composition draft */
snprintf(buffer, sizeof(buffer), "%s.orig", compfile);
if (rename(compfile, buffer) == NOTOK) {
- adios(buffer, "unable to rename draft %s to", compfile);
+ adios(EX_IOERR, buffer, "unable to rename draft %s to", compfile);
}
/* Rename output file to take its place */
if (rename(outfile, compfile) == NOTOK) {
advise(compfile, "unable to rename output %s to", outfile);
rename(buffer, compfile);
}
/* Rename output file to take its place */
if (rename(outfile, compfile) == NOTOK) {
advise(compfile, "unable to rename output %s to", outfile);
rename(buffer, compfile);
- /* sysexits.h EX_IOERR */
- exit(1);
+ exit(EX_IOERR);
}
unlink_outfile = 0;
}
unlink_outfile = 0;
@@
-313,25
+312,28
@@
unlink_done()
static CT
build_mime(char *infile)
{
static CT
build_mime(char *infile)
{
- int compnum, state;
- char buf[BUFSIZ], name[NAMESZ];
+ enum state state;
+ struct field f = {{0}};
+ int compnum;
+ char buf[BUFSIZ];
char *cp, *np, *vp;
struct multipart *m;
struct part **pp;
CT ct;
FILE *in;
char *cp, *np, *vp;
struct multipart *m;
struct part **pp;
CT ct;
FILE *in;
+ HF hp;
umask(~m_gmprot());
/* open the composition draft */
umask(~m_gmprot());
/* open the composition draft */
- if ((in = fopen(infile, "r")) == NULL)
- adios(infile, "unable to open for reading");
+ if ((in = fopen(infile, "r")) == NULL) {
+ adios(EX_IOERR, infile, "unable to open for reading");
+ }
/*
** Allocate space for primary (outside) content
*/
/*
** Allocate space for primary (outside) content
*/
- if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL)
- adios(NULL, "out of memory");
+ ct = (CT) mh_xcalloc(1, sizeof(*ct));
/*
** Allocate structure for handling decoded content
/*
** Allocate structure for handling decoded content
@@
-345,73
+347,65
@@
build_mime(char *infile)
** draft into the linked list of header fields for
** the new MIME message.
*/
** draft into the linked list of header fields for
** the new MIME message.
*/
- for (compnum = 1, state = FLD;;) {
- switch (state = m_getfld(state, name, buf, sizeof(buf), in)) {
- case FLD:
- case FLDPLUS:
- case FLDEOF:
+ for (compnum = 1, state = FLD2;;) {
+ switch (state = m_getfld2(state, &f, in)) {
+ case FLD2:
compnum++;
/* abort if draft has Mime-Version header field */
compnum++;
/* abort if draft has Mime-Version header field */
- if (!mh_strcasecmp(name, VRSN_FIELD))
- adios(NULL, "draft shouldn't contain %s: field", VRSN_FIELD);
+ if (!mh_strcasecmp(f.name, VRSN_FIELD)) {
+ adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", VRSN_FIELD);
+ }
/*
** abort if draft has Content-Transfer-Encoding
** header field
*/
/*
** abort if draft has Content-Transfer-Encoding
** header field
*/
- if (!mh_strcasecmp(name, ENCODING_FIELD))
- adios(NULL, "draft shouldn't contain %s: field", ENCODING_FIELD);
+ if (!mh_strcasecmp(f.name, ENCODING_FIELD)) {
+ adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", ENCODING_FIELD);
+ }
/* ignore any Content-Type fields in the header */
/* ignore any Content-Type fields in the header */
- if (!mh_strcasecmp(name, TYPE_FIELD)) {
- while (state == FLDPLUS)
- state = m_getfld(state, name, buf,
- sizeof(buf), in);
- goto finish_field;
+ if (!mh_strcasecmp(f.name, TYPE_FIELD)) {
+ continue;
}
}
- /* get copies of the buffers */
- np = getcpy(name);
- vp = getcpy(buf);
+ /* add the header data to the list */
+ add_header(ct, getcpy(f.name), getcpy(f.value));
- /* if necessary, get rest of field */
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), in);
- vp = add(buf, vp); /* add to prev value */
- }
-
- /* Now add the header data to the list */
- add_header(ct, np, vp);
+ continue;
-finish_field:
- /* if this wasn't the last hdr field, then continue */
- if (state != FLDEOF)
- continue;
- /* else fall... */
+ case BODY2:
+ fseek(in, (long) (-strlen(f.value)), SEEK_CUR);
+ break;
- case FILEEOF:
- adios(NULL, "draft has empty body -- no directives!");
+ case FILEEOF2:
+ adios(EX_CONFIG, NULL, "draft has empty body -- no directives!");
/* NOTREACHED */
/* NOTREACHED */
- case BODY:
- case BODYEOF:
- fseek(in, (long) (-strlen(buf)), SEEK_CUR);
- break;
-
- case LENERR:
- case FMTERR:
- adios(NULL, "message format error in component #%d",
+ case LENERR2:
+ case FMTERR2:
+ case IOERR2:
+ adios(EX_CONFIG, NULL, "message format error in component #%d",
compnum);
default:
compnum);
default:
- adios(NULL, "getfld() returned %d", state);
+ adios(EX_SOFTWARE, NULL, "getfld() returned %d", state);
}
break;
}
/*
}
break;
}
/*
+ ** Iterate through the list of headers and call the function to
+ ** MIME-ify them if required.
+ */
+ for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
+ if (encode_rfc2047(hp->name, &hp->value, NULL)) {
+ adios(EX_DATAERR, NULL, "Unable to encode header \"%s\"", hp->name);
+ }
+ }
+
+ /*
** Now add the MIME-Version header field
** to the list of header fields.
*/
** Now add the MIME-Version header field
** to the list of header fields.
*/
@@
-425,15
+419,13
@@
finish_field:
** We can remove this later, if it is not needed.
*/
if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK) {
** We can remove this later, if it is not needed.
*/
if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK) {
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
}
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_MIXED;
ct->c_file = getcpy(infile);
}
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_MIXED;
ct->c_file = getcpy(infile);
- if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL)
- adios(NULL, "out of memory");
+ m = (struct multipart *) mh_xcalloc(1, sizeof(*m));
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
@@
-452,8
+444,7
@@
finish_field:
if (!p)
continue;
if (!p)
continue;
- if ((part = (struct part *) calloc(1, sizeof(*part))) == NULL)
- adios(NULL, "out of memory");
+ part = (struct part *) mh_xcalloc(1, sizeof(*part));
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
@@
-467,7
+458,7
@@
finish_field:
/* check if any contents were found */
if (!m->mp_parts)
/* check if any contents were found */
if (!m->mp_parts)
- adios(NULL, "no content directives found");
+ adios(EX_OSERR, NULL, "no content directives found");
/*
** If only one content was found, then remove and
/*
** If only one content was found, then remove and
@@
-498,7
+489,7
@@
finish_field:
compose_content(ct);
if ((cp = strchr(prefix, 'a')) == NULL)
compose_content(ct);
if ((cp = strchr(prefix, 'a')) == NULL)
- adios(NULL, "internal error(4)");
+ adios(EX_SOFTWARE, NULL, "internal error(4)");
/*
** Scan the contents. Choose a transfer encoding, and
/*
** Scan the contents. Choose a transfer encoding, and
@@
-510,7
+501,7
@@
finish_field:
(*cp)++;
} else {
if (*++cp == 0)
(*cp)++;
} else {
if (*++cp == 0)
- adios(NULL, "giving up trying to find a unique delimiter string");
+ adios(EX_SOFTWARE, NULL, "giving up trying to find a unique delimiter string");
else
(*cp)++;
}
else
(*cp)++;
}
@@
-533,8
+524,7
@@
init_decoded_content(CT ct)
{
CE ce;
{
CE ce;
- if ((ce = (CE) calloc(1, sizeof(*ce))) == NULL)
- adios(NULL, "out of memory");
+ ce = (CE) mh_xcalloc(1, sizeof(*ce));
ct->c_cefile = ce;
ct->c_ceopenfnx = open7Bit; /* since unencoded */
ct->c_cefile = ce;
ct->c_ceopenfnx = open7Bit; /* since unencoded */
@@
-594,8
+584,7
@@
user_content(FILE *in, char *file, char *buf, CT *ctp)
}
/* allocate basic Content structure */
}
/* allocate basic Content structure */
- if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL)
- adios(NULL, "out of memory");
+ ct = (CT) mh_xcalloc(1, sizeof(*ct));
*ctp = ct;
/* allocate basic structure for handling decoded content */
*ctp = ct;
/* allocate basic structure for handling decoded content */
@@
-623,7
+612,7
@@
user_content(FILE *in, char *file, char *buf, CT *ctp)
cp = m_mktemp2(NULL, invo_name, NULL, &out);
if (cp == NULL)
cp = m_mktemp2(NULL, invo_name, NULL, &out);
if (cp == NULL)
- adios("mhbuild", "unable to create temporary file");
+ adios(EX_CANTCREAT, "mhbuild", "unable to create temporary file");
/* use a temp file to collect the plain text lines */
ce->ce_file = getcpy(cp);
/* use a temp file to collect the plain text lines */
ce->ce_file = getcpy(cp);
@@
-651,7
+640,7
@@
user_content(FILE *in, char *file, char *buf, CT *ctp)
again_descr:
ct->c_descr = add(buffer + i + 1, ct->c_descr);
if (!fgetstr(buffer, sizeof(buffer) - 1, in))
again_descr:
ct->c_descr = add(buffer + i + 1, ct->c_descr);
if (!fgetstr(buffer, sizeof(buffer) - 1, in))
- adios(NULL, "end-of-file after %s: field in plaintext", DESCR_FIELD);
+ adios(EX_DATAERR, NULL, "end-of-file after %s: field in plaintext", DESCR_FIELD);
switch (buffer[0]) {
case ' ':
case '\t':
switch (buffer[0]) {
case ' ':
case '\t':
@@
-659,7
+648,7
@@
again_descr:
goto again_descr;
case '#':
goto again_descr;
case '#':
- adios(NULL, "#-directive after %s: field in plaintext", DESCR_FIELD);
+ adios(EX_DATAERR, NULL, "#-directive after %s: field in plaintext", DESCR_FIELD);
/* NOTREACHED */
default:
/* NOTREACHED */
default:
@@
-674,7
+663,7
@@
again_descr:
again_dispo:
ct->c_dispo = add(buffer + i + 1, ct->c_dispo);
if (!fgetstr(buffer, sizeof(buffer) - 1, in))
again_dispo:
ct->c_dispo = add(buffer + i + 1, ct->c_dispo);
if (!fgetstr(buffer, sizeof(buffer) - 1, in))
- adios(NULL, "end-of-file after %s: field in plaintext", DISPO_FIELD);
+ adios(EX_DATAERR, NULL, "end-of-file after %s: field in plaintext", DISPO_FIELD);
switch (buffer[0]) {
case ' ':
case '\t':
switch (buffer[0]) {
case ' ':
case '\t':
@@
-682,7
+671,7
@@
again_dispo:
goto again_dispo;
case '#':
goto again_dispo;
case '#':
- adios(NULL, "#-directive after %s: field in plaintext", DISPO_FIELD);
+ adios(EX_DATAERR, NULL, "#-directive after %s: field in plaintext", DISPO_FIELD);
/* NOTREACHED */
default:
/* NOTREACHED */
default:
@@
-714,8
+703,7
@@
rock_and_roll:
/* parse content type */
if (get_ctinfo(content, ct, inlineD) == NOTOK)
/* parse content type */
if (get_ctinfo(content, ct, inlineD) == NOTOK)
- /* sysexits.h EX_USAGE */
- exit(1);
+ exit(EX_DATAERR);
for (s2i = str2cts; s2i->si_key; s2i++)
if (!mh_strcasecmp(ci->ci_type, s2i->si_key))
for (s2i = str2cts; s2i->si_key; s2i++)
if (!mh_strcasecmp(ci->ci_type, s2i->si_key))
@@
-734,7
+722,7
@@
rock_and_roll:
}
/* else fall... */
case CT_MULTIPART:
}
/* else fall... */
case CT_MULTIPART:
- adios(NULL, "it doesn't make sense to define an in-line %s content",
+ adios(EX_DATAERR, NULL, "it doesn't make sense to define an in-line %s content",
ct->c_type == CT_MESSAGE ? "message" :
"multipart");
/* NOTREACHED */
ct->c_type == CT_MESSAGE ? "message" :
"multipart");
/* NOTREACHED */
@@
-757,14
+745,13
@@
call_init:
*/
if (buf[1] == '@') {
*/
if (buf[1] == '@') {
- adios(NULL, "The #@ directive i.e. message/external-body "
+ adios(EX_DATAERR, NULL, "The #@ directive i.e. message/external-body "
"is not supported anymore.");
}
/* parse directive */
if (get_ctinfo(buf+1, ct, 1) == NOTOK)
"is not supported anymore.");
}
/* parse directive */
if (get_ctinfo(buf+1, ct, 1) == NOTOK)
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
/* check directive against the list of MIME types */
for (s2i = str2cts; s2i->si_key; s2i++)
/* check directive against the list of MIME types */
for (s2i = str2cts; s2i->si_key; s2i++)
@@
-779,18
+766,18
@@
call_init:
*/
if (s2i->si_key) {
if (!ci->ci_subtype)
*/
if (s2i->si_key) {
if (!ci->ci_subtype)
- adios(NULL, "missing subtype in \"#%s\"", ci->ci_type);
+ adios(EX_DATAERR, NULL, "missing subtype in \"#%s\"", ci->ci_type);
switch (ct->c_type = s2i->si_val) {
case CT_MULTIPART:
switch (ct->c_type = s2i->si_val) {
case CT_MULTIPART:
- adios(NULL, "use \"#begin ... #end\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
+ adios(EX_DATAERR, NULL, "use \"#begin ... #end\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
/* NOTREACHED */
case CT_MESSAGE:
if (!mh_strcasecmp(ci->ci_subtype, "partial") ||
!mh_strcasecmp(ci->ci_subtype,
"external-body")) {
/* NOTREACHED */
case CT_MESSAGE:
if (!mh_strcasecmp(ci->ci_subtype, "partial") ||
!mh_strcasecmp(ci->ci_subtype,
"external-body")) {
- adios(NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype);
+ adios(EX_DATAERR, NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype);
}
use_forw:
admonish(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
}
use_forw:
admonish(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
@@
-809,7
+796,7
@@
use_forw:
for (cp = ci->ci_magic + 1; isspace(*cp); cp++)
continue;
if (!*cp)
for (cp = ci->ci_magic + 1; isspace(*cp); cp++)
continue;
if (!*cp)
- adios(NULL, "empty pipe command for #%s directive", ci->ci_type);
+ adios(EX_DATAERR, NULL, "empty pipe command for #%s directive", ci->ci_type);
cp = getcpy(cp);
free(ci->ci_magic);
ci->ci_magic = cp;
cp = getcpy(cp);
free(ci->ci_magic);
ci->ci_magic = cp;
@@
-817,7
+804,7
@@
use_forw:
/* record filename of decoded contents */
ce->ce_file = ci->ci_magic;
if (access(ce->ce_file, R_OK) == NOTOK)
/* record filename of decoded contents */
ce->ce_file = ci->ci_magic;
if (access(ce->ce_file, R_OK) == NOTOK)
- adios("reading", "unable to access %s for", ce->ce_file);
+ adios(EX_IOERR, "reading", "unable to access %s for", ce->ce_file);
ci->ci_magic = NULL;
}
return OK;
ci->ci_magic = NULL;
}
return OK;
@@
-835,8
+822,7
@@
use_forw:
if ((cp = context_find(buffer)) == NULL ||
*cp == '\0') {
content_error(NULL, ct, "don't know how to compose content");
if ((cp = context_find(buffer)) == NULL ||
*cp == '\0') {
content_error(NULL, ct, "don't know how to compose content");
- /* sysexits.h EX_USAGE */
- exit(1);
+ exit(EX_CONFIG);
}
}
ci->ci_magic = getcpy(cp);
}
}
ci->ci_magic = getcpy(cp);
@@
-872,7
+858,7
@@
use_forw:
cp = *ap;
if (*cp == '+' || *cp == '@') {
if (folder)
cp = *ap;
if (*cp == '+' || *cp == '@') {
if (folder)
- adios(NULL, "only one folder per #forw directive");
+ adios(EX_USAGE, NULL, "only one folder per #forw directive");
else
folder = getcpy(expandfol(cp));
}
else
folder = getcpy(expandfol(cp));
}
@@
-883,13
+869,12
@@
use_forw:
folder = getcpy(getcurfol());
if (!(mp = folder_read(folder)))
folder = getcpy(getcurfol());
if (!(mp = folder_read(folder)))
- adios(NULL, "unable to read folder %s", folder);
+ adios(EX_IOERR, NULL, "unable to read folder %s", folder);
for (ap = arguments; *ap; ap++) {
cp = *ap;
if (*cp != '+' && *cp != '@')
if (!m_convert(mp, cp))
for (ap = arguments; *ap; ap++) {
cp = *ap;
if (*cp != '+' && *cp != '@')
if (!m_convert(mp, cp))
- /* sysexits.h EX_USAGE */
- exit(1);
+ exit(EX_USAGE);
}
free(folder);
free_ctinfo(ct);
}
free(folder);
free_ctinfo(ct);
@@
-903,14
+888,11
@@
use_forw:
if (mp->numsel > 1) {
/* we are forwarding multiple messages */
if (get_ctinfo("multipart/digest", ct, 0) == NOTOK)
if (mp->numsel > 1) {
/* we are forwarding multiple messages */
if (get_ctinfo("multipart/digest", ct, 0) == NOTOK)
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_DIGEST;
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_DIGEST;
- if ((m = (struct multipart *)
- calloc(1, sizeof(*m))) == NULL)
- adios(NULL, "out of memory");
+ m = (struct multipart *) mh_xcalloc(1, sizeof(*m));
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
@@
-920,15
+902,12
@@
use_forw:
CT p;
CE pe;
CT p;
CE pe;
- if ((p = (CT) calloc(1, sizeof(*p)))
- == NULL)
- adios(NULL, "out of memory");
+ p = (CT) mh_xcalloc(1, sizeof(*p));
init_decoded_content(p);
pe = p->c_cefile;
if (get_ctinfo("message/rfc822", p, 0)
== NOTOK)
init_decoded_content(p);
pe = p->c_cefile;
if (get_ctinfo("message/rfc822", p, 0)
== NOTOK)
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
p->c_type = CT_MESSAGE;
p->c_subtype = MESSAGE_RFC822;
p->c_type = CT_MESSAGE;
p->c_subtype = MESSAGE_RFC822;
@@
-937,8
+916,7
@@
use_forw:
msgnum);
pe->ce_file = getcpy(buffer);
msgnum);
pe->ce_file = getcpy(buffer);
- if ((part = (struct part *) calloc(1, sizeof(*part))) == NULL)
- adios(NULL, "out of memory");
+ part = (struct part *) mh_xcalloc(1, sizeof(*part));
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
@@
-947,8
+925,7
@@
use_forw:
} else {
/* we are forwarding one message */
if (get_ctinfo("message/rfc822", ct, 0) == NOTOK)
} else {
/* we are forwarding one message */
if (get_ctinfo("message/rfc822", ct, 0) == NOTOK)
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
ct->c_type = CT_MESSAGE;
ct->c_subtype = MESSAGE_RFC822;
ct->c_type = CT_MESSAGE;
ct->c_subtype = MESSAGE_RFC822;
@@
-994,13
+971,11
@@
use_forw:
free_ctinfo(ct);
snprintf(buffer, sizeof(buffer), "multipart/%s", cp);
if (get_ctinfo(buffer, ct, 0) == NOTOK)
free_ctinfo(ct);
snprintf(buffer, sizeof(buffer), "multipart/%s", cp);
if (get_ctinfo(buffer, ct, 0) == NOTOK)
- /* sysexits.h EX_DATAERR */
- exit(1);
+ exit(EX_DATAERR);
ct->c_type = CT_MULTIPART;
ct->c_subtype = vrsn;
ct->c_type = CT_MULTIPART;
ct->c_subtype = vrsn;
- if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL)
- adios(NULL, "out of memory");
+ m = (struct multipart *) mh_xcalloc(1, sizeof(*m));
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
ct->c_ctparams = (void *) m;
pp = &m->mp_parts;
@@
-1010,15
+985,13
@@
use_forw:
if (user_content(in, file, buffer, &p) == DONE) {
if (!m->mp_parts)
if (user_content(in, file, buffer, &p) == DONE) {
if (!m->mp_parts)
- adios(NULL, "empty \"#begin ... #end\" sequence");
+ adios(EX_DATAERR, NULL, "empty \"#begin ... #end\" sequence");
return OK;
}
if (!p)
continue;
return OK;
}
if (!p)
continue;
- if ((part = (struct part *)
- calloc(1, sizeof(*part))) == NULL)
- adios(NULL, "out of memory");
+ part = (struct part *) mh_xcalloc(1, sizeof(*part));
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
*pp = part;
pp = &part->mp_next;
part->mp_part = p;
@@
-1030,7
+1003,7
@@
use_forw:
/*
** Unknown directive
*/
/*
** Unknown directive
*/
- adios(NULL, "unknown directive \"#%s\"", ci->ci_type);
+ adios(EX_DATAERR, NULL, "unknown directive \"#%s\"", ci->ci_type);
return NOTOK; /* NOT REACHED */
}
return NOTOK; /* NOT REACHED */
}
@@
-1114,11
+1087,11
@@
compose_content(CT ct)
char *tfile = NULL;
if (!(cp = ci->ci_magic))
char *tfile = NULL;
if (!(cp = ci->ci_magic))
- adios(NULL, "internal error(5)");
+ adios(EX_SOFTWARE, NULL, "internal error(5)");
tfile = m_mktemp2(NULL, invo_name, NULL, NULL);
if (tfile == NULL) {
tfile = m_mktemp2(NULL, invo_name, NULL, NULL);
if (tfile == NULL) {
- adios("mhbuild", "unable to create temporary file");
+ adios(EX_CANTCREAT, "mhbuild", "unable to create temporary file");
}
ce->ce_file = getcpy(tfile);
ce->ce_unlink = 1;
}
ce->ce_file = getcpy(tfile);
ce->ce_unlink = 1;
@@
-1206,11
+1179,11
@@
raw:
vec[3] = NULL;
if ((out = fopen(ce->ce_file, "w")) == NULL)
vec[3] = NULL;
if ((out = fopen(ce->ce_file, "w")) == NULL)
- adios(ce->ce_file, "unable to open for writing");
+ adios(EX_IOERR, ce->ce_file, "unable to open for writing");
switch (child_id = fork()) {
case NOTOK:
switch (child_id = fork()) {
case NOTOK:
- adios("fork", "unable to fork");
+ adios(EX_OSERR, "fork", "unable to fork");
/* NOTREACHED */
case OK:
/* NOTREACHED */
case OK:
@@
-1220,14
+1193,13
@@
raw:
execvp("/bin/sh", vec);
fprintf(stderr, "unable to exec ");
perror("/bin/sh");
execvp("/bin/sh", vec);
fprintf(stderr, "unable to exec ");
perror("/bin/sh");
- _exit(-1);
+ _exit(EX_OSERR);
/* NOTREACHED */
default:
fclose(out);
if (pidXwait(child_id, NULL))
/* NOTREACHED */
default:
fclose(out);
if (pidXwait(child_id, NULL))
- /* sysexits.h EX_SOFTWARE */
- exit(1);
+ exit(EX_SOFTWARE);
break;
}
}
break;
}
}
@@
-1336,7
+1308,7
@@
scan_content(CT ct)
*/
if (check8bit || checklinelen || checklinespace || checkboundary) {
if ((in = fopen(ce->ce_file, "r")) == NULL)
*/
if (check8bit || checklinelen || checklinespace || checkboundary) {
if ((in = fopen(ce->ce_file, "r")) == NULL)
- adios(ce->ce_file, "unable to open for reading");
+ adios(EX_IOERR, ce->ce_file, "unable to open for reading");
len = strlen(prefix);
while (fgets(buffer, sizeof(buffer) - 1, in)) {
len = strlen(prefix);
while (fgets(buffer, sizeof(buffer) - 1, in)) {
@@
-1540,6
+1512,9
@@
build_headers(CT ct)
if (ct->c_descr) {
np = getcpy(DESCR_FIELD);
vp = concat(" ", ct->c_descr, NULL);
if (ct->c_descr) {
np = getcpy(DESCR_FIELD);
vp = concat(" ", ct->c_descr, NULL);
+ if (encode_rfc2047(DESCR_FIELD, &vp, NULL)) {
+ adios(EX_DATAERR, NULL, "Unable to encode %s header", DESCR_FIELD);
+ }
add_header(ct, np, vp);
}
add_header(ct, np, vp);
}
@@
-1562,7
+1537,7
@@
build_headers(CT ct)
case CE_8BIT:
if (ct->c_type == CT_MESSAGE)
case CE_8BIT:
if (ct->c_type == CT_MESSAGE)
- adios(NULL, "internal error, invalid encoding");
+ adios(EX_DATAERR, NULL, "internal error, invalid encoding");
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "8bit", "\n", NULL);
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "8bit", "\n", NULL);
@@
-1571,7
+1546,7
@@
build_headers(CT ct)
case CE_QUOTED:
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
case CE_QUOTED:
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
- adios(NULL, "internal error, invalid encoding");
+ adios(EX_DATAERR, NULL, "internal error, invalid encoding");
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "quoted-printable", "\n", NULL);
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "quoted-printable", "\n", NULL);
@@
-1580,7
+1555,7
@@
build_headers(CT ct)
case CE_BASE64:
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
case CE_BASE64:
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
- adios(NULL, "internal error, invalid encoding");
+ adios(EX_DATAERR, NULL, "internal error, invalid encoding");
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "base64", "\n", NULL);
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "base64", "\n", NULL);
@@
-1589,7
+1564,7
@@
build_headers(CT ct)
case CE_BINARY:
if (ct->c_type == CT_MESSAGE)
case CE_BINARY:
if (ct->c_type == CT_MESSAGE)
- adios(NULL, "internal error, invalid encoding");
+ adios(EX_DATAERR, NULL, "internal error, invalid encoding");
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "binary", "\n", NULL);
np = getcpy(ENCODING_FIELD);
vp = concat(" ", "binary", "\n", NULL);
@@
-1597,7
+1572,7
@@
build_headers(CT ct)
break;
default:
break;
default:
- adios(NULL, "unknown transfer encoding in content");
+ adios(EX_DATAERR, NULL, "unknown transfer encoding in content");
break;
}
break;
}