]> diplodocus.org Git - nmh/blobdiff - uip/mhlsbr.c
Fixed mhical(1) exit status to reflect return status of icalparse().
[nmh] / uip / mhlsbr.c
index b35d36675411d46aeddb9dc534712bc4df6b9559..ade7e1c29953093164874b2b4b945645d3185f72 100644 (file)
@@ -6,6 +6,19 @@
  */
 
 #include "h/mh.h"
+#include "sbr/fmt_new.h"
+#include "mhlsbr.h"
+#include "sbr/m_getfld.h"
+#include "sbr/getarguments.h"
+#include "sbr/concat.h"
+#include "sbr/smatch.h"
+#include "sbr/r1bindex.h"
+#include "sbr/snprintb.h"
+#include "sbr/copyip.h"
+#include "sbr/discard.h"
+#include "sbr/trimcpy.h"
+#include "sbr/vfgets.h"
+#include "sbr/check_charset.h"
 #include "sbr/getcpy.h"
 #include "sbr/brkstring.h"
 #include "sbr/ambigsw.h"
@@ -597,7 +610,7 @@ mhl_format (char *file, int length, int width)
        }
 
        parptr = bp;
-       strncpy (name, parse(), sizeof(name));
+       strncpy (name, parse(), sizeof(name) - 1);
        switch (*parptr) {
            case '\0': 
            case ',': 
@@ -712,7 +725,7 @@ evalvar (struct mcomp *c1)
 
     if (!*parptr)
        return 0;
-    strncpy (name, parse(), sizeof(name));
+    strncpy (name, parse(), sizeof(name) - 1);
 
     if (!strcasecmp (name, "component")) {
        if (ptos (name, &c1->c_text))
@@ -768,7 +781,7 @@ evalvar (struct mcomp *c1)
 
        if (! c1->c_name  ||  strcasecmp (c1->c_name, "body")) {
            inform("format filters are currently only supported on "
-                   "the \"body\" component");
+                   "the \"body\" component");
            return 1;
        }
 
@@ -893,9 +906,9 @@ process (char *folder, char *fname, int ofilen, int ofilec)
                fp = stdin;
            }
            if (fstat(fileno(fp), &st) == 0) {
-               filesize = st.st_size;
+               filesize = st.st_size;
            } else {
-               filesize = 0;
+               filesize = 0;
            }
            cp = folder ? concat (folder, ":", fname2, NULL) : mh_xstrdup(fname2);
            if (ontty != PITTY)
@@ -904,7 +917,7 @@ process (char *folder, char *fname, int ofilen, int ofilec)
             free (cp);
 
            for (ap = arglist_head; ap; ap = ap->a_next) {
-               fmt_free(ap->a_fmt, 0);
+               fmt_free(ap->a_fmt, 0);
                ap->a_fmt = NULL;
            }
 
@@ -1061,12 +1074,13 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                    }
                    if (dobody && (!c1->c_name  ||
                                   !strcasecmp (c1->c_name, "body"))) {
-                       if (c1->c_flags & FMTFILTER && state == BODY &&
+                       if (c1->c_flags & FMTFILTER && state == BODY &&
                                                        formatproc != NULL) {
                            filterbody(c1, buf, sizeof(buf), state, gstate);
                        } else {
-                           holder.c_text = mh_xmalloc (sizeof(buf));
-                           strncpy (holder.c_text, buf, sizeof(buf));
+                            bufsz = sizeof buf;
+                            holder.c_text = mh_xmalloc(bufsz);
+                            strncpy(holder.c_text, buf, bufsz);
                            while (state == BODY) {
                                putcomp (c1, &holder, BODYCOMP);
                                bufsz = sizeof buf;
@@ -1719,7 +1733,7 @@ compile_filterargs (void)
     fmt_free(NULL, 1);
 
     while (arg) {
-       fmt_compile(arg->a_nfs, &arg->a_fmt, 0);
+       fmt_compile(arg->a_nfs, &arg->a_fmt, 0);
        arg = arg->a_next;
     }
 
@@ -1757,7 +1771,7 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
     }
 
     if (pipe(fdoutput) < 0) {
-       die("Unable to create output pipe");
+       die("Unable to create output pipe");
     }
 
     /*
@@ -1780,7 +1794,7 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
 
     switch (writerpid = fork()) {
     case 0:
-       /*
+       /*
         * Our child process - just write to the filter input (fdinput[1]).
         * Close all other descriptors that we don't need.
         */
@@ -1812,7 +1826,7 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
         */
        _exit(0);
     case -1:
-       die("Unable to fork for filter writer process");
+       die("Unable to fork for filter writer process");
        break;
     }
 
@@ -1824,10 +1838,10 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
     switch (filterpid = fork()) {
         char **args, *program;
        struct arglist *a;
-       int i, dat[5], s, argp;
+       int i, dat[5], argp;
 
     case 0:
-       /*
+       /*
         * Configure an argument array for us
         */
 
@@ -1849,14 +1863,9 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
            fmt_scan(a->a_fmt, scanl, BUFSIZ, dat, NULL);
            args[i] = charstring_buffer_copy (scanl);
            charstring_free (scanl);
-           /*
-            * fmt_scan likes to put a trailing newline at the end of the
-            * format string.  If we have one, get rid of it.
-            */
-           s = strlen(args[i]);
-           if (args[i][s - 1] == '\n')
-               args[i][s - 1] = '\0';
-
+           /* Trim a trailing linefeed that fmt_scan() likes to put at
+             * the end of the format string. */
+            trim_suffix_c(args[i], '\n');
            if (mhldebug)
                fprintf(stderr, "filterarg: fmt=\"%s\", output=\"%s\"\n",
                        a->a_nfs, args[i]);
@@ -1887,7 +1896,7 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
        break;
 
     case -1:
-       die("Unable to fork format program");
+       die("Unable to fork format program");
     }
 
     /*
@@ -1905,12 +1914,12 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
     holder.c_text = buf;
 
     while ((cc = read(fdoutput[0], buf, bufsz - 1)) > 0) {
-       buf[cc] = '\0';
-       putcomp(c1, &holder, BODYCOMP);
+       buf[cc] = '\0';
+       putcomp(c1, &holder, BODYCOMP);
     }
 
     if (cc < 0) {
-       die("reading from formatproc");
+       die("reading from formatproc");
     }
 
     /*
@@ -1919,22 +1928,22 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state,
      */
 
     if (waitpid(filterpid, &waitstat, 0) < 0) {
-       if (errno != ECHILD) {
+       if (errno != ECHILD) {
            adios("filterproc", "Unable to determine status");
        }
     } else {
-       if (! (WIFEXITED(waitstat) && WEXITSTATUS(waitstat) == 0)) {
+       if (! (WIFEXITED(waitstat) && WEXITSTATUS(waitstat) == 0)) {
            pidstatus(waitstat, stderr, "filterproc");
        }
     }
 
     if (waitpid(writerpid, &waitstat, 0) < 0) {
-       if (errno != ECHILD) {
+       if (errno != ECHILD) {
            adios("writer process", "Unable to determine status");
            done(1);
        }
     } else {
-       if (! (WIFEXITED(waitstat) && WEXITSTATUS(waitstat) == 0)) {
+       if (! (WIFEXITED(waitstat) && WEXITSTATUS(waitstat) == 0)) {
            pidstatus(waitstat, stderr, "writer process");
            done(1);
        }