X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/4a78cbcd4fa986d9c1e7bd0a5a4bdb619faeb7cb..5ed8cd671b27e1388c0c7e881805775a8e5b353a:/uip/rcvdist.c diff --git a/uip/rcvdist.c b/uip/rcvdist.c index 4f7a83f7..1ad585d2 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -1,6 +1,4 @@ - -/* - * rcvdist.c -- asynchronously redistribute messages +/* rcvdist.c -- asynchronously redistribute messages * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -13,6 +11,7 @@ #include #include #include +#include "../sbr/m_mktemp.h" #define RCVDIST_SWITCHES \ X("form formfile", 4, FORMSW) \ @@ -48,15 +47,9 @@ main (int argc, char **argv) FILE *fp; char *tfile = NULL; - done=unlink_done; + if (nmh_init(argv[0], 2)) { return 1; } -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); + done=unlink_done; /* * Configure this now, since any unknown switches to rcvdist get @@ -65,7 +58,7 @@ main (int argc, char **argv) vec = argsplit(postproc, &program, &vecp); - mts_init (invo_name); + mts_init (); arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -95,7 +88,7 @@ main (int argc, char **argv) continue; } } - addrs = addrs ? add (cp, add (", ", addrs)) : getcpy (cp); + addrs = addrs ? add (cp, add (", ", addrs)) : mh_xstrdup(cp); } if (addrs == NULL) @@ -124,18 +117,19 @@ main (int argc, char **argv) done (1); vec[vecp++] = "-dist"; - vec[vecp++] = drft; if ((cp = context_find ("mhlproc"))) { vec[vecp++] = "-mhlproc"; vec[vecp++] = cp; } + 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 */ + inform("unable to fork, continuing..."); + /* FALLTHRU */ case OK: execvp (program, vec); fprintf (stderr, "unable to exec "); @@ -151,8 +145,6 @@ main (int argc, char **argv) /* very similar to routine in replsbr.c */ -#define SBUFSIZ 256 - static int outputlinelen = OUTPUTLINELEN; static struct format *fmt; @@ -179,10 +171,11 @@ static char *addrcomps[] = { static void rcvdistout (FILE *inb, char *form, char *addrs) { - register int char_read = 0, format_len, i, state; - register char **ap; - char *cp, *scanl, name[NAMESZ], tmpbuf[SBUFSIZ]; - register struct comp *cptr; + int char_read = 0, format_len, i, state; + char **ap; + char *cp, name[NAMESZ], tmpbuf[NMH_BUFSIZ]; + charstring_t scanl; + struct comp *cptr; FILE *out; m_getfld_state_t gstate = 0; @@ -205,7 +198,7 @@ rcvdistout (FILE *inb, char *form, char *addrs) cptr->c_text = addrs; for (;;) { - int msg_count = SBUFSIZ; + int msg_count = sizeof tmpbuf; switch (state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb)) { case FLD: case FLDPLUS: @@ -213,7 +206,7 @@ rcvdistout (FILE *inb, char *form, char *addrs) if (i != -1) { char_read += msg_count; while (state == FLDPLUS) { - msg_count = SBUFSIZ; + msg_count = sizeof tmpbuf; state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb); fmt_appendcomp(i, name, tmpbuf); char_read += msg_count; @@ -221,7 +214,7 @@ rcvdistout (FILE *inb, char *form, char *addrs) } while (state == FLDPLUS) { - msg_count = SBUFSIZ; + msg_count = sizeof tmpbuf; state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb); } break; @@ -240,30 +233,30 @@ finished: ; m_getfld_state_destroy (&gstate); i = format_len + char_read + 256; - scanl = mh_xmalloc ((size_t) i + 2); + scanl = charstring_create (i + 2); dat[0] = dat[1] = dat[2] = dat[4] = 0; dat[3] = outputlinelen; - fmt_scan (fmt, scanl, i + 1, i, dat, NULL); - fputs (scanl, out); + fmt_scan (fmt, scanl, i, dat, NULL); + fputs (charstring_buffer (scanl), out); if (ferror (out)) adios (drft, "error writing"); fclose (out); - free (scanl); + charstring_free (scanl); fmt_free(fmt, 1); } -static void +static void NORETURN unlink_done (int status) { if (backup[0]) - unlink (backup); + (void) m_unlink (backup); if (drft[0]) - unlink (drft); + (void) m_unlink (drft); if (tmpfil[0]) - unlink (tmpfil); + (void) m_unlink (tmpfil); exit (status ? RCV_MBX : RCV_MOK); }