2 ** folder_delmsgs.c -- "remove" SELECTED messages from a folder
4 ** This code is Copyright (c) 2002, by the authors of nmh. See the
5 ** COPYRIGHT file in the root directory of the nmh distribution for
6 ** complete copyright information.
12 ** 1) If we are using an external rmmproc, then exec it.
13 ** 2) Else if unlink_msgs is non-zero, then unlink the
15 ** 3) Else rename SELECTED messages by prefixing name
16 ** with backup_prefix.
18 ** If there is an error, return -1, else return 0.
22 folder_delmsgs(struct msgs *mp, int unlink_msgs, int nohook)
25 int msgnum, vecp, retval = 0;
26 char buf[100], *dp, **vec;
30 ** If "rmmproc" is defined, exec it to remove messages.
33 /* Unset the EXISTS flag for each message to be removed */
34 for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
35 if (is_selected(mp, msgnum))
36 unset_exists(mp, msgnum);
39 /* Mark that the sequence information has changed */
40 mp->msgflags |= SEQMOD;
42 if (mp->numsel > MAXARGS - 2)
43 adios(NULL, "more than %d messages for %s exec", MAXARGS - 2,
45 vec = (char **) calloc((size_t) (mp->numsel + 2), sizeof(*vec));
47 adios(NULL, "unable to allocate exec vector");
49 for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
50 if (is_selected(mp, msgnum) &&
51 !(vec[vecp++] = strdup(m_name(msgnum))))
52 adios(NULL, "strdup failed");
57 vec[0] = r1bindex(rmmproc, '/');
59 switch (pid = vfork()) {
61 advise("fork", "unable to");
66 fprintf(stderr, "unable to exec ");
71 return (pidwait(pid, -1));
76 ** Either unlink or rename the SELECTED messages
78 for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
79 if (is_selected(mp, msgnum)) {
80 /* unselect message */
81 unset_selected(mp, msgnum);
85 ** Run the external hook on the message if one
86 ** was specified in the context. All we have
87 ** is the message number; we have changed to
88 ** the directory containing the message. So,
89 ** we need to extract that directory to form the
90 ** complete path. Note that the caller knows the
91 ** directory, but has no way of passing that to us.
95 (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum);
96 (void)ext_hook("del-hook", msgpath, (char *)0);
102 /* just unlink the messages */
103 if (unlink(dp) == -1) {
104 admonish(dp, "unable to unlink");
109 /* or rename messages with standard prefix */
110 strncpy(buf, m_backup(dp), sizeof(buf));
111 if (rename(dp, buf) == -1) {
112 admonish(buf, "unable to rename %s to", dp);
118 /* If removal was successful, decrement message count */
119 unset_exists(mp, msgnum);
126 adios(NULL, "oops, mp->numsel should be 0");
128 /* Mark that the sequence information has changed */
129 mp->msgflags |= SEQMOD;