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:
case CT_IMAGE:
case CT_VIDEO:
case CT_APPLICATION:
- return show_content (ct, alternate, textonly, inlineonly, fmt);
-
default:
- adios (NULL, "unknown content type %d", ct->c_type);
+ return show_content (ct, alternate, textonly, inlineonly, fmt);
}
return 0; /* NOT REACHED */
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))
* Compile our format string and save any parameters we care about.
*/
-#define DEFAULT_MARKER "[ part %{part} - %{content-type} - %<{description}" \
- "%{description}%?{cdispo-filename}%{cdispo-filename}" \
- "%|%{ctype-name}%> %<(unseen)\\(suppressed\\)%> ]"
+#define DEFAULT_MARKER "[ part %{part} - %{content-type} - " \
+ "%<{description}%{description}" \
+ "%?{cdispo-filename}%{cdispo-filename}" \
+ "%|%{ctype-name}%> " \
+ "%(kilo(size))B %<(unseen)\\(suppressed\\)%> ]"
static struct format *
compile_marker(char *markerform)