X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frcvdist.c;h=89ed0299c37959254bf38b3d08486f20881ad1c8;hp=9038d5ffbda033f38d318bd44dc3fcae6efca99a;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hpb=f480c03187724e54e5391ee61b810827da319a6c diff --git a/uip/rcvdist.c b/uip/rcvdist.c index 9038d5f..89ed029 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -1,4 +1,3 @@ - /* * rcvdist.c -- asynchronously redistribute messages * @@ -15,13 +14,13 @@ #include static struct swit switches[] = { -#define FORMSW 0 - { "form formfile", 4 }, -#define VERSIONSW 1 - { "version", 0 }, -#define HELPSW 2 - { "help", 0 }, - { NULL, 0 } +#define FORMSW 0 + { "form formfile", 4 }, +#define VERSIONSW 1 + { "version", 0 }, +#define HELPSW 2 + { "help", 0 }, + { NULL, 0 } }; static char backup[BUFSIZ] = ""; @@ -38,105 +37,105 @@ static void unlink_done (int) NORETURN; int main (int argc, char **argv) { - pid_t child_id; - int i, vecp = 1; - char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ]; - char **argp, **arguments, *vec[MAXARGS]; - FILE *fp; - char *tfile = NULL; + pid_t child_id; + int i, vecp = 1; + char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ]; + char **argp, **arguments, *vec[MAXARGS]; + FILE *fp; + char *tfile = NULL; - done=unlink_done; + done=unlink_done; #ifdef LOCALE - setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); #endif - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); - - mts_init (invo_name); - arguments = getarguments (invo_name, argc, argv, 1); - argp = arguments; - - while ((cp = *argp++)) { - if (*cp == '-') { - switch (smatch (++cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - done (1); - case UNKWNSW: - vec[vecp++] = --cp; - continue; - - case HELPSW: - snprintf (buf, sizeof(buf), - "%s [switches] [switches for postproc] address ...", - invo_name); - print_help (buf, switches, 1); - done (1); - case VERSIONSW: - print_version(invo_name); - done (1); - - case FORMSW: - if (!(form = *argp++) || *form == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - } + invo_name = r1bindex (argv[0], '/'); + + /* read user profile/context */ + context_read(); + + mts_init (invo_name); + arguments = getarguments (invo_name, argc, argv, 1); + argp = arguments; + + while ((cp = *argp++)) { + if (*cp == '-') { + switch (smatch (++cp, switches)) { + case AMBIGSW: + ambigsw (cp, switches); + done (1); + case UNKWNSW: + vec[vecp++] = --cp; + continue; + + case HELPSW: + snprintf (buf, sizeof(buf), + "%s [switches] [switches for postproc] address ...", + invo_name); + print_help (buf, switches, 1); + done (1); + case VERSIONSW: + print_version(invo_name); + done (1); + + case FORMSW: + if (!(form = *argp++) || *form == '-') + adios (NULL, "missing argument to %s", argp[-2]); + continue; + } + } + addrs = addrs ? add (cp, add (", ", addrs)) : getcpy (cp); } - addrs = addrs ? add (cp, add (", ", addrs)) : getcpy (cp); - } - if (addrs == NULL) - adios (NULL, "usage: %s [switches] [switches for postproc] address ...", - invo_name); + if (addrs == NULL) + adios (NULL, "usage: %s [switches] [switches for postproc] address ...", + invo_name); - umask (~m_gmprot ()); + umask (~m_gmprot ()); - tfile = m_mktemp2(NULL, invo_name, NULL, &fp); - if (tfile == NULL) adios("rcvdist", "unable to create temporary file"); - strncpy (tmpfil, tfile, sizeof(tmpfil)); + tfile = m_mktemp2(NULL, invo_name, NULL, &fp); + if (tfile == NULL) adios("rcvdist", "unable to create temporary file"); + strncpy (tmpfil, tfile, sizeof(tmpfil)); - cpydata (fileno (stdin), fileno (fp), "message", tmpfil); - fseek (fp, 0L, SEEK_SET); + cpydata (fileno (stdin), fileno (fp), "message", tmpfil); + fseek (fp, 0L, SEEK_SET); - tfile = m_mktemp2(NULL, invo_name, NULL, NULL); - if (tfile == NULL) adios("forw", "unable to create temporary file"); - strncpy (drft, tfile, sizeof(tmpfil)); + tfile = m_mktemp2(NULL, invo_name, NULL, NULL); + if (tfile == NULL) adios("forw", "unable to create temporary file"); + strncpy (drft, tfile, sizeof(tmpfil)); - rcvdistout (fp, form, addrs); - fclose (fp); + rcvdistout (fp, form, addrs); + fclose (fp); - if (distout (drft, tmpfil, backup) == NOTOK) - done (1); + if (distout (drft, tmpfil, backup) == NOTOK) + done (1); - vec[0] = r1bindex (postproc, '/'); - vec[vecp++] = "-dist"; - vec[vecp++] = drft; - vec[vecp] = NULL; + vec[0] = r1bindex (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); + 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)); - } + default: + done (pidXwait(child_id, postproc)); + } - return 0; /* dead code to satisfy the compiler */ + return 0; /* dead code to satisfy the compiler */ } /* very similar to routine in replsbr.c */ -#define SBUFSIZ 256 +#define SBUFSIZ 256 static int outputlinelen = OUTPUTLINELEN; @@ -149,141 +148,140 @@ static struct comp **used_buf = 0; static int dat[5]; static char *addrcomps[] = { - "from", - "sender", - "reply-to", - "to", - "cc", - "bcc", - "resent-from", - "resent-sender", - "resent-reply-to", - "resent-to", - "resent-cc", - "resent-bcc", - NULL + "from", + "sender", + "reply-to", + "to", + "cc", + "bcc", + "resent-from", + "resent-sender", + "resent-reply-to", + "resent-to", + "resent-cc", + "resent-bcc", + NULL }; static void rcvdistout (FILE *inb, char *form, char *addrs) { - register int char_read = 0, format_len, i, state; - register char *tmpbuf, **nxtbuf, **ap; - char *cp, *scanl, name[NAMESZ]; - register struct comp *cptr, **savecomp; - FILE *out; - - if (!(out = fopen (drft, "w"))) - adios (drft, "unable to create"); - - /* get new format string */ - cp = new_fs (form ? form : rcvdistcomps, NULL, NULL); - format_len = strlen (cp); - ncomps = fmt_compile (cp, &fmt) + 1; - if (!(nxtbuf = compbuffers = (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 *)))) - adios (NULL, "unable to allocate component buffer stack"); - savecomp += ncomps + 1; - *--savecomp = 0; - - for (i = ncomps; i--;) - *nxtbuf++ = mh_xmalloc (SBUFSIZ); - nxtbuf = compbuffers; - tmpbuf = *nxtbuf++; - - for (ap = addrcomps; *ap; ap++) { - FINDCOMP (cptr, *ap); - if (cptr) - cptr->c_type |= CT_ADDR; - } - - FINDCOMP (cptr, "addresses"); - if (cptr) - cptr->c_text = addrs; - - for (state = FLD;;) { - switch (state = m_getfld (state, name, tmpbuf, SBUFSIZ, inb)) { - case FLD: - case FLDPLUS: - 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); - } - 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); - break; - - case LENERR: - case FMTERR: - case BODY: - case FILEEOF: - goto finished; + register int char_read = 0, format_len, i, state; + register char *tmpbuf, **nxtbuf, **ap; + char *cp, *scanl, name[NAMESZ]; + register struct comp *cptr, **savecomp; + FILE *out; + + if (!(out = fopen (drft, "w"))) + adios (drft, "unable to create"); + + /* get new format string */ + cp = new_fs (form ? form : rcvdistcomps, NULL, NULL); + format_len = strlen (cp); + ncomps = fmt_compile (cp, &fmt) + 1; + if (!(nxtbuf = compbuffers = (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 *)))) + adios (NULL, "unable to allocate component buffer stack"); + savecomp += ncomps + 1; + *--savecomp = 0; + + for (i = ncomps; i--;) + *nxtbuf++ = mh_xmalloc (SBUFSIZ); + nxtbuf = compbuffers; + tmpbuf = *nxtbuf++; + + for (ap = addrcomps; *ap; ap++) { + FINDCOMP (cptr, *ap); + if (cptr) + cptr->c_type |= CT_ADDR; + } - default: - adios (NULL, "m_getfld() returned %d", state); + FINDCOMP (cptr, "addresses"); + if (cptr) + cptr->c_text = addrs; + + for (state = FLD;;) { + switch (state = m_getfld (state, name, tmpbuf, SBUFSIZ, inb)) { + case FLD: + case FLDPLUS: + 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); + } + 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); + break; + + case LENERR: + case FMTERR: + case BODY: + case FILEEOF: + goto finished; + + default: + adios (NULL, "m_getfld() returned %d", state); + } } - } finished: ; - i = format_len + char_read + 256; - scanl = mh_xmalloc ((size_t) i + 2); - dat[0] = dat[1] = dat[2] = dat[4] = 0; - dat[3] = outputlinelen; - fmt_scan (fmt, scanl, i, dat); - fputs (scanl, out); - - if (ferror (out)) - adios (drft, "error writing"); - fclose (out); - - free (scanl); - for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); nxtbuf++, i--) - free (cptr->c_text); - while (i-- > 0) - free (*nxtbuf++); - free ((char *) compbuffers); - free ((char *) used_buf); + i = format_len + char_read + 256; + scanl = mh_xmalloc ((size_t) i + 2); + dat[0] = dat[1] = dat[2] = dat[4] = 0; + dat[3] = outputlinelen; + fmt_scan (fmt, scanl, i, dat); + fputs (scanl, out); + + if (ferror (out)) + adios (drft, "error writing"); + fclose (out); + + free (scanl); + for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); nxtbuf++, i--) + free (cptr->c_text); + while (i-- > 0) + free (*nxtbuf++); + free ((char *) compbuffers); + free ((char *) used_buf); } static void unlink_done (int status) { - if (backup[0]) - unlink (backup); - if (drft[0]) - unlink (drft); - if (tmpfil[0]) - unlink (tmpfil); - - exit (status ? RCV_MBX : RCV_MOK); + if (backup[0]) + unlink (backup); + if (drft[0]) + unlink (drft); + if (tmpfil[0]) + unlink (tmpfil); + + exit (status ? RCV_MBX : RCV_MOK); }