mhl and mhbuild ignore to long lines
[mmh] / uip / mhparse.c
index 8e8b360..2b72e7b 100644 (file)
@@ -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;
@@ -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");