Replace mh_xmalloc() with mh_xcalloc()
[mmh] / uip / repl.c
index 0ff86b8..fa1a7b4 100644 (file)
@@ -145,14 +145,14 @@ main(int argc, char **argv)
        FILE *in;
        int buildsw = 0;
 
-       filter = getcpy(etcpath(mhlreply));
-
        setlocale(LC_ALL, "");
        invo_name = mhbasename(argv[0]);
 
        /* read user profile/context */
        context_read();
 
+       filter = getcpy(etcpath(mhlreply));
+
        arguments = getarguments(invo_name, argc, argv, 1);
        argp = arguments;
 
@@ -388,12 +388,12 @@ static void
 replout(FILE *inb, char *drft, struct msgs *mp,
        int mime, char *form, char *filter)
 {
-       register int state, i;
-       register struct comp *cptr;
-       register char *tmpbuf;
-       register char **nxtbuf;
-       register char **ap;
-       register struct comp **savecomp;
+       int state, i;
+       struct comp *cptr;
+       char *tmpbuf;
+       char **nxtbuf;
+       char **ap;
+       struct comp **savecomp;
        int char_read = 0, format_len, mask;
        char name[NAMESZ], *scanl;
        unsigned char *cp;
@@ -412,17 +412,15 @@ replout(FILE *inb, char *drft, struct msgs *mp,
        /* compile format string */
        ncomps = fmt_compile(cp, &fmt) + 1;
 
-       if (!(nxtbuf = compbuffers = (char **)
-                       calloc((size_t) ncomps, sizeof(char *))))
-               adios(EX_OSERR, NULL, "unable to allocate component buffers");
-       if (!(savecomp = used_buf = (struct comp **)
-                       calloc((size_t) (ncomps+1), sizeof(struct comp *))))
-               adios(EX_OSERR, NULL, "unable to allocate component buffer stack");
+       nxtbuf = compbuffers = (char **)
+                       mh_xcalloc((size_t) ncomps, sizeof(char *));
+       savecomp = used_buf = (struct comp **)
+                       mh_xcalloc((size_t) (ncomps+1), sizeof(struct comp *));
        savecomp += ncomps + 1;
        *--savecomp = NULL;  /* point at zero'd end minus 1 */
 
        for (i = ncomps; i--; )
-               *nxtbuf++ = mh_xmalloc(SBUFSIZ);
+               *nxtbuf++ = mh_xcalloc(SBUFSIZ, sizeof(char));
 
        nxtbuf = compbuffers;  /* point at start */
        tmpbuf = *nxtbuf++;
@@ -527,7 +525,7 @@ finished:
        */
        FINDCOMP(cptr, "subject")
        if (cptr && (cp = cptr->c_text)) {
-               register char *sp = cp;
+               char *sp = cp;
 
                for (;;) {
                        while (isspace(*cp))
@@ -545,7 +543,7 @@ finished:
                }
        }
        i = format_len + char_read + 256;
-       scanl = mh_xmalloc((size_t) i + 2);
+       scanl = mh_xcalloc((size_t) i + 2, sizeof(char));
        dat[0] = 0;
        dat[1] = 0;
        dat[2] = 0;
@@ -638,17 +636,17 @@ static unsigned int bufsiz=0;  /* current size of buf */
 char *
 formataddr(char *orig, char *str)
 {
-       register int len;
+       int len;
        char baddr[BUFSIZ], error[BUFSIZ];
-       register int isgroup;
-       register char *dst;
-       register char *cp;
-       register char *sp;
-       register struct mailname *mp = NULL;
+       int isgroup;
+       char *dst;
+       char *cp;
+       char *sp;
+       struct mailname *mp = NULL;
 
        /* if we don't have a buffer yet, get one */
        if (bufsiz == 0) {
-               buf = mh_xmalloc(BUFINCR);
+               buf = mh_xcalloc(BUFINCR, sizeof(char));
                last_dst = buf;  /* XXX */
                bufsiz = BUFINCR - 6;  /* leave some slop */
                bufend = buf + bufsiz;
@@ -710,7 +708,7 @@ static int
 insert(struct mailname *np)
 {
        char buffer[BUFSIZ];
-       register struct mailname *mp;
+       struct mailname *mp;
 
        if (np->m_mbox == NULL)
                return 0;
@@ -742,7 +740,8 @@ insert(struct mailname *np)
 static void
 replfilter(FILE *in, FILE *out, char *filter)
 {
-       int pid, n;
+       int pid, pid_show, n;
+       int mailpipe[2];
        char *errstr;
 
        if (filter == NULL)
@@ -754,12 +753,32 @@ replfilter(FILE *in, FILE *out, char *filter)
        rewind(in);
        lseek(fileno(in), (off_t) 0, SEEK_SET);
 
-       switch (pid = fork()) {
+       if (pipe(mailpipe) == -1) {
+               adios(EX_OSERR, "pipe", "can't create pipe");
+       }
+
+       switch (pid_show = fork()) {
        case NOTOK:
                adios(EX_OSERR, "fork", "unable to");
 
        case OK:
                dup2(fileno(in), fileno(stdin));
+               dup2(mailpipe[1], fileno(stdout));
+               for (n=3; n<OPEN_MAX; n++) {
+                       close(n);
+               }
+
+               execlp("show", "show", "-file", "-", NULL);
+
+               adios(EX_OSERR, "exec", "unable to");
+       }
+
+       switch (pid = fork()) {
+       case NOTOK:
+               adios(EX_OSERR, "fork", "unable to");
+
+       case OK:
+               dup2(mailpipe[0], fileno(stdin));
                dup2(fileno(out), fileno(stdout));
                for (n=3; n<OPEN_MAX; n++) {
                        close(n);
@@ -773,9 +792,12 @@ replfilter(FILE *in, FILE *out, char *filter)
                _exit(EX_OSERR);
 
        default:
-               if (pidXwait(pid, "mhl"))
+               if (pidXwait(-1, "show | mhl"))
                        exit(EX_SOFTWARE);
                fseek(out, 0L, SEEK_END);
                break;
        }
+
+       close(mailpipe[0]);
+       close(mailpipe[1]);
 }