-
-/*
- * mhbuildsbr.c -- routines to expand/translate MIME composition files
+/* mhbuildsbr.c -- routines to expand/translate MIME composition files
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
struct convert_list *next;
} convert_list;
-/*
- * Maximum size of URL token in message/external-body
- */
-
-#define MAXURLTOKEN 40
-
/* mhmisc.c */
void content_error (char *, CT, char *, ...);
}
/* 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) {
case BODY:
fseek (in, (long) (-strlen (buf)), SEEK_CUR);
- /* fall through */
+ /* FALLTHRU */
case FILEEOF:
break;
*/
if (! dist) {
- np = add (VRSN_FIELD, NULL);
+ np = mh_xstrdup(VRSN_FIELD);
vp = concat (" ", VRSN_VALUE, "\n", NULL);
add_header (ct, np, vp);
}
/*
- * We initally assume we will find multiple contents in the
+ * We initially assume we will find multiple contents in the
* draft. So create a multipart/mixed content to hold everything.
* We can remove this later, if it is not needed.
*/
CT p;
if (user_content (in, buf, &p, infile) == DONE) {
- admonish (NULL, "ignoring spurious #end");
+ inform("ignoring spurious #end, continuing...");
continue;
}
if (!p)
}
/* 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] == '<')) {
ct->c_encoding = CE_7BIT;
goto call_init;
}
- /* else fall... */
+ /* FALLTHRU */
case CT_MULTIPART:
adios (NULL, "it doesn't make sense to define an in-line %s content",
ct->c_type == CT_MESSAGE ? "message" : "multipart");
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;
}
/* else, use the current folder */
if (!folder)
- folder = add (getfolder (1), NULL);
+ folder = mh_xstrdup(getfolder(1));
if (!(mp = folder_read (folder, 0)))
adios (NULL, "unable to read folder %s", folder);
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;
}
pp = &part->mp_next;
part->mp_part = p;
}
- admonish (NULL, "premature end-of-file, missing #end");
+ inform("premature end-of-file, missing #end, continuing...");
return OK;
}
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;
}
if (listsw) {
ct->c_end = (partnum = strlen (prefix) + 2) + 2;
if (ct->c_rfc934)
- ct->c_end += 1;
+ ct->c_end++;
for (part = m->mp_parts; part; part = part->mp_next)
ct->c_end += part->mp_part->c_end + partnum;
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;
case 'F':
/* %f, and stdout is not-redirected */
xstdout = 1;
- /* and fall... */
+ /* FALLTHRU */
case 'f':
/*
/*
* 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 */
add_header (ct, np, vp);
/*
- * output the Content-ID, unless disabled by -nocontentid
+ * output the Content-ID, unless disabled by -nocontentid. Note that
+ * RFC 2045 always requires a Content-ID header for message/external-body
+ * entities.
*/
- if (contentidsw && ct->c_id) {
- np = add (ID_FIELD, NULL);
+ if ((contentidsw || ct->c_ctexbody) && ct->c_id) {
+ 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) {
* 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);
}
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;
/*
* Parse the Content-Type. get_ctinfo() parses MIME parameters, but
- * since we're just feeding it a MIME type we have to add those ourself.
+ * since we're just feeding it a MIME type we have to add those ourselves.
* Map that to a valid content-type label and call any initialization
* function.
*/
if (strcasecmp(ct->c_ctinfo.ci_subtype, "external-body") == 0)
adios(NULL, "external-body messages must be specified "
"by mhbuild directives");
- /* Fall through */
+ /* FALLTHRU */
default:
/*
if (cp && strcasecmp (cp, "attachment") &&
strcasecmp (cp, "inline")) {
- admonish (NULL, "configuration problem: %s-disposition-%s%s%s "
- "specifies '%s' but only 'attachment' and 'inline' are "
- "allowed", invo_name,
- ct->c_ctinfo.ci_type,
- ct->c_ctinfo.ci_subtype ? "/" : "",
- ct->c_ctinfo.ci_subtype ? ct->c_ctinfo.ci_subtype : "",
- cp);
+ inform("configuration problem: %s-disposition-%s%s%s specifies "
+ "'%s' but only 'attachment' and 'inline' are allowed, "
+ "continuing...", invo_name,
+ ct->c_ctinfo.ci_type,
+ ct->c_ctinfo.ci_subtype ? "/" : "",
+ ct->c_ctinfo.ci_subtype ? ct->c_ctinfo.ci_subtype : "",
+ cp);
}
if (!cp)
/*
* Set text content charset if it was unspecified. contains8bit
- * selctions:
+ * selections:
* 0: content does not contain 8-bit characters
* 1: content contains 8-bit characters
* -1: ignore content and use user's locale to determine charset
if ((status = show_content_aux (ct, 0, convert_command, NULL, NULL)) !=
OK) {
- admonish (NULL, "store of %s content failed", type);
+ inform("store of %s content failed, continuing...", type);
}
free (convert_command);
if (extract_headers (reply_ct, reply_file, &reply_fp) == NOTOK) {
free (reply_file);
- admonish (NULL,
- "failed to extract headers from convert output in %s",
- reply_file);
+ inform("failed to extract headers from convert output in %s, "
+ "continuing...", reply_file);
return;
}
if ((fd = open (reply_file, O_RDONLY)) == NOTOK ||
scan_input (fd, &eightbit) == NOTOK) {
free (reply_file);
- admonish (NULL, "failed to read %s", reply_file);
+ inform("failed to read %s, continuing...", reply_file);
return;
}
(void) close (fd);
n = strlen (buffer);
if (get_ctinfo (buffer + 14, ct, 0) != OK) {
- admonish (NULL, "unable to get content info for reply");
+ inform("unable to get content info for reply, continuing...");
goto failed_to_extract_ct;
}