X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffolder_delmsgs.c;h=3165883837153424441fb7f800eba8b486373c69;hp=4950330a115d27309764785c8182ab5e1e3d35a7;hb=431604647f89d5aac7b199a7883e98e56e4ccf9e;hpb=7e3bc577e84e13a47005a706718bd6ec0e6a0e0a diff --git a/sbr/folder_delmsgs.c b/sbr/folder_delmsgs.c index 4950330..3165883 100644 --- a/sbr/folder_delmsgs.c +++ b/sbr/folder_delmsgs.c @@ -1,130 +1,57 @@ /* -** folder_delmsgs.c -- "remove" SELECTED messages from a folder +** 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 backup_prefix. +** Unlink the SELECTED messages. ** ** If there is an error, return -1, else return 0. */ - int -folder_delmsgs(struct msgs *mp, int unlink_msgs, int nohook) +folder_delmsgs(struct msgs *mp, int hook) { - pid_t pid; - int msgnum, vecp, retval = 0; - char buf[100], *dp, **vec; + int msgnum, retval = 0; 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); - } - - /* 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"); + for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { + if (!is_selected(mp, msgnum)) { + continue; } - vec[vecp] = NULL; - - fflush(stdout); - vec[0] = mhbasename(rmmproc); - switch (pid = vfork()) { - case -1: - advise("fork", "unable to"); - return -1; + /* unselect message */ + unset_selected(mp, msgnum); - case 0: - execvp(rmmproc, vec); - fprintf(stderr, "unable to exec "); - perror(rmmproc); - _exit(-1); + snprintf(msgpath, sizeof (msgpath), "%s/%d", + mp->foldpath, msgnum); - default: - return (pidwait(pid, -1)); + if (hook) { + /* Run the external hook on the message. */ + ext_hook("del-hook", msgpath, NULL); } - } - /* - ** 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) { - snprintf(msgpath, sizeof (msgpath), "%s/%d", - mp->foldpath, msgnum); - ext_hook("del-hook", msgpath, NULL); - } - - 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--; + /* just unlink the messages */ + 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--; } /* Sanity check */ if (mp->numsel != 0) - adios(NULL, "oops, mp->numsel should be 0"); + adios(EX_SOFTWARE, NULL, "oops, mp->numsel should be 0"); /* Mark that the sequence information has changed */ mp->msgflags |= SEQMOD;