Renamed r1bindex() to mhbasename(), to make its function becomes clear.
[mmh] / sbr / folder_delmsgs.c
index e5374b5..ac93068 100644 (file)
-
 /*
- * folder_delmsgs.c -- "remove" SELECTED messages from a folder
- *
- * $Id$
- */
+** folder_delmsgs.c -- "remove" SELECTED messages from a folder
+**
+** 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.
+*/
 
 #include <h/mh.h>
 
 /*
- * 1) If we are using an external rmmproc, then exec it.
- * 2) Else if unlink_msgs is non-zero, then unlink the
- *    SELECTED messages.
- * 3) Else rename SELECTED messages by prefixing name
- *    with a standard prefix.
- *
- * If there is an error, return -1, else return 0.
- */
+** 1) If we are using an external rmmproc, then exec it.
+** 2) Else if unlink_msgs is non-zero, then unlink the
+**    SELECTED messages.
+** 3) Else rename SELECTED messages by prefixing name
+**    with backup_prefix.
+**
+** If there is an error, return -1, else return 0.
+*/
 
 int
-folder_delmsgs (struct msgs *mp, int unlink_msgs)
+folder_delmsgs(struct msgs *mp, int unlink_msgs, int nohook)
 {
-    pid_t pid;
-    int msgnum, vecp, retval = 0;
-    char buf[100], *dp, **vec;
-
-    /*
-     * If "rmmproc" is defined, exec it to remove messages.
-     */
-    if (rmmproc) {
-       /* Unset the EXISTS flag for each message to be removed */
-       for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
-           if (is_selected (mp, msgnum))
-               unset_exists (mp, msgnum);
-       }
-
-       /* Mark that the sequence information has changed */
-       mp->msgflags |= SEQMOD;
+       pid_t pid;
+       int msgnum, vecp, retval = 0;
+       char buf[100], *dp, **vec;
+       char msgpath[BUFSIZ];
+
+       /*
+       ** If "rmmproc" is defined, exec it to remove messages.
+       */
+       if (rmmproc) {
+               /* Unset the EXISTS flag for each message to be removed */
+               for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+                       if (is_selected(mp, msgnum))
+                       unset_exists(mp, msgnum);
+               }
 
-       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));
-       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))))
-               adios (NULL, "strdup failed");
-       }
-       vec[vecp] = NULL;
+               /* 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));
+               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))))
+                       adios(NULL, "strdup failed");
+               }
+               vec[vecp] = NULL;
 
-       fflush (stdout);
-       vec[0] = r1bindex (rmmproc, '/');
+               fflush(stdout);
+               vec[0] = mhbasename(rmmproc);
 
-       switch (pid = vfork()) {
-       case -1:
-           advise ("fork", "unable to");
-           return -1;
+               switch (pid = vfork()) {
+               case -1:
+                       advise("fork", "unable to");
+                       return -1;
 
-       case 0:
-           execvp (rmmproc, vec);
-           fprintf (stderr, "unable to exec ");
-           perror (rmmproc);
-           _exit (-1);
+               case 0:
+                       execvp(rmmproc, vec);
+                       fprintf(stderr, "unable to exec ");
+                       perror(rmmproc);
+                       _exit(-1);
 
-       default:
-           return (pidwait (pid, -1));
-       }
-    }
-
-    /*
-     * Either unlink or rename the SELECTED messages
-     */
-    for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
-       if (is_selected (mp, msgnum)) {
-           /* unselect message */
-           unset_selected (mp, msgnum);
-           mp->numsel--;
-
-           dp = m_name (msgnum);
-
-           if (unlink_msgs) {
-               /* just unlink the messages */
-               if (unlink (dp) == -1) {
-                   admonish (dp, "unable to unlink");
-                   retval = -1;
-                   continue;
+               default:
+                       return (pidwait(pid, -1));
                }
-           } else {
-               /* or rename messages with standard prefix */
-               strncpy (buf, m_backup (dp), sizeof(buf));
-               if (rename (dp, buf) == -1) {
-                   admonish (buf, "unable to rename %s to", dp);
-                   retval = -1;
-                   continue;
-               }
-           }
+       }
 
-           /* If removal was successful, decrement message count */
-           unset_exists (mp, msgnum);
-           mp->nummsg--;
+       /*
+       ** Either unlink or rename the SELECTED messages
+       */
+       for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+               if (is_selected(mp, msgnum)) {
+                       /* unselect message */
+                       unset_selected(mp, msgnum);
+                       mp->numsel--;
+
+                       /*
+                       ** Run the external hook on the message if one
+                       ** was specified in the context.  All we have
+                       ** is the message number; we have changed to
+                       ** the directory containing the message.  So,
+                       ** we need to extract that directory to form the
+                       ** complete path.  Note that the caller knows the
+                       ** directory, but has no way of passing that to us.
+                       */
+
+                       if (!nohook) {
+                               (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum);
+                               (void)ext_hook("del-hook", msgpath, (char *)0);
+                       }
+
+                       dp = m_name(msgnum);
+
+                       if (unlink_msgs) {
+                               /* just unlink the messages */
+                               if (unlink(dp) == -1) {
+                                       admonish(dp, "unable to unlink");
+                                       retval = -1;
+                                       continue;
+                               }
+                       } else {
+                               /* or rename messages with standard prefix */
+                               strncpy(buf, m_backup(dp), sizeof(buf));
+                               if (rename(dp, buf) == -1) {
+                                       admonish(buf, "unable to rename %s to", dp);
+                                       retval = -1;
+                                       continue;
+                               }
+                       }
+
+                       /* If removal was successful, decrement message count */
+                       unset_exists(mp, msgnum);
+                       mp->nummsg--;
+               }
        }
-    }
 
-    /* Sanity check */
-    if (mp->numsel != 0)
-       adios (NULL, "oops, mp->numsel should be 0");
+       /* Sanity check */
+       if (mp->numsel != 0)
+       adios(NULL, "oops, mp->numsel should be 0");
 
-    /* Mark that the sequence information has changed */
-    mp->msgflags |= SEQMOD;
+       /* Mark that the sequence information has changed */
+       mp->msgflags |= SEQMOD;
 
-    return retval;
+       return retval;
 }