-
-/*
- * 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
#include <h/mh.h>
#include <fcntl.h>
+#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
*/
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.
* headers (since it has no body).
*/
if (ct->c_ctexbody) {
- if (boundary && *boundary != '\0')
+ if (*boundary != '\0')
free(boundary);
return OK;
}
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) {
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;
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);
}
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;
* 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;
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;
}