X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhshow.c;h=bb03939cce43e199722234c2b963e4c6909f98f6;hp=1ee5c82f5198a0f34a5276d99b23ef1195a8c519;hb=6e7d34c614291079de750ceda1d4f5ec537beb81;hpb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a diff --git a/uip/mhshow.c b/uip/mhshow.c index 1ee5c82..bb03939 100644 --- a/uip/mhshow.c +++ b/uip/mhshow.c @@ -15,12 +15,16 @@ #include #include #include +#include +#include +#include +#include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 - { "noverbose", 0 }, + { "noverbose", 2 }, #define FILESW 2 /* interface from show */ { "file file", 0 }, #define FORMSW 3 @@ -75,7 +79,7 @@ void show_all_messages(CT *); /* mhfree.c */ void free_content(CT); extern CT *cts; -void freects_done(int) NORETURN; +void freects_done(); /* ** static prototypes @@ -98,11 +102,11 @@ main(int argc, char **argv) FILE *fp; int ontty = 0; - done=freects_done; + if (atexit(freects_done) != 0) { + adios(EX_OSERR, NULL, "atexit failed"); + } -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(argv[0]); if (mh_strcasecmp(invo_name, "next")==0) { mode = NEXT; @@ -124,50 +128,50 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - done(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown", cp); + adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] %s[switches]", invo_name, mode==SHOW ? "[msgs] " : ""); 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 PARTSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (npart >= NPARTS) - adios(NULL, "too many parts (starting with %s), %d max", cp, NPARTS); + adios(EX_USAGE, NULL, "too many parts (starting with %s), %d max", cp, NPARTS); parts[npart++] = cp; continue; case TYPESW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (ntype >= NTYPES) - adios(NULL, "too many types (starting with %s), %d max", cp, NTYPES); + adios(EX_USAGE, NULL, "too many types (starting with %s), %d max", cp, NTYPES); types[ntype++] = cp; continue; case FILESW: if (mode != SHOW) { - adios(NULL, "Either call show as `%s' or use -file", invo_name); + adios(EX_USAGE, NULL, "Either call show as `%s' or use -file", invo_name); } if (!(cp = *argp++) || (*cp == '-' && cp[1])) - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = *cp == '-' ? cp : getcpy(expanddir(cp)); continue; case FORMSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (formsw) free(formsw); @@ -187,11 +191,11 @@ main(int argc, char **argv) } if (*cp == '+' || *cp == '@') { if (folder) - adios(NULL, "only one folder at a time!"); + adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = getcpy(expandfol(cp)); } else if (mode != SHOW) { - adios(NULL, "Either call show as `%s' or give message arguments", invo_name); + adios(EX_USAGE, NULL, "Either call show as `%s' or give message arguments", invo_name); } else { app_msgarg(&msgs, cp); } @@ -239,14 +243,13 @@ main(int argc, char **argv) tmp = getcpy(toabsdir(invo_name)); if (file && msgs.size) - adios(NULL, "cannot specify msg and file at same time!"); + adios(EX_USAGE, NULL, "cannot specify msg and file at same time!"); /* ** check if message is coming from file */ if (file) { - if (!(cts = (CT *) calloc((size_t) 2, sizeof(*cts)))) - adios(NULL, "out of memory"); + cts = (CT *) mh_xcalloc((size_t) 2, sizeof(*cts)); ctp = cts; if ((ct = parse_mime(file))) @@ -273,20 +276,20 @@ main(int argc, char **argv) maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) - adios(maildir, "unable to change directory to"); + adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) - adios(NULL, "unable to read folder %s", folder); + adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) - adios(NULL, "no messages in %s", folder); + adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) - done(1); + exit(EX_USAGE); /* ** Set the SELECT_UNSEEN bit for all the SELECTED messages, @@ -300,9 +303,8 @@ main(int argc, char **argv) seq_setprev(mp); /* set the Previous-Sequence */ seq_setunseen(mp, 0); /* unset unseen seqs for shown msgs */ - if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1), - sizeof(*cts)))) - adios(NULL, "out of memory"); + cts = (CT *) mh_xcalloc((size_t) (mp->numsel + 1), + sizeof(*cts)); ctp = cts; /* @@ -320,7 +322,7 @@ main(int argc, char **argv) } if (!*cts) - done(1); + exit(EX_SOFTWARE); userrs = 1; SIGNAL(SIGQUIT, quitser); @@ -369,8 +371,7 @@ main(int argc, char **argv) context_save(); /* save the context file */ } - done(0); - return 1; + return 0; } @@ -384,7 +385,7 @@ pipeser(int i) fflush(stderr); } - done(1); + _exit(EX_IOERR); /* NOTREACHED */ } @@ -399,14 +400,14 @@ m_popen(char *name) int pd[2]; if ((sd = dup(fileno(stdout))) == NOTOK) - adios("standard output", "unable to dup()"); + adios(EX_OSERR, "standard output", "unable to dup()"); if (pipe(pd) == NOTOK) - adios("pipe", "unable to"); + adios(EX_OSERR, "pipe", "unable to"); switch (m_pid = fork()) { case NOTOK: - adios("fork", "unable to"); + adios(EX_OSERR, "fork", "unable to"); case OK: SIGNAL(SIGINT, SIG_DFL); @@ -420,7 +421,7 @@ m_popen(char *name) execlp(name, mhbasename(name), NULL); fprintf(stderr, "unable to exec "); perror(name); - _exit(-1); + _exit(EX_OSERR); default: close(pd[0]); @@ -441,7 +442,7 @@ m_pclose(void) if (sd != NOTOK) { fflush(stdout); if (dup2(sd, fileno(stdout)) == NOTOK) - adios("standard output", "unable to dup2()"); + adios(EX_OSERR, "standard output", "unable to dup2()"); clearerr(stdout); close(sd);