]> diplodocus.org Git - nmh/blobdiff - sbr/folder_delmsgs.c
Look at post instead of inc to determine build options in build_nmh.
[nmh] / sbr / folder_delmsgs.c
index 20ac1a5723e97d68c4ffb8475be94bf47e2a59e8..ee4bd9e95e4b96d33b971578eda3918dd80363a3 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * 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.
@@ -26,7 +24,7 @@ folder_delmsgs (struct msgs *mp, int unlink_msgs, int nohook)
 {
     pid_t pid;
     int msgnum, vecp, retval = 0;
-    char buf[100], *dp, **vec;
+    char buf[100], *dp, **vec, *prog;
     char       msgpath[BUFSIZ];
 
     /*
@@ -42,13 +40,26 @@ folder_delmsgs (struct msgs *mp, int unlink_msgs, int nohook)
        /* 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))))
@@ -57,20 +68,20 @@ folder_delmsgs (struct msgs *mp, int unlink_msgs, int nohook)
        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));
        }
     }
@@ -129,5 +140,12 @@ folder_delmsgs (struct msgs *mp, int unlink_msgs, int nohook)
     /* Mark that the sequence information has changed */
     mp->msgflags |= SEQMOD;
 
+    /*
+     * Write out sequence and context files
+     */
+
+    seq_save (mp);
+    context_save ();
+
     return retval;
 }