{ NULL, 0 }
};
+char *version=VERSION;
+
static struct swit ccswitches[] = {
#define CTOSW 0
{ "to", 0 },
FILE *in;
int buildsw = 0;
- filter = getcpy(etcpath(mhlreply));
-
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
/* read user profile/context */
context_read();
+ filter = mh_xstrdup(etcpath(mhlreply));
+
arguments = getarguments(invo_name, argc, argv, 1);
argp = arguments;
if (!(cp = *argp++) || *cp == '-')
adios(EX_USAGE, NULL, "missing argument to %s",
argp[-2]);
- file = getcpy(expanddir(cp));
+ file = mh_xstrdup(expanddir(cp));
continue;
case FORMSW:
if (!(form = *argp++) || *form == '-')
if (!(cp = *argp++) || *cp == '-')
adios(EX_USAGE, NULL, "missing argument to %s",
argp[-2]);
- filter = getcpy(etcpath(cp));
+ filter = mh_xstrdup(etcpath(cp));
continue;
case NFILTSW:
filter = NULL;
if (folder)
adios(EX_USAGE, NULL, "only one folder at a time!");
else
- folder = getcpy(expandfol(cp));
+ folder = mh_xstrdup(expandfol(cp));
} else {
if (msg)
adios(EX_USAGE, NULL, "only one message at a time!");
if (ccme == -1)
ccme = groupreply;
- cwd = getcpy(pwd());
+ cwd = mh_xstrdup(pwd());
if (file && (msg || folder))
adios(EX_USAGE, NULL, "can't mix files and folders/msgs");
context_save(); /* save the context file */
}
- msg = file ? file : getcpy(m_name(mp->lowsel));
+ msg = file ? file : mh_xstrdup(m_name(mp->lowsel));
if ((in = fopen(msg, "r")) == NULL)
adios(EX_IOERR, msg, "unable to open");
if ((cp = getenv("USER"))) {
FINDCOMP(cptr, "user");
if (cptr)
- cptr->c_text = getcpy(cp);
+ cptr->c_text = mh_xstrdup(cp);
}
if (!ccme)
ismymbox(NULL);
}
char_read += strlen(f.value);
if (!cptr->c_text) {
- cptr->c_text = getcpy(f.value);
+ cptr->c_text = mh_xstrdup(f.value);
i = strlen(cptr->c_text) - 1;
if (cptr->c_text[i] == '\n') {
cptr->c_text[i] = '\0';
}
if (sp != cptr->c_text) {
cp = cptr->c_text;
- cptr->c_text = getcpy(sp);
- free(cp);
+ cptr->c_text = mh_xstrdup(sp);
+ mh_free0(&cp);
}
}
i = format_len + char_read + 256;
- scanl = mh_xmalloc((size_t) i + 2);
+ scanl = mh_xcalloc(i + 2, sizeof(char));
dat[0] = 0;
dat[1] = 0;
dat[2] = 0;
}
/* return dynamically allocated buffers */
- free(scanl);
+ mh_free0(&scanl);
}
static char *buf; /* our current working buffer */
** returns a pointer to the concatenated address string.
**
** We try to not do a lot of malloc/copy/free's (which is why we
-** don't call "getcpy") but still place no upper limit on the
+** don't call "mh_xstrdup") but still place no upper limit on the
** length of the result string.
**
** This routine is an override for the equally named one in sbr/fmt_addr.c.
/* if we don't have a buffer yet, get one */
if (bufsiz == 0) {
- buf = mh_xmalloc(BUFINCR);
+ buf = mh_xcalloc(BUFINCR, sizeof(char));
last_dst = buf; /* XXX */
bufsiz = BUFINCR - 6; /* leave some slop */
bufend = buf + bufsiz;
static void
replfilter(FILE *in, FILE *out, char *filter)
{
- int pid, n;
- char *errstr;
+ int pid, pid_show, n;
+ int mailpipe[2];
if (filter == NULL)
return;
adios(EX_OSERR, "fork", "unable to");
case OK:
- dup2(fileno(in), fileno(stdin));
- dup2(fileno(out), fileno(stdout));
- for (n=3; n<OPEN_MAX; n++) {
- close(n);
+ if (pipe(mailpipe) == -1) {
+ adios(EX_OSERR, "pipe", "can't create pipe");
}
- execlp("mhl", "mhl", "-form", filter, NULL);
- errstr = strerror(errno);
- write(2, "unable to exec mhl: ", 20);
- write(2, errstr, strlen(errstr));
- write(2, "\n", 1);
- _exit(EX_OSERR);
+ switch (pid_show = fork()) {
+ case NOTOK:
+ adios(EX_OSERR, "fork", "unable to");
+ case OK:
+ dup2(fileno(in), STDIN_FILENO);
+ dup2(mailpipe[1], STDOUT_FILENO);
+ close(fileno(in));
+ close(fileno(out));
+ close(mailpipe[0]);
+ close(mailpipe[1]);
+ for (n=3; n<OPEN_MAX; n++) {
+ close(n);
+ }
+ execlp("show", "show", "-file", "-", NULL);
+ adios(EX_OSERR, "exec", "unable to");
+ break;
+ default:
+ dup2(mailpipe[0], STDIN_FILENO);
+ dup2(fileno(out), STDOUT_FILENO);
+ close(fileno(in));
+ close(fileno(out));
+ close(mailpipe[0]);
+ close(mailpipe[1]);
+ for (n=3; n<OPEN_MAX; n++) {
+ close(n);
+ }
+ execlp("mhl", "mhl", "-form", filter, NULL);
+ adios(EX_OSERR, "exec", "unable to");
+ break;
+ }
default:
- if (pidXwait(pid, "mhl"))
+ if (pidXwait(pid, "mhl")) {
exit(EX_SOFTWARE);
+ }
fseek(out, 0L, SEEK_END);
break;
}