}
}
- argvarray = (char **) mh_xmalloc((sizeof(char **) * MAXARGS));
+ argvarray = (char **) mh_xmalloc((sizeof(char **) * (MAXARGS + 5)));
/*
* The simple case - no spaces or shell metacharacters
*/
switch (filterpid = fork()) {
- char **args;
+ char **args, *program;
struct arglist *a;
- int i, dat[5], s;
+ int i, dat[5], s, argp;
case 0:
/*
- * Allocate an argument array for us
+ * Configure an argument array for us
*/
- args = (char **) mh_xmalloc((filter_nargs + 2) * sizeof(char *));
- args[0] = formatproc;
- args[filter_nargs + 1] = NULL;
+ args = argsplit(formatproc, &program, &argp);
+ args[argp + filter_nargs] = NULL;
dat[0] = 0;
dat[1] = 0;
dat[2] = 0;
* Pull out each argument and scan them.
*/
- for (a = arglist_head, i = 1; a != NULL; a = a->a_next, i++) {
+ for (a = arglist_head, i = argp; a != NULL; a = a->a_next, i++) {
args[i] = mh_xmalloc(BUFSIZ);
fmt_scan(a->a_fmt, args[i], BUFSIZ - 1, BUFSIZ, dat);
/*
sigon ();
if (sm_mts == MTS_SENDMAIL_PIPE) {
- char *sargv[16], **argp;
+ char **argp, *program;
+ int argc;
for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
sleep (5);
adios (file, "can't reopen for sendmail");
}
- argp = sargv;
- *argp++ = "sendmail";
- *argp++ = "-t"; /* read msg for recipients */
- *argp++ = "-i"; /* don't stop on "." */
+ argp = argsplit(sendmail, &program, &argc);
+ argp[argc++] = "-t"; /* read msg for recipients */
+ argp[argc++] = "-i"; /* don't stop on "." */
if (whomsw)
- *argp++ = "-bv";
+ argp[argc++] = "-bv";
if (snoop)
- *argp++ = "-v";
- *argp = NULL;
+ argp[argc++] = "-v";
+ argp[argc] = NULL;
- execv (sendmail, sargv);
+ execv (program, argp);
adios (sendmail, "can't exec");
default:
main (int argc, char **argv)
{
pid_t child_id;
- int i, vecp = 1;
- char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ];
- char **argp, **arguments, *vec[MAXARGS];
+ int i, vecp;
+ char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ], *program;
+ char **argp, **arguments, **vec;
FILE *fp;
char *tfile = NULL;
/* read user profile/context */
context_read();
+ /*
+ * Configure this now, since any unknown switches to rcvdist get
+ * sent to postproc
+ */
+
+ vec = argsplit(postproc, &program, &vecp);
+
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
if (distout (drft, tmpfil, backup) == NOTOK)
done (1);
- vec[0] = r1bindex (postproc, '/');
vec[vecp++] = "-dist";
vec[vecp++] = drft;
if ((cp = context_find ("mhlproc"))) {
case NOTOK:
admonish (NULL, "unable to fork");/* fall */
case OK:
- execvp (postproc, vec);
+ execvp (program, vec);
fprintf (stderr, "unable to exec ");
perror (postproc);
_exit (1);
static void
remove_files (int filep, char **files)
{
- int i;
- char **vec;
+ int i, vecp;
+ char **vec, *program;
/* If rmmproc is defined, we use that */
if (rmmproc) {
- vec = files++; /* vec[0] = filevec[0] */
- files[filep] = NULL; /* NULL terminate list */
+ vec = argsplit(rmmproc, &program, &vecp);
+ files++; /* Yes, we need to do this */
+ for (i = 0; i < filep; i++)
+ vec[vecp++] = files[i];
+ vec[vecp] = NULL; /* NULL terminate list */
fflush (stdout);
- vec[0] = r1bindex (rmmproc, '/');
- execvp (rmmproc, vec);
+ execvp (program, vec);
adios (rmmproc, "unable to exec");
}