X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fmhparse.c;h=2b72e7bc277cbd7e34f2569ddf7cf166d23b38d0;hb=d39fe43959fda0efb9ae681672ea8e476f1848e1;hp=b0876eb9dfacc097c6ee8ff2b495ab3690f53de3;hpb=9a990c3302e6bf6c5c313541cbc1cbcea16dcb4d;p=mmh diff --git a/uip/mhparse.c b/uip/mhparse.c index b0876eb..2b72e7b 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -234,6 +234,7 @@ get_content(FILE *in, char *file, int toplevel) enum state state; struct field f = {{0}}; int compnum; + char *buf; CT ct; HF hp; @@ -254,10 +255,22 @@ get_content(FILE *in, char *file, int toplevel) state = FLD2; /* FALL */ case FLD2: + if (compnum == 1) { + ct->crlf = f.value[f.valuelen-2] == '\r'; + } compnum++; + /* decode rfc2047 */ + buf = mh_xcalloc(sizeof(char *), f.valuelen); + if (!decode_rfc2047(f.value, buf, f.valuelen)) { + mh_free0(&buf); + buf = mh_xstrdup(f.value); + } + /* add the header data to the list */ - add_header(ct, mh_xstrdup(f.name), mh_xstrdup(f.value)); + add_header(ct, mh_xstrdup(f.name), buf); + + buf = NULL; ct->c_begin = ftell(in) + 1; continue; @@ -1025,7 +1038,7 @@ InitMultiPart(CT ct) */ if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { - admonish(NULL, "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); ct->c_encoding = CE_7BIT; } @@ -1072,8 +1085,14 @@ InitMultiPart(CT ct) *++dp = '\0'; /* record boundary separators */ - m->mp_start = concat(bp, "\n", NULL); - m->mp_stop = concat(bp, "--\n", NULL); + if (!ct->crlf) { + m->mp_start = concat(bp, "\n", NULL); + m->mp_stop = concat(bp, "--\n", NULL); + } else { + m->mp_start = concat(bp, "\r\n", NULL); + m->mp_stop = concat(bp, "--\r\n", NULL); + } + if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { advise(ct->c_file, "unable to open for reading"); @@ -1243,9 +1262,9 @@ InitMessage(CT ct) struct k2v *kv; CI ci = &ct->c_ctinfo; - if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT)) { - admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit or 8bit", ci->ci_type, ci->ci_subtype, ct->c_file); - return NOTOK; + if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT) && (ct->c_encoding != CE_BINARY)) { + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + ct->c_encoding = CE_7BIT; } /* check for missing subtype */