X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frepl.c;h=f5df9ecbaa43833db04ef6d29b9ceeca1bb18557;hp=1a0e1430d881b0ea59eaf9d59446ab85d060b384;hb=6e7d34c614291079de750ceda1d4f5ec537beb81;hpb=88a0787554de9c618e657c31940e734178a25730 diff --git a/uip/repl.c b/uip/repl.c index 1a0e143..f5df9ec 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -12,55 +12,51 @@ #include #include /* L_SET */ #include - +#include +#include +#include +#include +#include static struct swit switches[] = { #define GROUPSW 0 { "group", 0 }, #define NGROUPSW 1 - { "nogroup", 0 }, + { "nogroup", 2 }, #define ANNOSW 2 { "annotate", 0 }, #define NANNOSW 3 - { "noannotate", 0 }, + { "noannotate", 2 }, #define CCSW 4 { "cc all|to|cc|me", 0 }, #define NCCSW 5 - { "nocc type", 0 }, + { "nocc type", 2 }, #define EDITRSW 6 { "editor editor", 0 }, -#define NEDITSW 7 - { "noedit", 0 }, -#define FILTSW 8 +#define FILTSW 7 { "filter filterfile", 0 }, -#define NFILTSW 9 - { "nofilter", 0 }, -#define FORMSW 10 +#define NFILTSW 8 + { "nofilter", 2 }, +#define FORMSW 9 { "form formfile", 0 }, -#define MIMESW 11 +#define MIMESW 10 { "mime", 0 }, -#define NMIMESW 12 - { "nomime", 0 }, -#define QURYSW 13 +#define NMIMESW 11 + { "nomime", 2 }, +#define QURYSW 12 { "query", 0 }, -#define NQURYSW 14 - { "noquery", 0 }, -#define WHATSW 15 +#define NQURYSW 13 + { "noquery", 2 }, +#define WHATSW 14 { "whatnowproc program", 0 }, -#define NWHATSW 16 - { "nowhatnowproc", 0 }, -#define VERSIONSW 17 - { "version", 0 }, -#define HELPSW 18 +#define VERSIONSW 15 + { "Version", 0 }, +#define HELPSW 16 { "help", 0 }, -#define FILESW 19 +#define FILESW 17 { "file file", 4 }, /* interface from msh */ - -#ifdef MHE -#define BILDSW 20 +#define BILDSW 18 { "build", 5 }, /* interface from mhe */ -#endif - { NULL, 0 } }; @@ -101,7 +97,7 @@ static int dftype=0; static char *badaddrs = NULL; static char *dfhost = NULL; -static struct mailname mq = { NULL }; +static struct mailname mq; static struct format *fmt; @@ -133,7 +129,7 @@ static char *addrcomps[] = { static void docc(char *, int); static int insert(struct mailname *); static void replfilter(FILE *, FILE *, char *); -static void replout(FILE *, char *, char *, struct msgs *, int, +static void replout(FILE *, char *, struct msgs *, int, char *, char *); @@ -141,23 +137,17 @@ int main(int argc, char **argv) { int anot = 0; - int nedit = 0, nwhat = 0; char *cp, *cwd, *maildir, *file = NULL; char *folder = NULL, *msg = NULL; char *ed = NULL, drft[BUFSIZ], buf[BUFSIZ]; char **argp, **arguments; struct msgs *mp = NULL; FILE *in; + int buildsw = 0; filter = getcpy(etcpath(mhlreply)); -#ifdef MHE - int buildsw = 0; -#endif /* MHE */ - -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -171,17 +161,17 @@ 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] [msg] [switches]", invo_name); print_help(buf, switches, 1); - done(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case GROUPSW: groupreply++; @@ -199,59 +189,51 @@ main(int argc, char **argv) case CCSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); docc(cp, 1); continue; case NCCSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); docc(cp, 0); continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); - nedit = 0; - continue; - case NEDITSW: - nedit++; continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); - nwhat = 0; continue; -#ifdef MHE + case BILDSW: - buildsw++; /* fall... */ -#endif /* MHE */ - case NWHATSW: - nwhat++; + buildsw++; continue; case FILESW: if (file) - adios(NULL, "only one file at a time!"); + adios(EX_USAGE, NULL, "only one file at a time!"); if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = getcpy(expanddir(cp)); continue; case FORMSW: if (!(form = *argp++) || *form == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case FILTSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); filter = getcpy(etcpath(cp)); continue; @@ -277,12 +259,12 @@ 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 (msg) - adios(NULL, "only one message at a time!"); + adios(EX_USAGE, NULL, "only one message at a time!"); else msg = cp; } @@ -298,14 +280,16 @@ main(int argc, char **argv) cwd = getcpy(pwd()); if (file && (msg || folder)) - adios(NULL, "can't mix files and folders/msgs"); + adios(EX_USAGE, NULL, "can't mix files and folders/msgs"); -#ifdef MHE - strncpy(drft, buildsw ? toabsdir("reply") - : m_draft(seq_beyond), sizeof(drft)); -#else - strncpy(drft, m_draft(seq_beyond), sizeof(drft)); -#endif /* MHE */ + strncpy(drft, buildsw ? toabsdir("reply") : m_draft(seq_beyond), + sizeof(drft)); + /* + ** FIXME: (concerning MHE support (buildsw) only) + ** There's no check if the draft already exists. mmh has removed + ** this case by having the draft folder. I won't add code only to + ** handle this legacy issue for MHE. -- meillo@marmaro.de 2012-05 + */ if (file) { /* @@ -323,23 +307,23 @@ 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 the message range/sequence/name and set SELECTED */ if (!m_convert(mp, msg)) - done(1); + exit(EX_SOFTWARE); seq_setprev(mp); /* set the previous-sequence */ if (mp->numsel > 1) - adios(NULL, "only one message at a time!"); + adios(EX_USAGE, NULL, "only one message at a time!"); context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->lowsel); /* update current message */ @@ -350,7 +334,7 @@ main(int argc, char **argv) msg = file ? file : getcpy(m_name(mp->lowsel)); if ((in = fopen(msg, "r")) == NULL) - adios(msg, "unable to open"); + adios(EX_IOERR, msg, "unable to open"); /* find form (components) file */ if (!form) { @@ -360,15 +344,13 @@ main(int argc, char **argv) form = etcpath(replcomps); } - replout(in, msg, drft, mp, mime, form, filter); + replout(in, drft, mp, mime, form, filter); fclose(in); - if (nwhat) - done(0); - what_now(ed, nedit, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL, - cwd); - done(1); - return 1; + if (buildsw) + exit(EX_OK); + what_now(ed, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL, cwd); + return EX_OSERR; } static void @@ -377,9 +359,9 @@ docc(char *cp, int ccflag) switch (smatch(cp, ccswitches)) { case AMBIGSW: ambigsw(cp, ccswitches); - done(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%scc %s unknown", ccflag ? "" : "no", cp); + adios(EX_USAGE, NULL, "-%scc %s unknown", ccflag ? "" : "no", cp); case CTOSW: ccto = ccflag; @@ -403,15 +385,15 @@ docc(char *cp, int ccflag) static void -replout(FILE *inb, char *msg, char *drft, struct msgs *mp, +replout(FILE *inb, char *drft, struct msgs *mp, int mime, char *form, char *filter) { - register int state, i; - register struct comp *cptr; - register char *tmpbuf; - register char **nxtbuf; - register char **ap; - register struct comp **savecomp; + int state, i; + struct comp *cptr; + char *tmpbuf; + char **nxtbuf; + char **ap; + struct comp **savecomp; int char_read = 0, format_len, mask; char name[NAMESZ], *scanl; unsigned char *cp; @@ -419,7 +401,7 @@ replout(FILE *inb, char *msg, char *drft, struct msgs *mp, mask = umask(~m_gmprot()); if ((out = fopen(drft, "w")) == NULL) - adios(drft, "unable to create"); + adios(EX_CANTCREAT, drft, "unable to create"); umask(mask); @@ -430,12 +412,10 @@ replout(FILE *inb, char *msg, char *drft, struct msgs *mp, /* compile format string */ 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 = NULL; /* point at zero'd end minus 1 */ @@ -531,7 +511,7 @@ replout(FILE *inb, char *msg, char *drft, struct msgs *mp, goto finished; default: - adios(NULL, "m_getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state); } } @@ -545,7 +525,7 @@ finished: */ FINDCOMP(cptr, "subject") if (cptr && (cp = cptr->c_text)) { - register char *sp = cp; + char *sp = cp; for (;;) { while (isspace(*cp)) @@ -580,14 +560,14 @@ finished: if (filter) { fflush(out); if (ferror(out)) - adios(drft, "error writing"); + adios(EX_IOERR, drft, "error writing"); replfilter(inb, out, filter); } fflush(out); if (ferror(out)) - adios(drft, "error writing"); + adios(EX_IOERR, drft, "error writing"); fclose(out); if (mime && mp) { @@ -596,7 +576,11 @@ finished: snprintf(buffer, sizeof buffer, "+%s %s", mp->foldpath, m_name(mp->lowsel)); - annotate(drft, attach_hdr, buffer, 0, -2, 1, 0); + if (execprogl("anno", "anno", "-append", "-nodate", + drft, "-comp", attach_hdr, "-text", buffer, + (char *)NULL) != 0) { + advise(NULL, "unable to add attachment header"); + } } /* return dynamically allocated buffers */ @@ -652,13 +636,13 @@ static unsigned int bufsiz=0; /* current size of buf */ char * formataddr(char *orig, char *str) { - register int len; + int len; char baddr[BUFSIZ], error[BUFSIZ]; - register int isgroup; - register char *dst; - register char *cp; - register char *sp; - register struct mailname *mp = NULL; + int isgroup; + char *dst; + char *cp; + char *sp; + struct mailname *mp = NULL; /* if we don't have a buffer yet, get one */ if (bufsiz == 0) { @@ -724,7 +708,7 @@ static int insert(struct mailname *np) { char buffer[BUFSIZ]; - register struct mailname *mp; + struct mailname *mp; if (np->m_mbox == NULL) return 0; @@ -741,64 +725,54 @@ insert(struct mailname *np) snprintf(buffer, sizeof(buffer), "Reply to %s? ", adrformat(np)); if (!gans(buffer, anoyes)) - return 0; + return 0; } mp->m_next = np; - -#ifdef ISI - if (ismymbox(np)) - ccme = 0; -#endif - return 1; } /* -** Call the mhlproc +** Call mhl ** ** This function expects that argument out has been fflushed by the caller. */ - static void replfilter(FILE *in, FILE *out, char *filter) { - int pid; - char *mhl; + int pid, n; char *errstr; if (filter == NULL) return; if (access(filter, R_OK) == NOTOK) - adios(filter, "unable to read"); - - mhl = mhbasename(mhlproc); + adios(EX_IOERR, filter, "unable to read"); rewind(in); lseek(fileno(in), (off_t) 0, SEEK_SET); switch (pid = fork()) { case NOTOK: - adios("fork", "unable to"); + adios(EX_OSERR, "fork", "unable to"); case OK: dup2(fileno(in), fileno(stdin)); dup2(fileno(out), fileno(stdout)); - closefds(3); + for (n=3; n