X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/0860f098b5a13f4e8bedb2d2da9d2df94717b4a5..0b7286788a95dd854d1826b8493eda431d8e8aac:/uip/mhoutsbr.c diff --git a/uip/mhoutsbr.c b/uip/mhoutsbr.c index b672de77..0f2b9eb3 100644 --- a/uip/mhoutsbr.c +++ b/uip/mhoutsbr.c @@ -1,6 +1,4 @@ - -/* - * mhoutsbr.c -- routines to output MIME messages +/* mhoutsbr.c -- routines to output MIME messages * -- given a Content structure * * This code is Copyright (c) 2002, by the authors of nmh. See the @@ -8,21 +6,18 @@ * complete copyright information. */ -#include +#include "h/mh.h" +#include "sbr/error.h" #include -#include -#include -#include -#include -#include -#include - +#include "h/utils.h" +#include "h/md5.h" +#include "h/mts.h" +#include "h/tws.h" +#include "h/mime.h" +#include "h/mhparse.h" +#include "mhoutsbr.h" +#include "sbr/base64.h" -/* - * prototypes - */ -int output_message (CT, char *); -int output_message_fp (CT, FILE *, char *); /* * static prototypes @@ -54,23 +49,6 @@ output_message_fp (CT ct, FILE *fp, char *file) return OK; } -int -output_message (CT ct, char *file) -{ - FILE *fp; - int status; - - if (! strcmp (file, "-")) { - fp = stdout; - } else if ((fp = fopen (file, "w")) == NULL) { - advise (file, "unable to open for writing"); - return NOTOK; - } - status = output_message_fp(ct, fp, file); - if (strcmp (file, "-")) fclose(fp); - return status; -} - /* * Output a Content structure to a file. @@ -97,7 +75,7 @@ output_content (CT ct, FILE *out) * headers (since it has no body). */ if (ct->c_ctexbody) { - if (boundary && *boundary != '\0') + if (*boundary != '\0') free(boundary); return OK; } @@ -117,7 +95,7 @@ output_content (CT ct, FILE *out) m = (struct multipart *) ct->c_ctparams; if (m->mp_content_before) { - fprintf (out, "%s", m->mp_content_before); + fputs(m->mp_content_before, out); } for (part = m->mp_parts; part; part = part->mp_next) { @@ -125,15 +103,15 @@ output_content (CT ct, FILE *out) fprintf (out, "\n--%s\n", boundary); if (output_content (p, out) == NOTOK) { - if (boundary && *boundary != '\0') + if (*boundary != '\0') free(boundary); - return NOTOK; + return NOTOK; } } fprintf (out, "\n--%s--\n", boundary); if (m->mp_content_after) { - fprintf (out, "%s", m->mp_content_after); + fputs(m->mp_content_after, out); } } break; @@ -165,7 +143,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_first_pm != NULL || + if (ct->c_ctinfo.ci_first_pm != NULL || ct->c_begin == 0 || ct->c_begin != ct->c_end) { putc ('\n', out); } @@ -188,19 +166,25 @@ output_content (CT ct, FILE *out) break; case CE_BINARY: - advise (NULL, "can't handle binary transfer encoding in content"); - result = NOTOK; + if (ct->c_type == CT_TEXT) { + /* So that mhfixmsg can decode to binary text. */ + putc ('\n', out); + result = write8Bit (ct, out); + } else { + inform("can't handle binary transfer encoding in content"); + result = NOTOK; + } break; default: - advise (NULL, "unknown transfer encoding in content"); + inform("unknown transfer encoding in content"); result = NOTOK; break; } break; } - if (boundary && *boundary != '\0') + if (*boundary != '\0') free(boundary); return result; @@ -317,7 +301,9 @@ write8Bit (CT ct, FILE *out) c = '\n'; while ((inbytes = fread (buffer, 1, sizeof buffer, ce->ce_fp)) > 0) { c = buffer[inbytes - 1]; - fwrite (buffer, 1, inbytes, out); + if (fwrite (buffer, 1, inbytes, out) < inbytes) { + advise ("write8Bit", "fwrite"); + } } if (c != '\n') putc ('\n', out); @@ -358,7 +344,7 @@ writeQuoted (CT ct, FILE *out) * doesn't falsely match an mbox delimiter. */ cp = bufp; - if (gotlen >= 5 && strncmp (cp, "From ", 5) == 0) { + if (gotlen >= 5 && has_prefix(cp, "From ")) { fprintf (out, "=%02X", 'F'); cp++; n += 3; @@ -405,6 +391,7 @@ three_print: putc ('\n', out); (*ct->c_ceclosefnx) (ct); + free (bufp); return OK; } @@ -424,7 +411,10 @@ writeBase64ct (CT ct, FILE *out) if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; - result = writeBase64aux (ce->ce_fp, out, (ct->c_type == CT_TEXT)); + result = writeBase64aux (ce->ce_fp, out, + ct->c_type == CT_TEXT && ct->c_ctparams + ? ((struct text *) ct->c_ctparams)->lf_line_endings == 0 + : 0); (*ct->c_ceclosefnx) (ct); return result; }