]>
diplodocus.org Git - nmh/blob - sbr/folder_delmsgs.c
96111a63d622171f70dec3a37ccadc8c95f3b92d
1 /* folder_delmsgs.c -- "remove" SELECTED messages from a folder
3 * This code is Copyright (c) 2002, by the authors of nmh. See the
4 * COPYRIGHT file in the root directory of the nmh distribution for
5 * complete copyright information.
10 #include "folder_delmsgs.h"
11 #include "context_save.h"
18 * 1) If we are using an external rmmproc, then exec it.
19 * 2) Else if unlink_msgs is non-zero, then unlink the
21 * 3) Else rename SELECTED messages by prefixing name
22 * with a standard prefix.
24 * If there is an error, return -1, else return 0.
28 folder_delmsgs (struct msgs
*mp
, int unlink_msgs
, int nohook
)
31 int msgnum
, vecp
, retval
= 0;
32 char buf
[100], *dp
, **vec
, *prog
;
36 * If "rmmproc" is defined, exec it to remove messages.
39 /* Unset the EXISTS flag for each message to be removed */
40 for (msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++) {
41 if (is_selected (mp
, msgnum
))
42 unset_exists (mp
, msgnum
);
45 /* Mark that the sequence information has changed */
46 mp
->msgflags
|= SEQMOD
;
49 * Write out the sequence and context files; this will release
50 * any locks before the rmmproc is called.
56 vec
= argsplit(rmmproc
, &prog
, &vecp
);
59 * argsplit allocates a MAXARGS vector by default, If we need
60 * something bigger, allocate it ourselves
63 if (mp
->numsel
+ vecp
+ 1 > MAXARGS
)
64 vec
= mh_xrealloc(vec
, (mp
->numsel
+ vecp
+ 1) * sizeof *vec
);
65 for (msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++) {
66 if (is_selected (mp
, msgnum
) &&
67 !(vec
[vecp
++] = strdup (m_name (msgnum
))))
74 switch (pid
= fork()) {
76 advise ("fork", "unable to");
81 fprintf (stderr
, "unable to exec ");
86 arglist_free(prog
, vec
);
87 return pidwait(pid
, -1);
92 * Either unlink or rename the SELECTED messages
94 for (msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++) {
95 if (is_selected (mp
, msgnum
)) {
96 /* unselect message */
97 unset_selected (mp
, msgnum
);
101 * Run the external hook on the message if one was specified in the context.
102 * All we have is the message number; we have changed to the directory
103 * containing the message. So, we need to extract that directory to form
104 * the complete path. Note that the caller knows the directory, but has
105 * no way of passing that to us.
109 (void)snprintf(msgpath
, sizeof (msgpath
), "%s/%d", mp
->foldpath
, msgnum
);
110 (void)ext_hook("del-hook", msgpath
, NULL
);
113 dp
= m_name (msgnum
);
116 /* just unlink the messages */
117 if (m_unlink (dp
) == -1) {
118 admonish (dp
, "unable to unlink");
123 /* or rename messages with standard prefix */
124 strncpy (buf
, m_backup (dp
), sizeof(buf
));
125 if (rename (dp
, buf
) == -1) {
126 admonish (buf
, "unable to rename %s to", dp
);
132 /* If removal was successful, decrement message count */
133 unset_exists (mp
, msgnum
);
140 die("oops, mp->numsel should be 0");
142 /* Mark that the sequence information has changed */
143 mp
->msgflags
|= SEQMOD
;
146 * Write out sequence and context files