X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frepl.c;h=bbc3cfe83be6a59f3d93ac5dc08ed2eddcc8fab7;hp=9c9e5ce9e247eb6400d500f858d4dd53668f608c;hb=a87df3543d3bc128ba4079d1f95638476ba5ca50;hpb=ccf4f175ef4c4e7522f9510a4a1149c15d810dd9 diff --git a/uip/repl.c b/uip/repl.c index 9c9e5ce..bbc3cfe 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -12,7 +12,11 @@ #include #include /* L_SET */ #include - +#include +#include +#include +#include +#include static struct swit switches[] = { #define GROUPSW 0 @@ -68,15 +72,6 @@ static struct swit ccswitches[] = { { NULL, 0 } }; -/* -** Buffer size for content part of header fields. -** We want this to be large enough so that we don't -** do a lot of extra FLDPLUS calls on m_getfld but -** small enough so that we don't snarf the entire -** message body when we're not going to use any of it. -*/ -#define SBUFSIZ 256 - static short ccto = -1; static short cccc = -1; static short ccme = -1; @@ -98,8 +93,6 @@ static struct mailname mq; static struct format *fmt; static int ncomps = 0; /* # of interesting components */ -static char **compbuffers = NULL; /* buffers for component text */ -static struct comp **used_buf = NULL; /* stack for comp that use buffers */ static int dat[5]; /* aux. data for format routine */ @@ -157,17 +150,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++; @@ -185,27 +178,27 @@ 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]); continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; @@ -215,21 +208,21 @@ main(int argc, char **argv) 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; @@ -255,12 +248,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; } @@ -276,7 +269,7 @@ 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"); strncpy(drft, buildsw ? toabsdir("reply") : m_draft(seq_beyond), sizeof(drft)); @@ -303,23 +296,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 */ @@ -330,7 +323,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) { @@ -344,10 +337,9 @@ main(int argc, char **argv) fclose(in); if (buildsw) - done(0); + exit(EX_OK); what_now(ed, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL, cwd); - done(1); - return 1; + return EX_OSERR; } static void @@ -356,9 +348,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; @@ -385,20 +377,19 @@ static void 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; + enum state state; + struct field f = free_field; + int i; + struct comp *cptr; + char **ap; int char_read = 0, format_len, mask; - char name[NAMESZ], *scanl; + char *scanl; unsigned char *cp; FILE *out; mask = umask(~m_gmprot()); if ((out = fopen(drft, "w")) == NULL) - adios(drft, "unable to create"); + adios(EX_CANTCREAT, drft, "unable to create"); umask(mask); @@ -409,21 +400,6 @@ replout(FILE *inb, 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"); - savecomp += ncomps + 1; - *--savecomp = NULL; /* point at zero'd end minus 1 */ - - for (i = ncomps; i--; ) - *nxtbuf++ = mh_xmalloc(SBUFSIZ); - - nxtbuf = compbuffers; /* point at start */ - tmpbuf = *nxtbuf++; - for (ap = addrcomps; *ap; ap++) { FINDCOMP(cptr, *ap); if (cptr) @@ -454,11 +430,10 @@ replout(FILE *inb, char *drft, struct msgs *mp, /* ** pick any interesting stuff out of msg "inb" */ - for (state = FLD;;) { - state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb); + for (state = FLD2;;) { + state = m_getfld2(state, &f, inb); switch (state) { - case FLD: - case FLDPLUS: + case FLD2: /* ** if we're interested in this component, save ** a pointer to the component text, then start @@ -466,51 +441,45 @@ replout(FILE *inb, char *drft, struct msgs *mp, ** temp buffer (buffer switching saves an extra ** copy of the component text). */ - if ((cptr = wantcomp[CHASH(name)])) + if ((cptr = wantcomp[CHASH(f.name)])) { do { - if (!mh_strcasecmp(name, cptr->c_name)) { - char_read += msg_count; - if (! cptr->c_text) { - i = strlen(cptr->c_text = tmpbuf) - 1; - if (tmpbuf[i] == '\n') - tmpbuf[i] = '\0'; - *--savecomp = cptr; - tmpbuf = *nxtbuf++; - } else { - i = strlen(cp = cptr->c_text) - 1; - if (cp[i] == '\n') { - if (cptr->c_type & CT_ADDR) { - cp[i] = '\0'; - cp = add(",\n\t", cp); - } else { - cp = add("\t", cp); - } - } - cptr->c_text = add(tmpbuf, cp); + if (mh_strcasecmp(f.name, cptr->c_name)!=0) { + continue; + } + char_read += strlen(f.value); + if (!cptr->c_text) { + cptr->c_text = getcpy(f.value); + i = strlen(cptr->c_text) - 1; + if (cptr->c_text[i] == '\n') { + cptr->c_text[i] = '\0'; } - while (state == FLDPLUS) { - state = m_getfld(state, name, tmpbuf, - SBUFSIZ, inb); - cptr->c_text = add(tmpbuf, cptr->c_text); - char_read += msg_count; + } else { + cp = cptr->c_text; + i = strlen(cp) - 1; + if (cp[i] == '\n') { + if (cptr->c_type & CT_ADDR) { + cp[i] = '\0'; + cp = add(",\n\t", cp); + } else { + cp = add("\t", cp); + } } - break; + 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); } } @@ -524,7 +493,7 @@ finished: */ FINDCOMP(cptr, "subject") if (cptr && (cp = cptr->c_text)) { - register char *sp = cp; + char *sp = cp; for (;;) { while (isspace(*cp)) @@ -559,38 +528,31 @@ 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) { /* add an attachment header */ char buffer[BUFSIZ]; - snprintf(buffer, sizeof buffer, "anno -append -nodate '%s' " - "-comp '%s' -text '+%s %s'", - drft, - attach_hdr, mp->foldpath, m_name(mp->lowsel)); - if (system(buffer) != 0) { + snprintf(buffer, sizeof buffer, "+%s %s", + mp->foldpath, m_name(mp->lowsel)); + 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 */ free(scanl); - for (nxtbuf = compbuffers, i = ncomps; (cptr = *savecomp++); - nxtbuf++, i--) - free(cptr->c_text); /* if not nxtbuf, nxtbuf already freed */ - while ( i-- > 0) - free(*nxtbuf++); /* free unused nxtbufs */ - free((char *) compbuffers); - free((char *) used_buf); } static char *buf; /* our current working buffer */ @@ -635,13 +597,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) { @@ -707,7 +669,7 @@ static int insert(struct mailname *np) { char buffer[BUFSIZ]; - register struct mailname *mp; + struct mailname *mp; if (np->m_mbox == NULL) return 0; @@ -746,14 +708,14 @@ replfilter(FILE *in, FILE *out, char *filter) return; if (access(filter, R_OK) == NOTOK) - adios(filter, "unable to read"); + 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)); @@ -767,11 +729,11 @@ replfilter(FILE *in, FILE *out, char *filter) write(2, "unable to exec mhl: ", 20); write(2, errstr, strlen(errstr)); write(2, "\n", 1); - _exit(-1); + _exit(EX_OSERR); default: if (pidXwait(pid, "mhl")) - done(1); + exit(EX_SOFTWARE); fseek(out, 0L, SEEK_END); break; }