/*
* folder_delmsgs.c -- "remove" SELECTED messages from a folder
*
- * $Id$
- *
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
{
pid_t pid;
int msgnum, vecp, retval = 0;
- char buf[100], *dp, **vec;
+ char buf[100], *dp, **vec, *prog;
char msgpath[BUFSIZ];
/*
/* Mark that the sequence information has changed */
mp->msgflags |= SEQMOD;
- if (mp->numsel > MAXARGS - 2)
- adios (NULL, "more than %d messages for %s exec", MAXARGS - 2,
- rmmproc);
- vec = (char **) calloc ((size_t) (mp->numsel + 2), sizeof(*vec));
+ /*
+ * Write out the sequence and context files; this will release
+ * any locks before the rmmproc is called.
+ */
+
+ seq_save (mp);
+ context_save ();
+
+ vec = argsplit(rmmproc, &prog, &vecp);
+
+ /*
+ * argsplit allocates a MAXARGS vector by default, If we need
+ * something bigger, allocate it ourselves
+ */
+
+ if (mp->numsel + vecp + 1 > MAXARGS)
+ vec = (char **) realloc (vec, (size_t) ((mp->numsel + vecp + 1) *
+ sizeof(*vec)));
if (vec == NULL)
adios (NULL, "unable to allocate exec vector");
- vecp = 1;
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
if (is_selected (mp, msgnum) &&
!(vec[vecp++] = strdup (m_name (msgnum))))
vec[vecp] = NULL;
fflush (stdout);
- vec[0] = r1bindex (rmmproc, '/');
- switch (pid = vfork()) {
+ switch (pid = fork()) {
case -1:
advise ("fork", "unable to");
return -1;
case 0:
- execvp (rmmproc, vec);
+ execvp (prog, vec);
fprintf (stderr, "unable to exec ");
perror (rmmproc);
_exit (-1);
default:
+ arglist_free(prog, vec);
return (pidwait (pid, -1));
}
}
*/
if (!nohook) {
- (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", getcwd(msgpath, sizeof (msgpath)), msgnum);
+ (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum);
(void)ext_hook("del-hook", msgpath, (char *)0);
}
/* Mark that the sequence information has changed */
mp->msgflags |= SEQMOD;
+ /*
+ * Write out sequence and context files
+ */
+
+ seq_save (mp);
+ context_save ();
+
return retval;
}