X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffolder_delmsgs.c;h=ac93068d4313e6f8f54b790bc68e6cf6b43ec53e;hp=e5374b5d601b9a29e98f1b83e0e546cb485f7d30;hb=240013872c392fe644bd4f79382d9f5314b4ea60;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/sbr/folder_delmsgs.c b/sbr/folder_delmsgs.c index e5374b5..ac93068 100644 --- a/sbr/folder_delmsgs.c +++ b/sbr/folder_delmsgs.c @@ -1,115 +1,132 @@ - /* - * 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 /* - * 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; }