X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhshowsbr.c;h=c7923c87db021f477770fc8c76484ccdd1198b71;hp=3bcf84f937417c80fa20571eaec1d0b68f9df281;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=7ca05c3df912f540c1f25b3be4d1733f5a3ad1b4 diff --git a/uip/mhshowsbr.c b/uip/mhshowsbr.c index 3bcf84f..c7923c8 100644 --- a/uip/mhshowsbr.c +++ b/uip/mhshowsbr.c @@ -10,13 +10,15 @@ #include #include #include -#include #include #include #include #include #include #include +#include +#include +#include extern int debugsw; @@ -34,8 +36,8 @@ void content_error(char *, CT, char *, ...); void flush_errors(void); /* mhlistsbr.c */ -int list_switch(CT, int, int, int, int); -int list_content(CT, int, int, int, int); +int list_switch(CT, int, int, int); +int list_content(CT, int, int, int); /* ** prototypes @@ -74,7 +76,7 @@ show_all_messages(CT *cts) ** for showing headers of MIME messages. */ if (!formsw) - formsw = getcpy(etcpath("mhl.headers")); + formsw = mh_xstrdup(etcpath("mhl.headers")); /* ** If form is "mhl.null", suppress display of header. @@ -85,9 +87,16 @@ show_all_messages(CT *cts) for (ctp = cts; *ctp; ctp++) { ct = *ctp; - /* if top-level type is ok, then display message */ - if (type_ok(ct, 1)) - show_single_message(ct, formsw); + if (!type_ok(ct, 1)) { /* top-level type */ + continue; + } + if (cts[1]) { + if (ctp != cts) { + printf("\n\n"); + } + printf(">>> Message %s\n\n", ct->c_file); + } + show_single_message(ct, formsw); } } @@ -148,14 +157,14 @@ DisplayMsgHeader(CT ct, char *form) switch (child_id = fork()) { case NOTOK: - adios("fork", "unable to"); + adios(EX_OSERR, "fork", "unable to"); /* NOTREACHED */ case OK: execvp("mhl", vec); fprintf(stderr, "unable to exec "); perror("mhl"); - _exit(-1); + _exit(EX_OSERR); /* NOTREACHED */ default: @@ -207,7 +216,7 @@ show_switch(CT ct, int alternate) break; default: - adios(NULL, "unknown content type %d", ct->c_type); + adios(EX_DATAERR, NULL, "unknown content type %d", ct->c_type); break; } @@ -226,13 +235,13 @@ show_content(CT ct, int alternate) CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ - snprintf(buffer, sizeof(buffer), "%s-show-%s/%s", - invo_name, ci->ci_type, ci->ci_subtype); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", + ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ - snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); @@ -241,7 +250,7 @@ show_content(CT ct, int alternate) /* complain if we are not a part of a multipart/alternative */ if (!alternate) - content_error(NULL, ct, "don't know how to display content"); + return show_content_aux(ct, alternate, "%l", NULL); return NOTOK; } @@ -312,9 +321,8 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) case 'c': /* insert charset */ - if (ct->c_charset) { - strncpy(bp, ct->c_charset, buflen); - } + strncpy(bp, ct->c_charset ? ct->c_charset : + "US-ASCII", buflen); break; case 'd': @@ -324,7 +332,7 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) s = trimcpy(ct->c_descr); strncpy(bp, s, buflen); - free(s); + mh_free0(&s); } break; @@ -452,9 +460,9 @@ show_content_aux2(CT ct, int alternate, char *cracked, if (xlist) { if (ct->c_type == CT_MULTIPART) - list_content(ct, -1, 1, 0, 0); + list_content(ct, -1, 0, 0); else - list_switch(ct, -1, 1, 0, 0); + list_switch(ct, -1, 0, 0); } fflush(stdout); @@ -474,7 +482,7 @@ show_content_aux2(CT ct, int alternate, char *cracked, execlp("/bin/sh", "/bin/sh", "-c", buffer, NULL); fprintf(stderr, "unable to exec "); perror("/bin/sh"); - _exit(-1); + _exit(EX_OSERR); /* NOTREACHED */ default: @@ -498,13 +506,13 @@ show_text(CT ct, int alternate) CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ - snprintf(buffer, sizeof(buffer), "%s-show-%s/%s", - invo_name, ci->ci_type, ci->ci_subtype); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", + ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ - snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); @@ -513,14 +521,14 @@ show_text(CT ct, int alternate) ** if it is not a text part of a multipart/alternative */ if (!alternate || ct->c_subtype == TEXT_PLAIN) { - if (!check_charset(ct->c_charset, strlen(ct->c_charset))) { + if (ct->c_charset && !is_native_charset(ct->c_charset)) { snprintf(buffer, sizeof(buffer), "%%liconv -f '%s'", ct->c_charset); } else { snprintf(buffer, sizeof(buffer), "%%lcat"); } - cp = (ct->c_showproc = getcpy(buffer)); - return show_content_aux(ct, alternate, cp, NULL); + ct->c_showproc = mh_xstrdup(buffer); + return show_content_aux(ct, alternate, ct->c_showproc, NULL); } return NOTOK; @@ -538,13 +546,13 @@ show_multi(CT ct, int alternate) CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ - snprintf(buffer, sizeof(buffer), "%s-show-%s/%s", - invo_name, ci->ci_type, ci->ci_subtype); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", + ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_multi_aux(ct, alternate, cp); /* Check for mhshow-show-type */ - snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_multi_aux(ct, alternate, cp); @@ -673,7 +681,7 @@ show_multi_aux(CT ct, int alternate, char *cp) return NOTOK; /* I'm not sure if this is necessary? */ - p->c_storage = getcpy(file); + p->c_storage = mh_xstrdup(file); if (p->c_showproc && strcmp(p->c_showproc, "true")==0) return (alternate ? DONE : OK); @@ -714,9 +722,8 @@ show_multi_aux(CT ct, int alternate, char *cp) case 'c': /* insert charset */ - if (ct->c_charset) { - strncpy(bp, ct->c_charset, buflen); - } + strncpy(bp, ct->c_charset ? ct->c_charset : + "US-ASCII", buflen); break; case 'd': @@ -726,7 +733,7 @@ show_multi_aux(CT ct, int alternate, char *cp) s = trimcpy(ct->c_descr); strncpy(bp, s, buflen); - free(s); + mh_free0(&s); } break; @@ -844,13 +851,13 @@ show_message_rfc822(CT ct, int alternate) CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ - snprintf(buffer, sizeof(buffer), "%s-show-%s/%s", - invo_name, ci->ci_type, ci->ci_subtype); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", + ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ - snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type); + snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); @@ -859,13 +866,13 @@ show_message_rfc822(CT ct, int alternate) /* default method for message/rfc822 */ if (ct->c_subtype == MESSAGE_RFC822) { - cp = (ct->c_showproc = getcpy("%lshow -file %F")); + cp = (ct->c_showproc = mh_xstrdup("%lshow -file %F")); return show_content_aux(ct, alternate, cp, NULL); } /* complain if we are not a part of a multipart/alternative */ if (!alternate) - content_error(NULL, ct, "don't know how to display content"); + return show_content_aux(ct, alternate, "%l", NULL); return NOTOK; } @@ -878,8 +885,8 @@ show_message_rfc822(CT ct, int alternate) static int show_partial(CT ct, int alternate) { - content_error(NULL, ct, - "in order to display this message, you must reassemble it"); + show_content_aux(ct, alternate, "%l", NULL); + puts("in order to display this message, you must reassemble it"); return NOTOK; } @@ -895,24 +902,28 @@ show_external(CT ct, int alternate) FILE *fp; char buf[BUFSIZ]; - msg = add("You need to fetch the contents yourself:", NULL); + msg = add("You need to fetch the contents yourself:\n", NULL); ap = ct->c_ctinfo.ci_attrs; ep = ct->c_ctinfo.ci_values; for (; *ap; ap++, ep++) { - msg = add(concat("\n\t", *ap, ": ", *ep, NULL), msg); + msg = add(concat("\t", *ap, ": ", *ep, NULL), msg); } if (!(fp = fopen(ct->c_file, "r"))) { - adios(ct->c_file, "unable to open"); + adios(EX_IOERR, ct->c_file, "unable to open"); } fseek(fp, ct->c_begin, SEEK_SET); while (!feof(fp) && ftell(fp) < ct->c_end) { if (!fgets(buf, sizeof buf, fp)) { - adios(ct->c_file, "unable to read"); + adios(EX_IOERR, ct->c_file, "unable to read"); } *strchr(buf, '\n') = '\0'; - msg = add(concat("\n\t", buf, NULL), msg); + if (!*buf) { + continue; /* skip empty lines */ + } + msg = add(concat("\t", buf, "\n", NULL), msg); } fclose(fp); - content_error(NULL, ct, msg); + show_content_aux(ct, alternate, "%l", NULL); + fputs(msg, stdout); return OK; }