X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/859d1e1a78f6c61a062bfb534652f5ce3ffb672f..58eaf2c2:/uip/mhoutsbr.c?ds=sidebyside diff --git a/uip/mhoutsbr.c b/uip/mhoutsbr.c index 4845f7e1..b672de77 100644 --- a/uip/mhoutsbr.c +++ b/uip/mhoutsbr.c @@ -12,8 +12,6 @@ #include #include #include -#include -#include #include #include #include @@ -83,14 +81,10 @@ output_content (CT ct, FILE *out) { int result = 0; CI ci = &ct->c_ctinfo; - char *boundary = ci->ci_values[0], **ap, **vp; + char *boundary = "", *cp; - for (ap = ci->ci_attrs, vp = ci->ci_values; *ap; ++ap, ++vp) { - if (! mh_strcasecmp ("boundary", *ap)) { - boundary = *vp; - break; - } - } + if ((cp = get_param(ci->ci_first_pm, "boundary", '-', 0))) + boundary = cp; /* * Output all header fields for this content @@ -102,8 +96,11 @@ output_content (CT ct, FILE *out) * "message/external", then we are done with the * headers (since it has no body). */ - if (ct->c_ctexbody) + if (ct->c_ctexbody) { + if (boundary && *boundary != '\0') + free(boundary); return OK; + } /* * Now output the content bodies. @@ -127,8 +124,11 @@ output_content (CT ct, FILE *out) CT p = part->mp_part; fprintf (out, "\n--%s\n", boundary); - if (output_content (p, out) == NOTOK) + if (output_content (p, out) == NOTOK) { + if (boundary && *boundary != '\0') + free(boundary); return NOTOK; + } } fprintf (out, "\n--%s--\n", boundary); @@ -165,7 +165,7 @@ output_content (CT ct, FILE *out) body, don't emit the newline that would appear between the headers and body. In that case, the call to write8Bit() shouldn't be needed, but is harmless. */ - if (ct->c_ctinfo.ci_attrs[0] != NULL || + if (ct->c_ctinfo.ci_first_pm != NULL || ct->c_begin != ct->c_end) { putc ('\n', out); } @@ -200,6 +200,9 @@ output_content (CT ct, FILE *out) break; } + if (boundary && *boundary != '\0') + free(boundary); + return result; } @@ -228,7 +231,7 @@ output_headers (CT ct, FILE *out) static int writeExternalBody (CT ct, FILE *out) { - char **ap, **ep, *cp; + char *cp, *dp; struct exbody *e = (struct exbody *) ct->c_ctparams; putc ('\n', out); @@ -240,7 +243,7 @@ writeExternalBody (CT ct, FILE *out) switch (*++cp) { case 'I': if (ct2->c_id) { - char *dp = trimcpy (ct2->c_id); + dp = trimcpy (ct2->c_id); fputs (dp, out); free (dp); @@ -248,17 +251,22 @@ writeExternalBody (CT ct, FILE *out) continue; case 'N': - for (ap = ci2->ci_attrs, ep = ci2->ci_values; *ap; ap++, ep++) - if (!mh_strcasecmp (*ap, "name")) { - fprintf (out, "%s", *ep); - break; - } + dp = get_param(ci2->ci_first_pm, "name", '_', 0); + if (dp) { + fputs (dp, out); + free (dp); + } continue; case 'T': fprintf (out, "%s/%s", ci2->ci_type, ci2->ci_subtype); - for (ap = ci2->ci_attrs, ep = ci2->ci_values; *ap; ap++, ep++) - fprintf (out, "; %s=\"%s\"", *ap, *ep); + dp = output_params(strlen(ci2->ci_type) + + strlen(ci2->ci_subtype) + 1, + ci2->ci_first_pm, NULL, 0); + if (dp) { + fputs (dp, out); + free (dp); + } continue; case 'n': @@ -328,27 +336,35 @@ writeQuoted (CT ct, FILE *out) { int fd; char *cp, *file; - char c, buffer[BUFSIZ]; + char c = '\0'; CE ce = &ct->c_cefile; + int n = 0; + char *bufp = NULL; + size_t buflen; + ssize_t gotlen; file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; - while (fgets (buffer, sizeof(buffer) - 1, ce->ce_fp)) { - int n; + while ((gotlen = getline(&bufp, &buflen, ce->ce_fp)) != -1) { - cp = buffer + strlen (buffer) - 1; + cp = bufp + gotlen - 1; if ((c = *cp) == '\n') - *cp = '\0'; - - if (strncmp (cp = buffer, "From ", sizeof("From ") - 1) == 0) { - fprintf (out, "=%02X", *cp++ & 0xff); - n = 3; - } else { - n = 0; + gotlen--; + + /* + * if the line starts with "From ", encode the 'F' so it + * doesn't falsely match an mbox delimiter. + */ + cp = bufp; + if (gotlen >= 5 && strncmp (cp, "From ", 5) == 0) { + fprintf (out, "=%02X", 'F'); + cp++; + n += 3; } - for (; *cp; cp++) { + + for (; cp < bufp + gotlen; cp++) { if (n > CPERLIN - 3) { fputs ("=\n", out); n = 0; @@ -377,15 +393,17 @@ three_print: } if (c == '\n') { - if (cp > buffer && (*--cp == ' ' || *cp == '\t')) + if (cp > bufp && (*--cp == ' ' || *cp == '\t')) fputs ("=\n", out); putc ('\n', out); - } else { - fputs ("=\n", out); + n = 0; } } + if (c != '\n') + putc ('\n', out); + (*ct->c_ceclosefnx) (ct); return OK; } @@ -406,7 +424,7 @@ writeBase64ct (CT ct, FILE *out) if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; - result = writeBase64aux (ce->ce_fp, out); + result = writeBase64aux (ce->ce_fp, out, (ct->c_type == CT_TEXT)); (*ct->c_ceclosefnx) (ct); return result; }