X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;ds=sidebyside;f=uip%2Fmhshowsbr.c;h=4a7fc0ca13cfefb34692b662451c863444875cc7;hb=a20d405db09b7ccca74d3e8c57550883da49e1ae;hp=2b69c19728917416d818e5e94824885b5d6c74c7;hpb=31dc797eb5178970d68962ca8939da3fd9a8efda;p=mmh diff --git a/uip/mhshowsbr.c b/uip/mhshowsbr.c index 2b69c19..4a7fc0c 100644 --- a/uip/mhshowsbr.c +++ b/uip/mhshowsbr.c @@ -51,7 +51,7 @@ static void show_single_message(CT, char *); static void DisplayMsgHeader(CT, char *); static int show_switch(CT, int); static int show_content(CT, int); -static int show_content_aux2(CT, int, char *, char *, int, int, int, int); +static int show_content_aux2(CT, int, char *, char *, int, int, int); static int show_text(CT, int); static int show_multi(CT, int); static int show_multi_internal(CT, int); @@ -182,7 +182,7 @@ DisplayMsgHeader(CT ct, char *form) /* NOTREACHED */ default: - xpid = -child_id; + xpid = child_id; break; } } @@ -273,12 +273,11 @@ show_content(CT ct, int alternate) /* ** Parse the display string for displaying generic content */ - int show_content_aux(CT ct, int alternate, char *cp, char *cracked) { int fd, len, buflen, quoted; - int xstdin, xlist, xtty; + int xstdin, xlist; char *bp, *pp, *file, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; @@ -298,7 +297,6 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) xlist = 0; xstdin = 0; - xtty = 0; if (cracked) { strncpy(buffer, cp, sizeof(buffer)); @@ -335,6 +333,13 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) } break; + case 'c': + /* insert charset */ + if (ct->c_charset) { + strncpy(bp, ct->c_charset, buflen); + } + break; + case 'd': /* insert content description */ if (ct->c_descr) { @@ -346,15 +351,9 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) } break; - case 'e': - /* exclusive execution */ - xtty = 1; - break; - case 'F': - /* %e, %f, and stdin is terminal not content */ + /* %f, and stdin is terminal not content */ xstdin = 1; - xtty = 1; /* and fall... */ case 'f': @@ -373,7 +372,6 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked) pp = bp; break; - case 'p': case 'l': /* ** display listing prior to displaying content @@ -446,41 +444,25 @@ raw: } } - if (buflen <= 0 || (ct->c_termproc && - (size_t)buflen <= strlen(ct->c_termproc))) { - /* - ** content_error would provide a more useful error message - ** here, except that if we got overrun, it probably would - ** too. - */ - fprintf(stderr, "Buffer overflow constructing show command!\n"); - return NOTOK; - } - - /* use charset string to modify display method */ - if (ct->c_termproc) { - char term[BUFSIZ]; - - strncpy(term, buffer, sizeof(term)); - snprintf(buffer, sizeof(buffer), ct->c_termproc, term); - } - got_command: return show_content_aux2(ct, alternate, cracked, buffer, - fd, xlist, xstdin, xtty); + fd, xlist, xstdin); } /* ** Routine to actually display the content */ - static int show_content_aux2(CT ct, int alternate, char *cracked, - char *buffer, int fd, int xlist, int xstdin, int xtty) + char *buffer, int fd, int xlist, int xstdin) { pid_t child_id; - char *vec[4], exec[BUFSIZ + sizeof "exec "]; + + if (xpid) { + pidcheck(pidwait(xpid, NOTOK)); + xpid = 0; + } if (debugsw || cracked) { fflush(stdout); @@ -496,13 +478,6 @@ show_content_aux2(CT ct, int alternate, char *cracked, fprintf(stderr, " using command %s\n", buffer); } - if (xpid < 0 || (xtty && xpid)) { - if (xpid < 0) - xpid = -xpid; - pidcheck(pidwait(xpid, NOTOK)); - xpid = 0; - } - if (xlist) { if (ct->c_type == CT_MULTIPART) list_content(ct, -1, 1, 0, 0); @@ -510,13 +485,6 @@ show_content_aux2(CT ct, int alternate, char *cracked, list_switch(ct, -1, 1, 0, 0); } - snprintf(exec, sizeof(exec), "exec %s", buffer); - - vec[0] = "/bin/sh"; - vec[1] = "-c"; - vec[2] = exec; - vec[3] = NULL; - fflush(stdout); switch (child_id = fork()) { @@ -531,7 +499,7 @@ show_content_aux2(CT ct, int alternate, char *cracked, if (!xstdin) dup2(fd, 0); close(fd); - execvp("/bin/sh", vec); + execlp("/bin/sh", "/bin/sh", "-c", buffer, NULL); fprintf(stderr, "unable to exec "); perror("/bin/sh"); _exit(-1); @@ -573,7 +541,12 @@ show_text(CT ct, int alternate) ** if it is not a text part of a multipart/alternative */ if (!alternate || ct->c_subtype == TEXT_PLAIN) { - snprintf(buffer, sizeof(buffer), "%%p%s '%%F'", defaultpager); + if (!check_charset(ct->c_charset, strlen(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); } @@ -706,7 +679,7 @@ static int show_multi_aux(CT ct, int alternate, char *cp) { int len, buflen, quoted; - int xlist, xtty; + int xlist; char *bp, *pp, *file, buffer[BUFSIZ]; struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; @@ -737,7 +710,6 @@ show_multi_aux(CT ct, int alternate, char *cp) } xlist = 0; - xtty = 0; /* get buffer ready to go */ bp = buffer; @@ -768,6 +740,13 @@ show_multi_aux(CT ct, int alternate, char *cp) } break; + case 'c': + /* insert charset */ + if (ct->c_charset) { + strncpy(bp, ct->c_charset, buflen); + } + break; + case 'd': /* insert content description */ if (ct->c_descr) { @@ -779,16 +758,7 @@ show_multi_aux(CT ct, int alternate, char *cp) } break; - case 'e': - /* exclusive execution */ - xtty = 1; - break; - case 'F': - /* %e and %f */ - xtty = 1; - /* and fall... */ - case 'f': /* insert filename(s) containing content */ { @@ -814,7 +784,6 @@ show_multi_aux(CT ct, int alternate, char *cp) } break; - case 'p': case 'l': /* ** display listing prior to displaying content @@ -887,27 +856,8 @@ raw: } } - if (buflen <= 0 || (ct->c_termproc && - (size_t)buflen <= strlen(ct->c_termproc))) { - /* - ** content_error would provide a more useful error message - ** here, except that if we got overrun, it probably would - ** too. - */ - fprintf(stderr, "Buffer overflow constructing show command!\n"); - return NOTOK; - } - - /* use charset string to modify display method */ - if (ct->c_termproc) { - char term[BUFSIZ]; - - strncpy(term, buffer, sizeof(term)); - snprintf(buffer, sizeof(buffer), ct->c_termproc, term); - } - return show_content_aux2(ct, alternate, NULL, buffer, - NOTOK, xlist, 0, xtty); + NOTOK, xlist, 0); } @@ -937,7 +887,7 @@ show_message_rfc822(CT ct, int alternate) /* default method for message/rfc822 */ if (ct->c_subtype == MESSAGE_RFC822) { - cp = (ct->c_showproc = getcpy("%pshow -file '%F'")); + cp = (ct->c_showproc = getcpy("%lshow -file %F")); return show_content_aux(ct, alternate, cp, NULL); } @@ -963,24 +913,34 @@ show_partial(CT ct, int alternate) /* -** Show content of type "message/external". -** -** THE ERROR CHECKING IN THIS ONE IS NOT DONE YET. +** Show how to retrieve content of type "message/external". */ - static int show_external(CT ct, int alternate) { - struct exbody *e = (struct exbody *) ct->c_ctparams; - CT p = e->eb_content; - - if (!type_ok(p, 0)) - return OK; - - return show_switch(p, alternate); - -#if 0 - content_error(NULL, p, "don't know how to display content"); - return NOTOK; -#endif + char **ap, **ep; + char *msg; + FILE *fp; + char buf[BUFSIZ]; + + msg = add("You need to fetch the contents yourself:", 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); + } + if (!(fp = fopen(ct->c_file, "r"))) { + adios(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"); + } + *strchr(buf, '\n') = '\0'; + msg = add(concat("\n\t", buf, NULL), msg); + } + fclose(fp); + content_error(NULL, ct, msg); + return OK; }