source: trunk/third/nmh/sbr/folder_delmsgs.c @ 12455

Revision 12455, 2.7 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12454, which included commits to RCS files with non-trunk default branches.
Line 
1
2/*
3 * folder_delmsgs.c -- "remove" SELECTED messages from a folder
4 *
5 * $Id: folder_delmsgs.c,v 1.1.1.1 1999-02-07 18:14:08 danw Exp $
6 */
7
8#include <h/mh.h>
9
10/*
11 * 1) If we are using an external rmmproc, then exec it.
12 * 2) Else if unlink_msgs is non-zero, then unlink the
13 *    SELECTED messages.
14 * 3) Else rename SELECTED messages by prefixing name
15 *    with a standard prefix.
16 *
17 * If there is an error, return -1, else return 0.
18 */
19
20int
21folder_delmsgs (struct msgs *mp, int unlink_msgs)
22{
23    pid_t pid;
24    int msgnum, vecp, retval = 0;
25    char buf[100], *dp, **vec;
26
27    /*
28     * If "rmmproc" is defined, exec it to remove messages.
29     */
30    if (rmmproc) {
31        /* Unset the EXISTS flag for each message to be removed */
32        for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
33            if (is_selected (mp, msgnum))
34                unset_exists (mp, msgnum);
35        }
36
37        /* Mark that the sequence information has changed */
38        mp->msgflags |= SEQMOD;
39
40        if (mp->numsel > MAXARGS - 2)
41            adios (NULL, "more than %d messages for %s exec", MAXARGS - 2,
42                   rmmproc);
43        vec = (char **) calloc ((size_t) (mp->numsel + 2), sizeof(*vec));
44        if (vec == NULL)
45            adios (NULL, "unable to allocate exec vector");
46        vecp = 1;
47        for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
48            if (is_selected (mp, msgnum) &&
49                !(vec[vecp++] = strdup (m_name (msgnum))))
50                adios (NULL, "strdup failed");
51        }
52        vec[vecp] = NULL;
53
54        fflush (stdout);
55        vec[0] = r1bindex (rmmproc, '/');
56
57        switch (pid = vfork()) {
58        case -1:
59            advise ("fork", "unable to");
60            return -1;
61
62        case 0:
63            execvp (rmmproc, vec);
64            fprintf (stderr, "unable to exec ");
65            perror (rmmproc);
66            _exit (-1);
67
68        default:
69            return (pidwait (pid, -1));
70        }
71    }
72
73    /*
74     * Either unlink or rename the SELECTED messages
75     */
76    for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
77        if (is_selected (mp, msgnum)) {
78            /* unselect message */
79            unset_selected (mp, msgnum);
80            mp->numsel--;
81
82            dp = m_name (msgnum);
83
84            if (unlink_msgs) {
85                /* just unlink the messages */
86                if (unlink (dp) == -1) {
87                    admonish (dp, "unable to unlink");
88                    retval = -1;
89                    continue;
90                }
91            } else {
92                /* or rename messages with standard prefix */
93                strncpy (buf, m_backup (dp), sizeof(buf));
94                if (rename (dp, buf) == -1) {
95                    admonish (buf, "unable to rename %s to", dp);
96                    retval = -1;
97                    continue;
98                }
99            }
100
101            /* If removal was successful, decrement message count */
102            unset_exists (mp, msgnum);
103            mp->nummsg--;
104        }
105    }
106
107    /* Sanity check */
108    if (mp->numsel != 0)
109        adios (NULL, "oops, mp->numsel should be 0");
110
111    /* Mark that the sequence information has changed */
112    mp->msgflags |= SEQMOD;
113
114    return retval;
115}
Note: See TracBrowser for help on using the repository browser.