Rework in dist tools: removed -file switch; don't fork(); refactoring.
[mmh] / uip / rcvdist.c
index 898073f..58bf62d 100644 (file)
@@ -10,7 +10,6 @@
 #include <h/fmt_scan.h>
 #include <h/rcvmail.h>
 #include <h/tws.h>
-#include <h/mts.h>
 #include <h/utils.h>
 
 static struct swit switches[] = {
@@ -37,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;
@@ -54,7 +52,6 @@ main(int argc, char **argv)
        /* read user profile/context */
        context_read();
 
-       mts_init(invo_name);
        arguments = getarguments(invo_name, argc, argv, 1);
        argp = arguments;
 
@@ -77,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());
 
@@ -105,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 */
 }
 
@@ -169,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, NULL);
+       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:
@@ -256,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);
 }