fclose(in);
free (ct);
return NULL;
- } else {
- adios (NULL, "draft shouldn't contain %s: field", name);
}
+ adios (NULL, "draft shouldn't contain %s: field", name);
}
/* ignore any Content-Type fields in the header */
}
/* get copies of the buffers */
- np = add (name, NULL);
- vp = add (buf, NULL);
+ np = mh_xstrdup(name);
+ vp = mh_xstrdup(buf);
/* if necessary, get rest of field */
while (state == FLDPLUS) {
}
NEW(entry);
- entry->filename = getcpy(s);
+ entry->filename = mh_xstrdup(s);
entry->next = NULL;
free(vp);
adios (NULL, "Multiple %s headers with different files"
" not allowed", type);
} else {
- convert->filename = getcpy (filename);
+ convert->filename = mh_xstrdup(filename);
}
} else {
NEW0(convert);
- convert->filename = getcpy (filename);
- convert->type = getcpy (type);
+ convert->filename = mh_xstrdup(filename);
+ convert->type = mh_xstrdup(type);
if (convert_tail) {
convert_tail->next = convert;
adios (NULL, "Multiple %s headers with different "
"argstrings not allowed", type);
} else {
- convert->argstring = getcpy (argstring);
+ convert->argstring = mh_xstrdup(argstring);
}
} else {
NEW0(convert);
- convert->type = getcpy (type);
- convert->argstring = getcpy (argstring);
+ convert->type = mh_xstrdup(type);
+ convert->argstring = mh_xstrdup(argstring);
if (convert_tail) {
convert_tail->next = convert;
*/
if (! dist) {
- np = add (VRSN_FIELD, NULL);
+ np = mh_xstrdup(VRSN_FIELD);
vp = concat (" ", VRSN_VALUE, "\n", NULL);
add_header (ct, np, vp);
}
if ((cp = strchr(prefix, 'a')) == NULL)
adios (NULL, "internal error(4)");
+ /*
+ * If using EAI, force 8-bit charset.
+ */
+ if (header_encoding == CE_8BIT) {
+ set_charset (ct, 1);
+ }
+
/*
* Scan the contents. Choose a transfer encoding, and
* check if prefix for multipart boundary clashes with
fgetstr (char *s, int n, FILE *stream)
{
char *cp, *ep;
- int o_n = n;
+ ep = s + n;
while(1) {
- for (ep = (cp = s) + o_n; cp < ep; ) {
- int i;
+ for (cp = s; cp < ep;) {
+ int len;
if (!fgets (cp, n, stream))
- return (cp != s ? s : NULL);
+ return cp == s ? NULL : s; /* "\\\nEOF" ignored. */
- if (cp == s && *cp != '#')
- return s;
+ if (! do_direct() || (cp == s && *cp != '#'))
+ return s; /* Plaintext line. */
- cp += (i = strlen (cp)) - 1;
- if (i <= 1 || *cp-- != '\n' || *cp != '\\')
+ len = strlen(cp);
+ if (len <= 1)
+ break; /* Can't contain "\\\n". */
+ cp += len - 1; /* Just before NUL. */
+ if (*cp-- != '\n' || *cp != '\\')
break;
- *cp = '\0';
- n -= (i - 2);
+ *cp = '\0'; /* Erase the trailing "\\\n". */
+ n -= (len - 2);
}
if (strcmp(s, "#on\n") == 0) {
} else if (strcmp(s, "#pop\n") == 0) {
directive_pop();
} else {
- break;
+ return s;
}
}
-
- return s;
}
}
/* use a temp file to collect the plain text lines */
- ce->ce_file = add (cp, NULL);
+ ce->ce_file = mh_xstrdup(cp);
ce->ce_unlink = 1;
if (do_direct() && (buf[0] == '#' && buf[1] == '<')) {
strncpy (content, buf + 2, sizeof(content));
inlineD = 1;
goto rock_and_roll;
- } else {
- inlineD = 0;
}
+ inlineD = 0;
/* the directive is implicit */
strncpy (content, "text/plain", sizeof(content));
continue;
if (!*cp)
adios (NULL, "empty pipe command for #%s directive", ci->ci_type);
- cp = add (cp, NULL);
+ cp = mh_xstrdup(cp);
free (ci->ci_magic);
ci->ci_magic = cp;
} else {
content_error (NULL, ct, "don't know how to compose content");
done (1);
}
- ci->ci_magic = add (cp, NULL);
+ ci->ci_magic = mh_xstrdup(cp);
return OK;
}
p->c_subtype = MESSAGE_RFC822;
snprintf (buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum);
- pe->ce_file = add (buffer, NULL);
+ pe->ce_file = mh_xstrdup(buffer);
if (listsw && stat (pe->ce_file, &st) != NOTOK)
p->c_end = (long) st.st_size;
msgnum = mp->lowsel;
snprintf (buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum);
- ce->ce_file = add (buffer, NULL);
+ ce->ce_file = mh_xstrdup(buffer);
if (listsw && stat (ce->ce_file, &st) != NOTOK)
ct->c_end = (long) st.st_size;
}
time (&clock);
snprintf (contentid, sizeof(contentid), "%s\n", message_id (clock, 1));
partno = 0;
- msgfmt = getcpy(contentid);
+ msgfmt = mh_xstrdup(contentid);
}
snprintf (contentid, sizeof(contentid), msgfmt, top ? 0 : ++partno);
- ct->c_id = getcpy (contentid);
+ ct->c_id = mh_xstrdup(contentid);
}
CT p = part->mp_part;
sprintf (pp, "%d", partnum);
- p->c_partno = add (partnam, NULL);
+ p->c_partno = mh_xstrdup(partnam);
if (compose_content (p, verbose) == NOTOK)
return NOTOK;
}
adios("mhbuildsbr", "unable to create temporary file in %s",
get_temp_dir());
}
- ce->ce_file = add (tfile, NULL);
+ ce->ce_file = mh_xstrdup(tfile);
ce->ce_unlink = 1;
xstdout = 0;
/*
* output the content type and subtype
*/
- np = add (TYPE_FIELD, NULL);
+ np = mh_xstrdup(TYPE_FIELD);
vp = concat (" ", ci->ci_type, "/", ci->ci_subtype, NULL);
/* keep track of length of line */
* output the Content-ID, unless disabled by -nocontentid
*/
if (contentidsw && ct->c_id) {
- np = add (ID_FIELD, NULL);
+ np = mh_xstrdup(ID_FIELD);
vp = concat (" ", ct->c_id, NULL);
add_header (ct, np, vp);
}
* output the Content-Description
*/
if (ct->c_descr) {
- np = add (DESCR_FIELD, NULL);
+ np = mh_xstrdup(DESCR_FIELD);
vp = concat (" ", ct->c_descr, NULL);
if (header_encoding != CE_8BIT) {
if (encode_rfc2047(DESCR_FIELD, &vp, header_encoding, NULL)) {
* set, then we need to build it.
*/
if (ct->c_dispo) {
- np = add (DISPO_FIELD, NULL);
+ np = mh_xstrdup(DISPO_FIELD);
vp = concat (" ", ct->c_dispo, NULL);
add_header (ct, np, vp);
} else if (ct->c_dispo_type) {
np = output_params(len, ct->c_dispo_first, NULL, 0);
vp = add(np, vp);
vp = add("\n", vp);
- if (np)
- free(np);
- add_header (ct, getcpy(DISPO_FIELD), vp);
+ mh_xfree(np);
+ add_header (ct, mh_xstrdup(DISPO_FIELD), vp);
}
skip_headers:
* output the Content-MD5
*/
if (checksw) {
- np = add (MD5_FIELD, NULL);
+ np = mh_xstrdup(MD5_FIELD);
vp = calculate_digest (ct, (ct->c_encoding == CE_QUOTED) ? 1 : 0);
add_header (ct, np, vp);
}
/*
* output the Content-Transfer-Encoding
+ * If using EAI and message body is 7-bit, force 8-bit C-T-E.
*/
+ if (header_encoding == CE_8BIT && ct->c_encoding == CE_7BIT) {
+ ct->c_encoding = CE_8BIT;
+ }
+
switch (ct->c_encoding) {
case CE_7BIT:
/* Nothing to output */
break;
case CE_8BIT:
- np = add (ENCODING_FIELD, NULL);
+ np = mh_xstrdup(ENCODING_FIELD);
vp = concat (" ", "8bit", "\n", NULL);
add_header (ct, np, vp);
break;
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
adios (NULL, "internal error, invalid encoding");
- np = add (ENCODING_FIELD, NULL);
+ np = mh_xstrdup(ENCODING_FIELD);
vp = concat (" ", "quoted-printable", "\n", NULL);
add_header (ct, np, vp);
break;
if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART)
adios (NULL, "internal error, invalid encoding");
- np = add (ENCODING_FIELD, NULL);
+ np = mh_xstrdup(ENCODING_FIELD);
vp = concat (" ", "base64", "\n", NULL);
add_header (ct, np, vp);
break;
if (ct->c_type == CT_MESSAGE)
adios (NULL, "internal error, invalid encoding");
- np = add (ENCODING_FIELD, NULL);
+ np = mh_xstrdup(ENCODING_FIELD);
vp = concat (" ", "binary", "\n", NULL);
add_header (ct, np, vp);
break;
for (pm = ct->c_ctinfo.ci_first_pm; pm; pm = pm->pm_next) {
if (strcasecmp(pm->pm_name, "name") == 0) {
- if (pm->pm_value)
- free(pm->pm_value);
- pm->pm_value = getcpy(simplename);
+ mh_xfree(pm->pm_value);
+ pm->pm_value = mh_xstrdup(simplename);
break;
}
}
add_param(&ct->c_ctinfo.ci_first_pm, &ct->c_ctinfo.ci_last_pm,
"name", simplename, 0);
- ct->c_descr = getcpy(simplename);
+ ct->c_descr = mh_xstrdup(simplename);
ct->c_descr = add("\n", ct->c_descr);
- ct->c_cefile.ce_file = getcpy(filename);
+ ct->c_cefile.ce_file = mh_xstrdup(filename);
set_disposition (ct);
cp);
}
- ct->c_dispo_type = cp ? getcpy (cp) : mh_xstrdup("attachment");
+ if (!cp)
+ cp = "attachment";
+ ct->c_dispo_type = mh_xstrdup(cp);
}
}
NULL);
/* Convert here . . . */
- ct->c_storeproc = getcpy (convert_command);
+ ct->c_storeproc = mh_xstrdup(convert_command);
ct->c_umask = ~m_gmprot ();
if ((status = show_content_aux (ct, 0, convert_command, NULL, NULL)) !=
free (reply_file);
admonish (NULL, "failed to read %s", reply_file);
return;
- } else {
- (void) close (fd);
- }
+ }
+ (void) close (fd);
}
/* This sets reply_ct->c_ctparams, and reply_ct->c_termproc if the