void content_error (char *, CT, char *, ...);
void flush_errors (void);
-/*
- * prototypes
- */
-int show_content_aux (CT, int, char *, char *, struct format *fmt);
-
/*
* static prototypes
*/
inlineonly, fmt);
case MESSAGE_RFC822:
- default:
return show_message_rfc822 (ct, alternate, fmt);
+
+ /*
+ * Treat unknown message types as equivalent to
+ * application/octet-stream for now
+ */
+ default:
+ return show_content (ct, alternate, textonly,
+ inlineonly, fmt);
}
case CT_TEXT:
show_content (CT ct, int alternate, int textonly, int inlineonly,
struct format *fmt)
{
- char *cp, buffer[BUFSIZ];
+ char *cp;
CI ci = &ct->c_ctinfo;
/*
return OK;
}
- /* Check for invo_name-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- if ((cp = context_find (buffer)) && *cp != '\0')
- return show_content_aux (ct, alternate, cp, NULL, fmt);
-
- /* Check for invo_name-show-type */
- snprintf (buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
- if ((cp = context_find (buffer)) && *cp != '\0')
+ /* Check for invo_name-show-type[/subtype] */
+ if ((cp = context_find_by_type ("show", ci->ci_type, ci->ci_subtype)))
return show_content_aux (ct, alternate, cp, NULL, fmt);
if ((cp = ct->c_showproc))
fprintf (stderr, " using command %s\n", buffer);
}
- if (xlist) {
+ if (xlist && fmt) {
output_marker(ct, fmt, 0);
}
if (buffer[0] == '\0') {
char readbuf[BUFSIZ];
ssize_t cc;
+ char lastchar = '\n';
if (fd == NOTOK) {
advise(NULL, "Cannot use NULL command to display content-type "
while ((cc = read(fd, readbuf, sizeof(readbuf))) > 0) {
fwrite(readbuf, sizeof(char), cc, stdout);
+ lastchar = readbuf[cc - 1];
}
if (cc < 0) {
return NOTOK;
}
+ /*
+ * The MIME standards allow content to not have a trailing newline.
+ * But because we are (presumably) sending this to stdout, include
+ * a newline for text content if the final character was not a
+ * newline. Only do this for mhshow.
+ */
+
+ if (strcmp(invo_name, "mhshow") == 0 && ct->c_type == CT_TEXT &&
+ ct->c_subtype == TEXT_PLAIN && lastchar != '\n') {
+ putc('\n', stdout);
+ }
+
+ fflush(stdout);
+
return OK;
}
char *cp, buffer[BUFSIZ];
CI ci = &ct->c_ctinfo;
- /* Check for invo_name-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- if ((cp = context_find (buffer)) && *cp != '\0')
- return show_content_aux (ct, alternate, cp, NULL, fmt);
-
- /* Check for invo_name-show-type */
- snprintf (buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
- if ((cp = context_find (buffer)) && *cp != '\0')
+ /* Check for invo_name-show-type[/subtype] */
+ if ((cp = context_find_by_type ("show", ci->ci_type, ci->ci_subtype)))
return show_content_aux (ct, alternate, cp, NULL, fmt);
/*
show_multi (CT ct, int alternate, int concatsw, int textonly, int inlineonly,
struct format *fmt)
{
- char *cp, buffer[BUFSIZ];
+ char *cp;
CI ci = &ct->c_ctinfo;
- /* Check for invo_name-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- if ((cp = context_find (buffer)) && *cp != '\0')
- return show_multi_aux (ct, alternate, cp, fmt);
-
- /* Check for invo_name-show-type */
- snprintf (buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
- if ((cp = context_find (buffer)) && *cp != '\0')
+ /* Check for invo_name-show-type[/subtype] */
+ if ((cp = context_find_by_type ("show", ci->ci_type, ci->ci_subtype)))
return show_multi_aux (ct, alternate, cp, fmt);
if ((cp = ct->c_showproc))
static int
show_message_rfc822 (CT ct, int alternate, struct format *fmt)
{
- char *cp, buffer[BUFSIZ];
+ char *cp;
CI ci = &ct->c_ctinfo;
- /* Check for invo_name-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- if ((cp = context_find (buffer)) && *cp != '\0')
- return show_content_aux (ct, alternate, cp, NULL, fmt);
-
- /* Check for invo_name-show-type */
- snprintf (buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
- if ((cp = context_find (buffer)) && *cp != '\0')
+ /* Check for invo_name-show-type[/subtype] */
+ if ((cp = context_find_by_type ("show", ci->ci_type, ci->ci_subtype)))
return show_content_aux (ct, alternate, cp, NULL, fmt);
if ((cp = ct->c_showproc))
static void
output_marker(CT ct, struct format *fmt, int hidden)
{
- char outbuf[BUFSIZ];
+ charstring_t outbuf = charstring_create (BUFSIZ);
struct param_comp_list *pcentry;
int partsize;
int dat[5];
dat[4] = hidden;
dat[0] = dat[1] = dat[3] = 0;
- fmt_scan(fmt, outbuf, sizeof(outbuf), sizeof(outbuf), dat, NULL);
+ fmt_scan(fmt, outbuf, BUFSIZ, dat, NULL);
- fputs(outbuf, stdout);
+ fputs(charstring_buffer (outbuf), stdout);
+ charstring_free (outbuf);
fmt_freecomptext();
}