X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frcvdist.c;h=af3fc10d0511ec34a1206bddb674dc26436e4773;hp=4e052ccd09cfceb9a5fb6e9aa36415ec43828957;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=2abb9a7cfb0930e27062088734d306e7d78e4cc2 diff --git a/uip/rcvdist.c b/uip/rcvdist.c index 4e052cc..af3fc10 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -14,6 +14,7 @@ #include #include #include +#include static struct swit switches[] = { #define FORMSW 0 @@ -25,6 +26,8 @@ static struct swit switches[] = { { NULL, 0 } }; +char *version=VERSION; + static char backup[BUFSIZ] = ""; static char drft[BUFSIZ] = ""; static char tmpfil[BUFSIZ] = ""; @@ -46,7 +49,7 @@ main(int argc, char **argv) char *tfile = NULL; if (atexit(unlink_done) != 0) { - adios(NULL, "atexit failed"); + adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); @@ -63,7 +66,7 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - exit(1); + exit(EX_USAGE); case UNKWNSW: vec[vecp++] = --cp; continue; @@ -71,45 +74,44 @@ main(int argc, char **argv) case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [switches for spost] address ...", invo_name); print_help(buf, switches, 1); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') { - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; } } - addrs = addrs ? add(cp, add(", ", addrs)) : getcpy(cp); + addrs = addrs ? add(cp, add(", ", addrs)) : mh_xstrdup(cp); } if (!addrs) { - adios(NULL, "usage: %s [switches] [switches for spost] address ...", invo_name); + adios(EX_USAGE, NULL, "usage: %s [switches] [switches for spost] address ...", invo_name); } umask(~m_gmprot()); tfile = m_mktemp2(NULL, invo_name, NULL, &fp); - if (tfile == NULL) adios("rcvdist", "unable to create temporary file"); + if (tfile == NULL) adios(EX_CANTCREAT, "rcvdist", "unable to create temporary file"); strncpy(tmpfil, tfile, sizeof(tmpfil)); 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"); + if (tfile == NULL) adios(EX_CANTCREAT, "forw", "unable to create temporary file"); strncpy(drft, tfile, sizeof(tmpfil)); rcvdistout(fp, form, addrs); fclose(fp); if (distout(drft, tmpfil, backup) == NOTOK) { - /* sysexits.h EX_DATAERR */ - exit(1); + exit(EX_IOERR); } vec[0] = "spost"; @@ -120,19 +122,15 @@ main(int argc, char **argv) execvp(*vec, vec); fprintf(stderr, "unable to exec "); perror(*vec); - _exit(1); + _exit(EX_OSERR); return 0; /* dead code to satisfy the compiler */ } /* very similar to routine in replsbr.c */ -#define SBUFSIZ 256 - static struct format *fmt; static int ncomps = 0; -static char **compbuffers = 0; -static struct comp **used_buf = 0; static int dat[5]; @@ -156,37 +154,22 @@ static char *addrcomps[] = { 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; + int char_read = 0, format_len, i; + enum state state; + struct field f = {{0}}; + char **ap; + char *cp, *scanl; + struct comp *cptr; FILE *out; if (!(out = fopen(drft, "w"))) { - adios(drft, "unable to create"); + adios(EX_CANTCREAT, 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 *)))) { - 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); @@ -199,22 +182,19 @@ rcvdistout(FILE *inb, char *form, char *addrs) if (cptr) { cptr->c_text = addrs; } - state = FLD; + state = FLD2; while (1) { - state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); + state = m_getfld2(state, &f, inb); switch (state) { - case FLD: - case FLDPLUS: - if ((cptr = wantcomp[CHASH(name)])) { + case FLD2: + if ((cptr = wantcomp[CHASH(f.name)])) { do { - if (mh_strcasecmp(name, cptr->c_name)!=0) { + if (mh_strcasecmp(f.name, cptr->c_name)!=0) { continue; } - char_read += msg_count; + char_read += strlen(f.value); if (!cptr->c_text) { - cptr->c_text = tmpbuf; - *--savecomp = cptr; - tmpbuf = *nxtbuf++; + cptr->c_text = mh_xstrdup(f.value); } else { cp = cptr->c_text; i = strlen(cp) - 1; @@ -226,57 +206,39 @@ rcvdistout(FILE *inb, char *form, char *addrs) 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; + cptr->c_text = add(f.value, cp); } 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: + case LENERR2: + case FMTERR2: + case IOERR2: + case BODY2: + case FILEEOF2: goto finished; default: - adios(NULL, "m_getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state); } } finished: ; i = format_len + char_read + 256; - scanl = mh_xmalloc((size_t) i + 2); + scanl = mh_xcalloc(i + 2, sizeof(char)); 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"); + adios(EX_IOERR, 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(compbuffers); - free(used_buf); + mh_free0(&scanl); }