#include <h/rcvmail.h>
#include <h/tws.h>
#include <h/utils.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <locale.h>
+#include <sysexits.h>
static struct swit switches[] = {
#define FORMSW 0
- { "form formfile", 4 },
+ { "form formfile", 0 },
#define VERSIONSW 1
- { "version", 0 },
+ { "Version", 0 },
#define HELPSW 2
{ "help", 0 },
{ NULL, 0 }
** prototypes
*/
static void rcvdistout(FILE *, char *, char *);
-static void unlink_done(int) NORETURN;
+void unlink_done();
int
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 */
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(EX_USAGE);
case UNKWNSW:
vec[vecp++] = --cp;
continue;
case HELPSW:
- snprintf(buf, sizeof(buf), "%s [switches] [switches for postproc] address ...", invo_name);
+ 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;
}
if (!addrs) {
- adios(NULL, "usage: %s [switches] [switches for postproc] 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] = mhbasename(postproc);
+ vec[0] = "spost";
vec[vecp++] = "-dist";
vec[vecp++] = drft;
vec[vecp] = NULL;
- execvp(postproc, vec);
+ execvp(*vec, vec);
fprintf(stderr, "unable to exec ");
- perror(postproc);
- _exit(1);
+ perror(*vec);
+ _exit(EX_OSERR);
return 0; /* dead code to satisfy the compiler */
}
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 */
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");
+ (char **) mh_xcalloc((size_t) ncomps, sizeof(char *)))) {
+ adios(EX_OSERR, NULL, "unable to allocate component buffers");
}
if (!(savecomp = used_buf =
- (struct comp **) calloc((size_t) (ncomps + 1),
+ (struct comp **) mh_xcalloc((size_t) (ncomps + 1),
sizeof(struct comp *)))) {
- adios(NULL, "unable to allocate component buffer stack");
+ adios(EX_OSERR, NULL, "unable to allocate component buffer stack");
}
savecomp += ncomps + 1;
*--savecomp = 0;
goto finished;
default:
- adios(NULL, "m_getfld() returned %d", state);
+ adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state);
}
}
finished: ;
fputs(scanl, out);
if (ferror(out)) {
- adios(drft, "error writing");
+ adios(EX_IOERR, drft, "error writing");
}
fclose(out);
}
-static void
-unlink_done(int status)
+void
+unlink_done()
{
if (*backup) {
unlink(backup);
if (*tmpfil) {
unlink(tmpfil);
}
- exit(status ? RCV_MBX : RCV_MOK);
}