extern int skip_mp_cte_check; /* flag to InitMultiPart */
extern int suppress_bogus_mp_content_warning; /* flag to InitMultiPart */
extern int bogus_mp_content; /* flag from InitMultiPart */
-void reverse_parts (CT);
/* mhoutsbr.c */
int output_message (CT, char *);
} fix_transformations;
int mhfixmsgsbr (CT *, const fix_transformations *, char *);
-static void reverse_alternative_parts (CT);
static int fix_boundary (CT *, int *);
static int get_multipart_boundary (CT, char **);
static int replace_boundary (CT, char *, char *);
}
}
- if (! (cts = (CT *) calloc ((size_t) 2, sizeof *cts)))
+ if (! (cts = (CT *) mh_xcalloc ((size_t) 2, sizeof *cts))) {
adios (NULL, "out of memory");
+ }
ctp = cts;
- if ((ct = parse_mime (file))) *ctp++ = ct;
+ if ((ct = parse_mime (file))) { *ctp++ = ct; }
} else {
/*
* message(s) are coming from a folder
done (1);
seq_setprev (mp); /* set the previous-sequence */
- if (! (cts = (CT *) calloc ((size_t) (mp->numsel + 1), sizeof *cts)))
+ if (! (cts =
+ (CT *) mh_xcalloc ((size_t) (mp->numsel + 1), sizeof *cts))) {
adios (NULL, "out of memory");
+ }
ctp = cts;
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
char *msgnam;
msgnam = m_name (msgnum);
- if ((ct = parse_mime (msgnam))) *ctp++ = ct;
+ if ((ct = parse_mime (msgnam))) { *ctp++ = ct; }
}
}
}
if (modify_inplace) {
- if (status != OK) (void) m_unlink (outfile);
+ if (status != OK) { (void) m_unlink (outfile); }
free (outfile);
outfile = NULL;
}
}
-/* parse_mime() arranges alternates in reverse (priority) order, so
- reverse them back. This will put a text/plain part at the front of
- a multipart/alternative part, for example, where it belongs. */
-static void
-reverse_alternative_parts (CT ct) {
- if (ct->c_type == CT_MULTIPART) {
- struct multipart *m = (struct multipart *) ct->c_ctparams;
- struct part *part;
-
- if (ct->c_subtype == MULTI_ALTERNATE) {
- reverse_parts (ct);
- }
-
- /* And call recursively on each part of a multipart. */
- for (part = m->mp_parts; part; part = part->mp_next) {
- reverse_alternative_parts (part->mp_part);
- }
- }
-}
-
-
static int
fix_boundary (CT *ct, int *message_mods) {
struct multipart *mp;
if ((fixed = m_mktemp2 (NULL, invo_name, NULL, &(*ct)->c_fp))) {
if (replace_boundary (*ct, fixed, part_boundary) == OK) {
char *filename = add ((*ct)->c_file, NULL);
+ CT fixed_ct;
free_content (*ct);
- if ((*ct = parse_mime (fixed))) {
+ if ((fixed_ct = parse_mime (fixed))) {
+ *ct = fixed_ct;
(*ct)->c_unlink = 1;
++*message_mods;
report (NULL, NULL, filename,
"fix multipart boundary");
}
+ } else {
+ advise (NULL, "unable to parse fixed part");
+ status = NOTOK;
}
free (filename);
} else {
case BODY:
fputs ("\n", fpout);
/* buf will have a terminating NULL, skip it. */
- fwrite (buf, 1, bufsz-1, fpout);
+ if ((int) fwrite (buf, 1, bufsz-1, fpout) < bufsz-1) {
+ advise (file, "fwrite");
+ }
continue;
case FILEEOF:
int has_text_plain = 0;
/* Nothing to do for text/plain. */
- if ((*ct)->c_subtype == TEXT_PLAIN) return OK;
+ if ((*ct)->c_subtype == TEXT_PLAIN) { return OK; }
if (parent && parent->c_type == CT_MULTIPART &&
parent->c_subtype == MULTI_ALTERNATE) {
case CT_MESSAGE:
if ((*ct)->c_subtype == MESSAGE_EXTERNAL) {
- struct exbody *e;
+ struct exbody *e = (struct exbody *) (*ct)->c_ctparams;
- e = (struct exbody *) (*ct)->c_ctparams;
status = ensure_text_plain (&e->eb_content, *ct, message_mods,
replacetextplain);
}
divide_part (CT ct) {
CT new_part;
- if ((new_part = (CT) calloc (1, sizeof *new_part)) == NULL)
+ if ((new_part = (CT) mh_xcalloc (1, sizeof *new_part)) == NULL)
adios (NULL, "out of memory");
/* Just copy over what is needed for decoding. c_vrsn and
Could show_multi() in mhshowsbr.c avoid this? */
/* Check for invo_name-format-type/subtype. */
- cp = concat (invo_name, "-format-", type, "/", subtype, NULL);
- if ((cf = context_find (cp)) && *cf != '\0') {
+ if ((cf = context_find_by_type ("format", type, subtype)) == NULL) {
+ if (verbosw) {
+ advise (NULL, "Don't know how to convert %s, there is no "
+ "%s-format-%s/%s profile entry",
+ ct->c_file, invo_name, type, subtype);
+ }
+ return NOTOK;
+ } else {
if (strchr (cf, '>')) {
- free (cp);
advise (NULL, "'>' prohibited in \"%s\",\nplease fix your "
"%s-format-%s/%s profile entry", cf, invo_name, type,
- subtype);
- return NOTOK;
- }
- } else {
- free (cp);
-
- /* Check for invo_name-format-type. */
- cp = concat (invo_name, "-format-", type, NULL);
- if (! (cf = context_find (cp)) || *cf == '\0') {
- free (cp);
- if (verbosw) {
- advise (NULL, "Don't know how to convert %s, there is no "
- "%s-format-%s/%s profile entry",
- ct->c_file, invo_name, type, subtype);
- }
- return NOTOK;
- }
+ subtype ? subtype : "");
- if (strchr (cf, '>')) {
- free (cp);
- advise (NULL, "'>' prohibited in \"%s\"", cf);
return NOTOK;
}
}
- free (cp);
cp = concat (cf, " >", file, NULL);
status = show_content_aux (ct, 0, cp, NULL, NULL);
/* Identifies 7bit or 8bit content based on charset. */
static int
charset_encoding (CT ct) {
- int encoding =
- strcasecmp (content_charset (ct), "US-ASCII") ? CE_8BIT : CE_7BIT;
+ char *ct_charset = content_charset (ct);
+ int encoding = strcasecmp (ct_charset, "US-ASCII") ? CE_8BIT : CE_7BIT;
+
+ free (ct_charset);
return encoding;
}
struct multipart *m;
const struct str2init *ctinit;
- if ((ct = (CT) calloc (1, sizeof *ct)) == NULL)
+ if ((ct = (CT) mh_xcalloc (1, sizeof *ct)) == NULL)
adios (NULL, "out of memory");
/* Set up the multipart/alternative part. These fields of *ct were
- initialized to 0 by calloc():
+ initialized to 0 by mh_xcalloc():
c_fp, c_unlink, c_begin, c_end,
c_vrsn, c_ctline, c_celine,
c_id, c_descr, c_dispo, c_partno,
p->mp_next->mp_next = NULL;
p->mp_next->mp_part = first_alt;
- if ((m = (struct multipart *) calloc (1, sizeof (struct multipart))) ==
+ if ((m = (struct multipart *) mh_xcalloc (1, sizeof (struct multipart))) ==
NULL)
adios (NULL, "out of memory");
m->mp_start = concat (boundary, "\n", NULL);
m->mp_stop = concat (boundary, "--\n", NULL);
m->mp_parts = p;
- ct->c_ctparams = (void *) m;
+ ct->c_ctparams = m;
free (boundary);
case CT_MESSAGE:
if (ct->c_subtype == MESSAGE_EXTERNAL) {
- struct exbody *e;
+ struct exbody *e = (struct exbody *) ct->c_ctparams;
- e = (struct exbody *) ct->c_ctparams;
status = decode_text_parts (e->eb_content, encoding, message_mods);
}
break;
size_t i;
int last_char_was_cr = 0;
- if (end > 0) bytes_to_read -= bytes_read;
+ if (end > 0) { bytes_to_read -= bytes_read; }
for (i = 0, cp = buffer; i < bytes_read; ++i, ++cp) {
if (*cp == '\n' && last_char_was_cr) {
if (*cp == '\r') {
last_char_was_cr = 1;
} else if (last_char_was_cr) {
- if (*cp != '\n') write (fd, "\r", 1);
- write (fd, cp, 1);
+ if (*cp != '\n') {
+ if (write (fd, "\r", 1) < 0) {
+ advise (tempfile, "CR write");
+ }
+ }
+ if (write (fd, cp, 1) < 0) {
+ advise (tempfile, "write");
+ }
last_char_was_cr = 0;
} else {
- write (fd, cp, 1);
+ if (write (fd, cp, 1) < 0) {
+ advise (tempfile, "write");
+ }
last_char_was_cr = 0;
}
}
}
}
+ free (charset);
+
return status;
}
status = convert_charset (ct, dest_charset, message_mods);
if (status == OK) {
if (verbosw) {
+ char *ct_charset = content_charset (ct);
+
report (NULL, ct->c_partno, ct->c_file,
- "convert %s to %s",
- content_charset(ct), dest_charset);
+ "convert %s to %s", ct_charset, dest_charset);
+ free (ct_charset);
}
} else {
+ char *ct_charset = content_charset (ct);
+
report ("iconv", ct->c_partno, ct->c_file,
- "failed to convert %s to %s",
- content_charset(ct), dest_charset);
+ "failed to convert %s to %s", ct_charset, dest_charset);
+ free (ct_charset);
}
}
break;
case CT_MESSAGE:
if (ct->c_subtype == MESSAGE_EXTERNAL) {
- struct exbody *e;
+ struct exbody *e = (struct exbody *) ct->c_ctparams;
- e = (struct exbody *) ct->c_ctparams;
status =
convert_charsets (e->eb_content, dest_charset, message_mods);
}
}
}
}
- if (new != -1) close (new);
- if (old != -1) close (old);
+ if (new != -1) { close (new); }
+ if (old != -1) { close (old); }
(void) m_unlink (outfile);
if (i < 0) {