X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frepl.c;h=505160ecec629e50f7003cc48acaa498b7576a0d;hp=c0b290de7bae568024cfd5f892bd9a46d6d6e0f3;hb=d4c34b4439a9dbd89664de460ed37ecddc260fb1;hpb=e16d5bfc58d8b0dfe61701cd4d6b1732e837d60a diff --git a/uip/repl.c b/uip/repl.c index c0b290d..505160e 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -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; @@ -412,17 +412,13 @@ replout(FILE *inb, char *drft, struct msgs *mp, /* compile format string */ ncomps = fmt_compile(cp, &fmt) + 1; - if (!(nxtbuf = compbuffers = (char **) - mh_xcalloc((size_t) ncomps, sizeof(char *)))) - adios(EX_OSERR, NULL, "unable to allocate component buffers"); - if (!(savecomp = used_buf = (struct comp **) - mh_xcalloc((size_t) (ncomps+1), sizeof(struct comp *)))) - adios(EX_OSERR, NULL, "unable to allocate component buffer stack"); + nxtbuf = compbuffers = mh_xcalloc(ncomps, sizeof(char *)); + savecomp = used_buf = mh_xcalloc(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++; @@ -541,11 +537,11 @@ finished: if (sp != cptr->c_text) { cp = cptr->c_text; cptr->c_text = getcpy(sp); - free(cp); + mh_free0(&cp); } } i = format_len + char_read + 256; - scanl = mh_xmalloc((size_t) i + 2); + scanl = mh_xcalloc(i + 2, sizeof(char)); dat[0] = 0; dat[1] = 0; dat[2] = 0; @@ -586,14 +582,14 @@ finished: } /* return dynamically allocated buffers */ - free(scanl); + mh_free0(&scanl); for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); nxtbuf++, i--) - free(cptr->c_text); /* if not nxtbuf, nxtbuf already freed */ + mh_free0(&(cptr->c_text)); /* if not nxtbuf, nxtbuf already freed */ while ( i-- > 0) - free(*nxtbuf++); /* free unused nxtbufs */ - free((char *) compbuffers); - free((char *) used_buf); + mh_free0(nxtbuf++); /* free unused nxtbufs */ + mh_free0(&compbuffers); + mh_free0(&used_buf); } static char *buf; /* our current working buffer */ @@ -648,7 +644,7 @@ formataddr(char *orig, char *str) /* 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; @@ -742,7 +738,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 +751,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