]> diplodocus.org Git - nmh/blobdiff - uip/mhshowsbr.c
getpass.c: Move interface to own file.
[nmh] / uip / mhshowsbr.c
index 20de87cc6dce222c927801db7e93ef394e2b7bfd..2bac9d00a8d5923dfb07568bfac58600cfa47cf5 100644 (file)
@@ -5,25 +5,32 @@
  * complete copyright information.
  */
 
-#include <h/mh.h>
+#include "h/mh.h"
+#include "sbr/trimcpy.h"
+#include "sbr/check_charset.h"
+#include "sbr/getcpy.h"
+#include "sbr/context_find.h"
+#include "sbr/pidstatus.h"
+#include "sbr/arglist.h"
+#include "sbr/error.h"
 #include <fcntl.h>
-#include <h/signals.h>
-#include <h/md5.h>
-#include <h/mts.h>
-#include <h/tws.h>
-#include <h/mime.h>
-#include <h/mhparse.h>
-#include <h/fmt_scan.h>
-#include <h/utils.h>
+#include "h/signals.h"
+#include "h/md5.h"
+#include "h/mts.h"
+#include "h/tws.h"
+#include "h/mime.h"
+#include "h/mhparse.h"
+#include "h/fmt_scan.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "mhmisc.h"
 #include "mhshowsbr.h"
-#include "../sbr/m_mktemp.h"
+#include "sbr/m_mktemp.h"
 #ifdef HAVE_ICONV
 #   include <iconv.h>
 #endif /* ! HAVE_ICONV */
 
 extern int debugsw;
-extern int npart;
-extern int ntype;
 
 int nolist   = 0;
 
@@ -33,20 +40,13 @@ char *progsw = NULL;
 int nomore   = 0;
 char *formsw = NULL;
 
-/* for output markerss and headers */
+/* for output markers and headers */
 char *folder = NULL;
 char *markerform;
 char *headerform;
 int headersw = -1;
 
 
-/* mhmisc.c */
-int part_ok (CT);
-int part_exact (CT);
-int type_ok (CT, int);
-void content_error (char *, CT, char *, ...);
-void flush_errors (void);
-
 /*
  * static prototypes
  */
@@ -108,7 +108,7 @@ show_all_messages(CT *cts, int concat, int textonly, int inlineonly)
      * for showing headers of MIME messages.
      */
     if (!formsw)
-       formsw = getcpy (etcpath ("mhl.headers"));
+       formsw = mh_xstrdup(etcpath("mhl.headers"));
 
     /*
      * Compile the content marker and header format lines
@@ -201,7 +201,7 @@ static void
 DisplayMsgHeader (CT ct, char *form, int concatsw)
 {
     pid_t child_id;
-    int i, vecp;
+    int vecp;
     char **vec;
     char *file;
 
@@ -225,9 +225,7 @@ DisplayMsgHeader (CT ct, char *form, int concatsw)
 
     fflush (stdout);
 
-    for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-       sleep (5);
-
+    child_id = fork();
     switch (child_id) {
     case NOTOK:
        adios ("fork", "unable to");
@@ -237,7 +235,7 @@ DisplayMsgHeader (CT ct, char *form, int concatsw)
        execvp (file, vec);
        fprintf (stderr, "unable to exec ");
        perror (mhlproc);
-       _exit (-1);
+       _exit(1);
        /* NOTREACHED */
 
     default:
@@ -344,7 +342,7 @@ show_content_aux (CT ct, int alternate, char *cp, char *cracked, struct format *
 {
     int fd;
     int xstdin = 0, xlist = 0;
-    char *file = NULL, buffer[BUFSIZ];
+    char *file = NULL, buffer[NMH_BUFSIZ];
 
     if (!ct->c_ceopenfnx) {
        if (!alternate)
@@ -404,7 +402,7 @@ show_content_aux2 (CT ct, int alternate, char *cracked, char *buffer,
                    int fd, int xlist, int xstdin, struct format *fmt)
 {
     pid_t child_id;
-    int i, vecp;
+    int vecp;
     char **vec, *file;
 
     if (debugsw || cracked) {
@@ -441,7 +439,7 @@ show_content_aux2 (CT ct, int alternate, char *cracked, char *buffer,
        }
 
        while ((cc = read(fd, readbuf, sizeof(readbuf))) > 0) {
-           if ((ssize_t) fwrite(readbuf, sizeof(char), cc, stdout) < cc) {
+           if ((ssize_t) fwrite(readbuf, 1, cc, stdout) < cc) {
                advise ("putline", "fwrite");
            }
            lastchar = readbuf[cc - 1];
@@ -474,8 +472,7 @@ show_content_aux2 (CT ct, int alternate, char *cracked, char *buffer,
 
     fflush (stdout);
 
-    for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-       sleep (5);
+    child_id = fork();
     switch (child_id) {
        case NOTOK:
            advise ("fork", "unable to");
@@ -494,19 +491,23 @@ show_content_aux2 (CT ct, int alternate, char *cracked, char *buffer,
            execvp (file, vec);
            fprintf (stderr, "unable to exec ");
            perror (buffer);
-           _exit (-1);
+           _exit(1);
            /* NOTREACHED */
 
        default: {
            int status;
+            char *display_prog = vecp > 2  &&  vec[2][0] != '\0'
+                /* Copy the real display program name.  This relies on the
+                   specific construction of vec[] by argsplit(). */
+                ?  vec[2]
+                :  NULL;
 
-           arglist_free(file, vec);
-
-           pidcheck ((status = pidXwait (child_id, NULL)));
+            pidcheck ((status = pidXwait (child_id, display_prog)));
 
+            arglist_free(file, vec);
            if (fd != NOTOK)
                (*ct->c_ceclosefnx) (ct);
-           return (alternate ? OK : status);
+           return alternate ? OK : status;
         }
     }
 }
@@ -588,9 +589,9 @@ show_multi_internal (CT ct, int alternate, int concatsw, int textonly,
     int        alternating, nowalternate, result;
     struct multipart *m = (struct multipart *) ct->c_ctparams;
     struct part *part;
-    int request_matched;
-    int display_success;
-    int mult_alt_done;
+    bool request_matched;
+    bool display_success;
+    bool mult_alt_done;
     int ret;
     CT p;
 
@@ -608,9 +609,9 @@ show_multi_internal (CT ct, int alternate, int concatsw, int textonly,
      */
 
     result = NOTOK;
-    request_matched = 0;
-    display_success = 0;
-    mult_alt_done = 0;
+    request_matched = false;
+    display_success = false;
+    mult_alt_done = false;
 
     for (part = m->mp_parts; part; part = part->mp_next) {
        p = part->mp_part;
@@ -631,7 +632,7 @@ show_multi_internal (CT ct, int alternate, int concatsw, int textonly,
                                      inlineonly, fmt);
            switch (inneresult) {
                case NOTOK:  /* hard display error */
-                   request_matched = 1;
+                   request_matched = true;
                    if (alternate && !alternating) {
                        result = NOTOK;
                        goto out;
@@ -642,8 +643,8 @@ show_multi_internal (CT ct, int alternate, int concatsw, int textonly,
                    continue;
 
                case OK:  /* display successful */
-                   request_matched = 1;
-                   display_success = 1;
+                   request_matched = true;
+                   display_success = true;
                    result = OK;
 
                    /* if we got success on a sub-part of
@@ -651,7 +652,7 @@ show_multi_internal (CT ct, int alternate, int concatsw, int textonly,
                     * there's a chance an explicit part should be
                     * matched later in the alternatives.  */
                    if (alternating) {
-                       mult_alt_done = 1;
+                       mult_alt_done = true;
                    } else if (alternate) {
                        alternate = nowalternate = 0;
                    }
@@ -710,7 +711,7 @@ show_multi_aux (CT ct, int alternate, char *cp, struct format *fmt)
            if ((*p->c_ceopenfnx) (p, &file) == NOTOK)
                return NOTOK;
 
-           p->c_storage = add (file, NULL);
+           p->c_storage = mh_xstrdup(FENDNULL(file));
 
            if (p->c_showproc && !strcmp (p->c_showproc, "true"))
                return OK;
@@ -797,8 +798,10 @@ show_external (CT ct, int alternate, int concatsw, int textonly, int inlineonly,
 static int
 parse_display_string (CT ct, char *cp, int *xstdin, int *xlist,
                       char *file, char *buffer, size_t buflen,
-                      int multipart) {
-    int len, quoted = 0;
+                      int multipart)
+{
+    int len;
+    bool quoted = false;
     char *bp = buffer, *pp;
     CI ci = &ct->c_ctinfo;
 
@@ -969,7 +972,7 @@ parse_display_string (CT ct, char *cp, int *xstdin, int *xlist,
                    *pp++ = '\'';
                    buflen--;
                    bp++;
-                   quoted = 1;
+                   quoted = true;
                }
                /* Escape existing quotes */
                while ((pp = strchr (pp, '\'')) && buflen > 3) {
@@ -984,7 +987,7 @@ parse_display_string (CT ct, char *cp, int *xstdin, int *xlist,
                        *pp++ = '\'';
                        buflen -= 2;
                        bp += 2;
-                       quoted = 0;
+                       quoted = false;
                    } else {
                        /* Not quoted.  This should not be reached with
                           the current code, but handle the condition
@@ -1023,7 +1026,7 @@ parse_display_string (CT ct, char *cp, int *xstdin, int *xlist,
                    if (! found_quote) {
                        *bp++ = '\'';
                        buflen--;
-                       quoted = 0;
+                       quoted = false;
                    }
                }
            }
@@ -1061,7 +1064,8 @@ raw:
 
 
 int
-convert_charset (CT ct, char *dest_charset, int *message_mods) {
+convert_charset (CT ct, char *dest_charset, int *message_mods)
+{
     char *src_charset = content_charset (ct);
     int status = OK;
 
@@ -1074,7 +1078,7 @@ convert_charset (CT ct, char *dest_charset, int *message_mods) {
         FILE **fp = NULL;
         size_t begin;
         size_t end;
-        int opened_input_file = 0;
+        bool opened_input_file = false;
         char src_buffer[BUFSIZ];
        size_t dest_buffer_size = BUFSIZ;
        char *dest_buffer = mh_xmalloc(dest_buffer_size);
@@ -1090,7 +1094,7 @@ convert_charset (CT ct, char *dest_charset, int *message_mods) {
         }
 
         if ((tempfile = m_mktemp2 (NULL, invo_name, &fd, NULL)) == NULL) {
-            adios (NULL, "unable to create temporary file in %s",
+            die("unable to create temporary file in %s",
                    get_temp_dir());
         }
         dest = mh_xstrdup(tempfile);
@@ -1112,7 +1116,7 @@ convert_charset (CT ct, char *dest_charset, int *message_mods) {
                     advise (*file, "unable to open for reading");
                     status = NOTOK;
                 } else {
-                    opened_input_file = 1;
+                    opened_input_file = true;
                 }
             }
         }
@@ -1216,7 +1220,7 @@ iconv_start:
                replace_param(&ct->c_ctinfo.ci_first_pm,
                              &ct->c_ctinfo.ci_last_pm, "charset",
                              dest_charset, 0);
-               outline = output_params(strlen(TYPE_FIELD) + 1 + strlen(ctline),
+               outline = output_params(LEN(TYPE_FIELD) + 1 + strlen(ctline),
                                        ct->c_ctinfo.ci_first_pm, NULL, 0);
                if (outline) {
                    ctline = add(outline, ctline);
@@ -1257,7 +1261,8 @@ iconv_start:
 
 
 static int
-convert_content_charset (CT ct, char **file) {
+convert_content_charset (CT ct, char **file)
+{
     int status = OK;
 
 #ifdef HAVE_ICONV