#include <h/mh.h>
#include <fcntl.h>
-#include <h/signals.h>
#include <h/md5.h>
#include <h/mts.h>
#include <h/tws.h>
CI ci = &ct->c_ctinfo;
char *boundary = "", *cp;
- if ((cp = get_param(ci->ci_first_pm, "boundary, '-', 0)))
+ if ((cp = get_param(ci->ci_first_pm, "boundary", '-', 0)))
boundary = cp;
- }
/*
* Output all header fields for this content
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);
}
static int
writeExternalBody (CT ct, FILE *out)
{
- char *cp;
+ char *cp, *dp;
struct exbody *e = (struct exbody *) ct->c_ctparams;
putc ('\n', 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);
continue;
case 'N':
- for (pm = ci2->ci_first_pm; pm; pm = pm->pm_next)
- if (!strcasecmp (pm->pm_name, "name")) {
- fprintf (out, "%s", pm->pm_value);
- 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 (pm = ci2->ci_first_pm; pm; pm = pm->pm_next)
- fprintf (out, "; %s=\"%s\"", pm->pm_name, pm->pm_value);
+ 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':
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);
{
int fd;
char *cp, *file;
- char c = '\0', 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)) {
+ 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);
+ 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;
}
if (c == '\n') {
- if (cp > buffer && (*--cp == ' ' || *cp == '\t'))
+ if (cp > bufp && (*--cp == ' ' || *cp == '\t'))
fputs ("=\n", out);
putc ('\n', out);
putc ('\n', out);
(*ct->c_ceclosefnx) (ct);
+ free (bufp);
return OK;
}
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;
}