X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frcvdist.c;h=53cc0f0cd8e9302dbcdbfc1ff7eb7eea106cdd13;hp=d409b5cb59de4532ce5748d25ad3d6724d24b961;hb=6e7d34c614291079de750ceda1d4f5ec537beb81;hpb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a diff --git a/uip/rcvdist.c b/uip/rcvdist.c index d409b5c..53cc0f0 100644 --- a/uip/rcvdist.c +++ b/uip/rcvdist.c @@ -11,10 +11,14 @@ #include #include #include +#include +#include +#include +#include static struct swit switches[] = { #define FORMSW 0 - { "form formfile", 4 }, + { "form formfile", 0 }, #define VERSIONSW 1 { "Version", 0 }, #define HELPSW 2 @@ -30,7 +34,7 @@ static char tmpfil[BUFSIZ] = ""; ** prototypes */ static void rcvdistout(FILE *, char *, char *); -static void unlink_done(int) NORETURN; +void unlink_done(); int @@ -42,11 +46,11 @@ main(int argc, char **argv) FILE *fp; char *tfile = NULL; - done=unlink_done; + if (atexit(unlink_done) != 0) { + adios(EX_OSERR, NULL, "atexit failed"); + } -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -60,7 +64,7 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - done(1); + exit(EX_USAGE); case UNKWNSW: vec[vecp++] = --cp; continue; @@ -68,14 +72,14 @@ main(int argc, char **argv) case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [switches for spost] address ...", invo_name); print_help(buf, switches, 1); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - done(1); + 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; @@ -85,27 +89,27 @@ main(int argc, char **argv) } 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) { - done(1); + exit(EX_IOERR); } vec[0] = "spost"; @@ -116,7 +120,7 @@ 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 */ } @@ -152,29 +156,25 @@ 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; + int char_read = 0, format_len, i, state; + char *tmpbuf, **nxtbuf, **ap; char *cp, *scanl, name[NAMESZ]; - register struct comp *cptr, **savecomp; + struct comp *cptr, **savecomp; 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"); - } + nxtbuf = compbuffers = + (char **) mh_xcalloc((size_t) ncomps, sizeof(char *)); + savecomp = used_buf = + (struct comp **) mh_xcalloc((size_t) (ncomps + 1), + sizeof(struct comp *)); savecomp += ncomps + 1; *--savecomp = 0; @@ -246,7 +246,7 @@ rcvdistout(FILE *inb, char *form, char *addrs) goto finished; default: - adios(NULL, "m_getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state); } } finished: ; @@ -259,7 +259,7 @@ finished: ; fputs(scanl, out); if (ferror(out)) { - adios(drft, "error writing"); + adios(EX_IOERR, drft, "error writing"); } fclose(out); @@ -276,8 +276,8 @@ finished: ; } -static void -unlink_done(int status) +void +unlink_done() { if (*backup) { unlink(backup); @@ -288,5 +288,4 @@ unlink_done(int status) if (*tmpfil) { unlink(tmpfil); } - exit(status ? RCV_MBX : RCV_MOK); }