X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffolder_delmsgs.c;h=3165883837153424441fb7f800eba8b486373c69;hp=e5374b5d601b9a29e98f1b83e0e546cb485f7d30;hb=1642d62841486ade88ec2c48dd581e3249c98c94;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/sbr/folder_delmsgs.c b/sbr/folder_delmsgs.c index e5374b5..3165883 100644 --- a/sbr/folder_delmsgs.c +++ b/sbr/folder_delmsgs.c @@ -1,115 +1,60 @@ - /* - * folder_delmsgs.c -- "remove" SELECTED messages from a folder - * - * $Id$ - */ - +** folder_delmsgs.c -- remove (= unlink) 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 +#include #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. - */ - +** Unlink the SELECTED messages. +** +** 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 hook) { - 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); - } + int msgnum, retval = 0; + 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)); - 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, '/'); - - 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); + if (!is_selected(mp, msgnum)) { + continue; + } - default: - return (pidwait (pid, -1)); - } - } + /* unselect message */ + unset_selected(mp, msgnum); - /* - * 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--; + snprintf(msgpath, sizeof (msgpath), "%s/%d", + mp->foldpath, msgnum); - dp = m_name (msgnum); + if (hook) { + /* Run the external hook on the message. */ + ext_hook("del-hook", msgpath, NULL); + } - 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 (unlink(msgpath) == -1) { + admonish(msgpath, "unable to unlink"); + retval = -1; + continue; } - } - /* If removal was successful, decrement message count */ - unset_exists (mp, msgnum); - mp->nummsg--; + /* 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(EX_SOFTWARE, 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; }