X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/513587ec31160434400bb003d7160777e2db6bb6..f1920d78123667716f2321d37ce37628603b2700:/uip/mhfixmsg.c diff --git a/uip/mhfixmsg.c b/uip/mhfixmsg.c index 2dd3ef20..65abd513 100644 --- a/uip/mhfixmsg.c +++ b/uip/mhfixmsg.c @@ -119,6 +119,7 @@ static int strip_crs (CT, int *); static int convert_charsets (CT, char *, int *); static int fix_always (CT, int *); static int write_content (CT, char *, char *, int, int); +static void set_text_ctparams(CT, char *, int); static int remove_file (char *); static void report (char *, char *, char *, char *, ...); static void pipeser (int); @@ -142,7 +143,7 @@ main (int argc, char **argv) { fx.fixtypes = NULL; fx.replacetextplain = 0; fx.decodetext = CE_8BIT; - fx.decodetypes = "text"; /* Default to all text content. */ + fx.decodetypes = "text,application/ics"; /* Default, per man page. */ fx.lf_line_endings = 0; fx.textcharset = NULL; @@ -346,15 +347,7 @@ main (int argc, char **argv) { ctp = cts; if ((ct = parse_mime (file))) { - if (ct->c_type == CT_TEXT) { - /* parse_mime() does not set lf_line_endings in struct text, so set it here. */ - if (ct->c_ctparams == NULL) { - if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) { - adios (NULL, "out of memory"); - } - } - ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings; - } + set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings); *ctp++ = ct; } } else { @@ -398,16 +391,7 @@ main (int argc, char **argv) { msgnam = m_name (msgnum); if ((ct = parse_mime (msgnam))) { - if (ct->c_type == CT_TEXT) { - /* parse_mime() does not set lf_line_endings in struct text, so set it here. */ - if (ct->c_ctparams == NULL) { - if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == - NULL) { - adios (NULL, "out of memory"); - } - } - ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings; - } + set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings); *ctp++ = ct; } } @@ -599,7 +583,16 @@ fix_boundary (CT *ct, int *message_mods) { } free (part_boundary); + } else { + /* Couldn't fix the boundary. Report failure so that mhfixmsg + doesn't modify the message. */ + status = NOTOK; } + } else { + /* No multipart struct, even though the content type is + CT_MULTIPART. Report failure so that mhfixmsg doesn't modify + the message. */ + status = NOTOK; } } @@ -1792,15 +1785,37 @@ set_ct_type (CT ct, int type, int subtype, int encoding) { static int decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mods) { int status = OK; + int lf_line_endings = 0; switch (ct->c_type) { - case CT_TEXT: { - struct text *const text_content_info = (struct text *) ct->c_ctparams; + case CT_MULTIPART: { + struct multipart *m = (struct multipart *) ct->c_ctparams; + struct part *part; + + /* Should check to see if the body for this part is encoded? + For now, it gets passed along as-is by InitMultiPart(). */ + for (part = m->mp_parts; status == OK && part; part = part->mp_next) { + status = decode_text_parts (part->mp_part, encoding, decodetypes, message_mods); + } + break; + } + + case CT_MESSAGE: + if (ct->c_subtype == MESSAGE_EXTERNAL) { + struct exbody *e = (struct exbody *) ct->c_ctparams; + status = decode_text_parts (e->eb_content, encoding, decodetypes, message_mods); + } + break; + + default: if (! should_decode(decodetypes, ct->c_ctinfo.ci_type, ct->c_ctinfo.ci_subtype)) { break; } + lf_line_endings = + ct->c_ctparams && ((struct text *) ct->c_ctparams)->lf_line_endings; + switch (ct->c_encoding) { case CE_BASE64: case CE_QUOTED: { @@ -1852,7 +1867,7 @@ decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mo report (NULL, ct->c_partno, ct->c_file, "decode%s", ct->c_ctline ? ct->c_ctline : ""); } - if (text_content_info && text_content_info->lf_line_endings) { + if (lf_line_endings) { strip_crs (ct, message_mods); } } else { @@ -1866,7 +1881,7 @@ decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mo } case CE_8BIT: case CE_7BIT: - if (text_content_info && text_content_info->lf_line_endings) { + if (lf_line_endings) { strip_crs (ct, message_mods); } break; @@ -1877,30 +1892,6 @@ decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mo break; } - case CT_MULTIPART: { - struct multipart *m = (struct multipart *) ct->c_ctparams; - struct part *part; - - /* Should check to see if the body for this part is encoded? - For now, it gets passed along as-is by InitMultiPart(). */ - for (part = m->mp_parts; status == OK && part; part = part->mp_next) { - status = decode_text_parts (part->mp_part, encoding, decodetypes, message_mods); - } - break; - } - - case CT_MESSAGE: - if (ct->c_subtype == MESSAGE_EXTERNAL) { - struct exbody *e = (struct exbody *) ct->c_ctparams; - - status = decode_text_parts (e->eb_content, encoding, decodetypes, message_mods); - } - break; - - default: - break; - } - return status; } @@ -2357,6 +2348,44 @@ write_content (CT ct, char *input_filename, char *outfile, int modify_inplace, } +/* + * parse_mime() does not set lf_line_endings in struct text, so use this function to do it. + * It touches the parts the decodetypes identifies. + */ +static void +set_text_ctparams(CT ct, char *decodetypes, int lf_line_endings) { + switch (ct->c_type) { + case CT_MULTIPART: { + struct multipart *m = (struct multipart *) ct->c_ctparams; + struct part *part; + + for (part = m->mp_parts; part; part = part->mp_next) { + set_text_ctparams(part->mp_part, decodetypes, lf_line_endings); + } + break; + } + + case CT_MESSAGE: + if (ct->c_subtype == MESSAGE_EXTERNAL) { + struct exbody *e = (struct exbody *) ct->c_ctparams; + + set_text_ctparams(e->eb_content, decodetypes, lf_line_endings); + } + break; + + default: + if (should_decode(decodetypes, ct->c_ctinfo.ci_type, ct->c_ctinfo.ci_subtype)) { + if (ct->c_ctparams == NULL) { + if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) { + adios (NULL, "out of memory"); + } + } + ((struct text *) ct->c_ctparams)->lf_line_endings = lf_line_endings; + } + } +} + + /* * If "rmmproc" is defined, call that to remove the file. Otherwise, * use the standard MH backup file.