-
-/*
- * replsbr.c -- routines to help repl along...
+/* replsbr.c -- routines to help repl along...
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
static struct mailname mq;
static int nodupcheck = 0; /* If set, no check for duplicates */
-/*
- * 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 char *addrcomps[] = {
"from",
"sender",
replout (FILE *inb, char *msg, char *drft, struct msgs *mp, int outputlinelen,
int mime, char *form, char *filter, char *fcc, int fmtproc)
{
- register int state, i;
- register struct comp *cptr;
- char tmpbuf[SBUFSIZ];
+ int state, i;
+ struct comp *cptr;
+ char tmpbuf[NMH_BUFSIZ];
struct format *fmt;
- register char **ap;
+ char **ap;
int char_read = 0, format_len, mask;
- char name[NAMESZ], *scanl, *cp;
+ char name[NAMESZ], *cp;
+ charstring_t scanl;
static int dat[5]; /* aux. data for format routine */
- m_getfld_state_t gstate = 0;
+ m_getfld_state_t gstate;
struct fmt_callbacks cb;
FILE *out;
*
* This prevents the component from being found via fmt_findcomp(),
* which makes sure no text gets added to it when the message is processed.
- *
- * getcpy(NULL) returns a malloc'd zero-length string, so it can safely
- * be free()'d later.
*/
if (!ccto) {
cptr = fmt_findcomp ("to");
if (cptr)
- cptr->c_name = getcpy(NULL);
+ cptr->c_name = mh_xstrdup("");
}
if (!cccc) {
cptr = fmt_findcomp("cc");
if (cptr)
- cptr->c_name = getcpy(NULL);
- }
- /* set up the "fcc" pseudo-component */
- if (fcc) {
- cptr = fmt_findcomp ("fcc");
- if (cptr)
- cptr->c_text = getcpy (fcc);
- }
- if ((cp = getenv("USER"))) {
- cptr = fmt_findcomp ("user");
- if (cptr)
- cptr->c_text = getcpy(cp);
+ cptr->c_name = mh_xstrdup("");
}
if (!ccme)
ismymbox (NULL);
/*
* pick any interesting stuff out of msg "inb"
*/
+ gstate = m_getfld_state_init(inb);
for (;;) {
int msg_count = sizeof tmpbuf;
- state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb);
+ state = m_getfld2(&gstate, name, tmpbuf, &msg_count);
switch (state) {
- case FLD:
- case FLDPLUS:
+ case FLD:
+ case FLDPLUS:
/*
* if we're interested in this component, save a pointer
* to the component text, then start using our next free
char_read += msg_count;
while (state == FLDPLUS) {
msg_count= sizeof tmpbuf;
- state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb);
+ state = m_getfld2(&gstate, name, tmpbuf, &msg_count);
fmt_appendcomp(i, name, tmpbuf);
char_read += msg_count;
}
while (state == FLDPLUS) {
msg_count= sizeof tmpbuf;
- state = m_getfld (&gstate, name, tmpbuf, &msg_count, inb);
+ state = m_getfld2(&gstate, name, tmpbuf, &msg_count);
}
break;
- case LENERR:
- case FMTERR:
- case BODY:
+ case LENERR:
+ case FMTERR:
+ case BODY:
case FILEEOF:
goto finished;
- default:
- adios (NULL, "m_getfld() returned %d", state);
+ default:
+ adios (NULL, "m_getfld2() returned %d", state);
}
}
finished:
m_getfld_state_destroy (&gstate);
+ /* set up the "fcc" pseudo-component */
+ cptr = fmt_findcomp ("fcc");
+ if (cptr) {
+ free(cptr->c_text);
+ if (fcc)
+ cptr->c_text = mh_xstrdup(fcc);
+ else
+ cptr->c_text = NULL;
+ }
+ cptr = fmt_findcomp ("user");
+ if (cptr) {
+ free(cptr->c_text);
+ if ((cp = getenv("USER")))
+ cptr->c_text = mh_xstrdup(cp);
+ else
+ cptr = NULL;
+ }
+
/*
* if there's a "Subject" component, strip any "Re:"s off it
*/
cptr = fmt_findcomp ("subject");
if (cptr && (cp = cptr->c_text)) {
- register char *sp = cp;
+ char *sp = cp;
for (;;) {
while (isspace((unsigned char) *cp))
}
if (sp != cptr->c_text) {
cp = cptr->c_text;
- cptr->c_text = getcpy (sp);
+ cptr->c_text = mh_xstrdup(sp);
free (cp);
}
}
i = format_len + char_read + 256;
- scanl = mh_xmalloc ((size_t) i + 2);
+ scanl = charstring_create (i + 2);
dat[0] = 0;
dat[1] = 0;
dat[2] = 0;
dat[3] = outputlinelen;
dat[4] = 0;
- memset(&cb, 0, sizeof(cb));
+ ZERO(&cb);
cb.formataddr = replformataddr;
cb.concataddr = replconcataddr;
- fmt_scan (fmt, scanl, i + 1, i, dat, &cb);
- fputs (scanl, out);
+ fmt_scan (fmt, scanl, i, dat, &cb);
+ fputs (charstring_buffer (scanl), out);
if (badaddrs) {
fputs ("\nrepl: bad addresses:\n", out);
fputs ( badaddrs, out);
fclose (out);
/* return dynamically allocated buffers */
- free (scanl);
+ charstring_free (scanl);
fmt_free(fmt, 1);
}
static char *
replformataddr (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;
char *fixed_str = fix_addresses (str);
/* if we don't have a buffer yet, get one */
insert (struct mailname *np)
{
char buffer[BUFSIZ];
- register struct mailname *mp;
+ struct mailname *mp;
if (nodupcheck)
return 1;
return 0;
for (mp = &mq; mp->m_next; mp = mp->m_next) {
- if (!strcasecmp (np->m_host ? np->m_host : "",
- mp->m_next->m_host ? mp->m_next->m_host : "") &&
- !strcasecmp (np->m_mbox ? np->m_mbox : "",
- mp->m_next->m_mbox ? mp->m_next->m_mbox : ""))
+ if (!strcasecmp (FENDNULL(np->m_host),
+ FENDNULL(mp->m_next->m_host)) &&
+ !strcasecmp (FENDNULL(np->m_mbox),
+ FENDNULL(mp->m_next->m_mbox)))
return 0;
}
if (!ccme && ismymbox (np))
if (querysw) {
snprintf (buffer, sizeof(buffer), "Reply to %s? ", adrformat (np));
- if (!gans (buffer, anoyes))
+ if (!read_switch (buffer, anoyes))
return 0;
}
mp->m_next = np;
adios (filter, "unable to read");
rewind (in);
- lseek (fileno(in), (off_t) 0, SEEK_SET);
+ lseek(fileno(in), 0, SEEK_SET);
arglist = argsplit(mhlproc, &mhl, &argnum);
switch (pid = fork()) {
- case NOTOK:
+ case NOTOK:
adios ("fork", "unable to");
- case OK:
+ case OK:
dup2 (fileno (in), fileno (stdin));
dup2 (fileno (out), fileno (stdout));
closefds (3);
execvp (mhl, arglist);
errstr = strerror(errno);
- write(2, "unable to exec ", 15);
- write(2, mhlproc, strlen(mhlproc));
- write(2, ": ", 2);
- write(2, errstr, strlen(errstr));
- write(2, "\n", 1);
+ if (write(2, "unable to exec ", 15) < 0 ||
+ write(2, mhlproc, strlen(mhlproc)) < 0 ||
+ write(2, ": ", 2) < 0 ||
+ write(2, errstr, strlen(errstr)) < 0 ||
+ write(2, "\n", 1) < 0) {
+ advise ("stderr", "write");
+ }
_exit (-1);
- default:
+ default:
if (pidXwait (pid, mhl))
done (1);
fseek (out, 0L, SEEK_END);
+ arglist_free(mhl, arglist);
break;
}
}
* local part.
*/
while ((cp = getname (str))) {
- struct adr_node *adr_nodep = mh_xmalloc (sizeof *adr_nodep);
+ struct adr_node *adr_nodep;
char error[BUFSIZ];
struct mailname *mp;
- adr_nodep->adr = strdup (cp);
+ NEW(adr_nodep);
+ adr_nodep->adr = mh_xstrdup (cp);
adr_nodep->escape_local_part = 0;
adr_nodep->fixed = 0;
adr_nodep->next = NULL;
const char *no_at_sign = "no at-sign after local-part";
adr_nodep->escape_local_part =
- ! strncmp (error, no_at_sign, strlen (no_at_sign));
+ has_prefix(error, no_at_sign);
} else {
mnfree (mp);
}
* Walk the list and try to fix broken addresses.
*/
for (np = adrs; np; np = np->next) {
- char *display_name = strdup (np->adr);
+ char *display_name = mh_xstrdup (np->adr);
size_t len = strlen (display_name);
if (np->escape_local_part) {
char *local_part_end = strrchr (display_name, '<');
- char *angle_addr = strdup (local_part_end);
+ char *angle_addr = mh_xstrdup (local_part_end);
struct mailname *mp;
char *new_adr, *adr;
free (angle_addr);
free (new_adr);
free (np->adr);
- np->adr = strdup (adr);
+ np->adr = mh_xstrdup (adr);
/* Need to flush getname() */
while ((cp = getname (""))) continue;
free (fixed_str);
fixed_str = new_str;
} else {
- fixed_str = strdup (np->adr);
+ fixed_str = mh_xstrdup (np->adr);
}
}
if (fixed_address) {
return fixed_str;
- } else {
- free (fixed_str);
- return str ? strdup (str) : NULL;
}
+ free (fixed_str);
+ return str ? mh_xstrdup (str) : NULL;
}