X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frcvdist.c;h=58bf62dda2a4a26254724d7119ea7cb059997bc5;hp=625bb4ce552245105952a4fbef165f012f205a61;hb=e0422dfed4d6d236e5298cea579587870b83384a;hpb=33b33a0ac8a3f8f05c9bb0195c100306c00cce35 diff --git a/uip/rcvdist.c b/uip/rcvdist.c index 625bb4c..58bf62d 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -36,8 +36,7 @@ static void unlink_done(int) NORETURN; int main(int argc, char **argv) { - pid_t child_id; - int i, vecp = 1; + int vecp = 1; char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ]; char **argp, **arguments, *vec[MAXARGS]; FILE *fp; @@ -75,17 +74,19 @@ main(int argc, char **argv) done(1); case FORMSW: - if (!(form = *argp++) || *form == '-') + if (!(form = *argp++) || *form == '-') { adios(NULL, "missing argument to %s", argp[-2]); + } continue; } } addrs = addrs ? add(cp, add(", ", addrs)) : getcpy(cp); } - if (addrs == NULL) + if (!addrs) { adios(NULL, "usage: %s [switches] [switches for postproc] address ...", invo_name); + } umask(~m_gmprot()); @@ -103,29 +104,19 @@ main(int argc, char **argv) rcvdistout(fp, form, addrs); fclose(fp); - if (distout(drft, tmpfil, backup) == NOTOK) + if (distout(drft, tmpfil, backup) == NOTOK) { done(1); + } vec[0] = mhbasename(postproc); vec[vecp++] = "-dist"; vec[vecp++] = drft; vec[vecp] = NULL; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep(5); - switch (child_id) { - case NOTOK: - admonish(NULL, "unable to fork");/* fall */ - case OK: - execvp(postproc, vec); - fprintf(stderr, "unable to exec "); - perror(postproc); - _exit(1); - - default: - done(pidXwait(child_id, postproc)); - } - + execvp(postproc, vec); + fprintf(stderr, "unable to exec "); + perror(postproc); + _exit(1); return 0; /* dead code to satisfy the compiler */ } @@ -167,72 +158,85 @@ rcvdistout(FILE *inb, char *form, char *addrs) register struct comp *cptr, **savecomp; FILE *out; - if (!(out = fopen(drft, "w"))) + if (!(out = fopen(drft, "w"))) { adios(drft, "unable to create"); + } /* get new format string */ cp = new_fs(form ? form : rcvdistcomps, NULL); format_len = strlen(cp); ncomps = fmt_compile(cp, &fmt) + 1; if (!(nxtbuf = compbuffers = - (char **) calloc((size_t) ncomps, sizeof(char *)))) + (char **) calloc((size_t) ncomps, sizeof(char *)))) { adios(NULL, "unable to allocate component buffers"); + } if (!(savecomp = used_buf = (struct comp **) calloc((size_t) (ncomps + 1), - sizeof(struct comp *)))) + sizeof(struct comp *)))) { adios(NULL, "unable to allocate component buffer stack"); + } savecomp += ncomps + 1; *--savecomp = 0; - for (i = ncomps; i--;) + for (i = ncomps; i--;) { *nxtbuf++ = mh_xmalloc(SBUFSIZ); + } nxtbuf = compbuffers; tmpbuf = *nxtbuf++; for (ap = addrcomps; *ap; ap++) { FINDCOMP(cptr, *ap); - if (cptr) + if (cptr) { cptr->c_type |= CT_ADDR; + } } FINDCOMP(cptr, "addresses"); - if (cptr) + if (cptr) { cptr->c_text = addrs; - - for (state = FLD;;) { - switch (state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb)) { + } + state = FLD; + while (1) { + state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); + switch (state) { case FLD: case FLDPLUS: - if ((cptr = wantcomp[CHASH(name)])) + if ((cptr = wantcomp[CHASH(name)])) { do { - if (!mh_strcasecmp(name, cptr->c_name)) { - char_read += msg_count; - if (!cptr->c_text) { - cptr->c_text = tmpbuf; - *--savecomp = cptr; - tmpbuf = *nxtbuf++; - } else { - i = strlen(cp = cptr->c_text) - 1; - if (cp[i] == '\n') { - if (cptr->c_type & CT_ADDR) { - cp[i] = 0; - cp = add(",\n\t", cp); - } else - cp = add("\t", cp); + if (mh_strcasecmp(name, cptr->c_name)!=0) { + continue; + } + char_read += msg_count; + if (!cptr->c_text) { + cptr->c_text = tmpbuf; + *--savecomp = cptr; + tmpbuf = *nxtbuf++; + } else { + cp = cptr->c_text; + i = strlen(cp) - 1; + if (cp[i] == '\n') { + if (cptr->c_type & CT_ADDR) { + cp[i] = 0; + cp = add(",\n\t", cp); + } else { + cp = add("\t", cp); } - cptr->c_text = add(tmpbuf, cp); } - while (state == FLDPLUS) { - state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); - cptr->c_text = add(tmpbuf, cptr->c_text); - char_read += msg_count; - } - break; + cptr->c_text = add(tmpbuf, cp); + } + while (state == FLDPLUS) { + state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); + cptr->c_text = add(tmpbuf, cptr->c_text); + char_read += msg_count; } + break; } while ((cptr = cptr->c_next)); + } - while (state == FLDPLUS) - state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); + while (state == FLDPLUS) { + state = m_getfld(state, name, tmpbuf, + SBUFSIZ, inb); + } break; case LENERR: @@ -254,30 +258,35 @@ finished: ; fmt_scan(fmt, scanl, i, dat); fputs(scanl, out); - if (ferror(out)) + if (ferror(out)) { adios(drft, "error writing"); + } fclose(out); free(scanl); for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); - nxtbuf++, i--) + nxtbuf++, i--) { free(cptr->c_text); - while (i-- > 0) + } + while (i-- > 0) { free(*nxtbuf++); - free((char *) compbuffers); - free((char *) used_buf); + } + free(compbuffers); + free(used_buf); } static void unlink_done(int status) { - if (backup[0]) + if (*backup) { unlink(backup); - if (drft[0]) + } + if (*drft) { unlink(drft); - if (tmpfil[0]) + } + if (*tmpfil) { unlink(tmpfil); - + } exit(status ? RCV_MBX : RCV_MOK); }