Import a copy of Markus Schnalke's master's thesis: The Modern Mail Handler.
[mmh] / docs / historical / mh-6.8.5 / uip / rmm.c
1 /* rmm.c - remove a message */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: rmm.c,v 1.5 1992/12/15 00:20:22 jromine Exp $";
4 #endif  /* lint */
5
6 #include "../h/mh.h"
7 #include <stdio.h>
8 #ifdef LOCALE
9 #include        <locale.h>
10 #endif
11
12 /* \f */
13
14 static struct swit switches[] = {
15 #define HELPSW  0
16     "help", 4,
17
18     NULL, 0
19 };
20
21 /* \f */
22
23 /* ARGSUSED */
24
25 main (argc, argv)
26 int     argc;
27 char  **argv;
28 {
29     int     msgp = 0,
30             msgnum,
31             vecp;
32     char   *cp,
33            *dp,
34            *maildir,
35            *folder = NULL,
36             buf[100],
37           **ap,
38           **argp,
39           **vec,
40            *arguments[MAXARGS],
41            *msgs[MAXARGS];
42     struct msgs *mp;
43
44 #ifdef LOCALE
45         setlocale(LC_ALL, "");
46 #endif
47     invo_name = r1bindex (argv[0], '/');
48     if ((cp = m_find (invo_name)) != NULL) {
49         ap = brkstring (cp = getcpy (cp), " ", "\n");
50         ap = copyip (ap, arguments);
51     }
52     else
53         ap = arguments;
54     (void) copyip (argv + 1, ap);
55     argp = arguments;
56
57 /* \f */
58
59     while (cp = *argp++) {
60         if (*cp == '-')
61             switch (smatch (++cp, switches)) {
62                 case AMBIGSW: 
63                     ambigsw (cp, switches);
64                     done (1);
65                 case UNKWNSW: 
66                     adios (NULLCP, "-%s unknown\n", cp);
67                 case HELPSW: 
68                     (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
69                             invo_name);
70                     help (buf, switches);
71                     done (1);
72             }
73         if (*cp == '+' || *cp == '@') {
74             if (folder)
75                 adios (NULLCP, "only one folder at a time!");
76             else
77                 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
78         }
79         else
80             msgs[msgp++] = cp;
81     }
82
83 /* \f */
84
85     if (!m_find ("path"))
86         free (path ("./", TFOLDER));
87     if (!msgp)
88         msgs[msgp++] = "cur";
89     if (!folder)
90         folder = m_getfolder ();
91     maildir = m_maildir (folder);
92
93     if (chdir (maildir) == NOTOK)
94         adios (maildir, "unable to change directory to");
95     if (!(mp = m_gmsg (folder)))
96         adios (NULLCP, "unable to read folder %s", folder);
97     if (mp -> hghmsg == 0)
98         adios (NULLCP, "no messages in %s", folder);
99
100     for (msgnum = 0; msgnum < msgp; msgnum++)
101         if (!m_convert (mp, msgs[msgnum]))
102             done (1);
103     m_setseq (mp);
104
105     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
106         if (mp -> msgstats[msgnum] & SELECTED) {
107 #ifdef  notdef
108             mp -> msgstats[msgnum] |= DELETED;
109 #endif  /* notdef */
110             mp -> msgstats[msgnum] &= ~EXISTS;
111         }
112     mp -> msgflags |= SEQMOD;
113
114     m_replace (pfolder, folder);
115     m_sync (mp);
116     m_update ();
117
118     if (rmmproc) {
119         if (mp -> numsel > MAXARGS - 2)
120             adios (NULLCP, "more than %d messages for %s exec", MAXARGS - 2,
121                     rmmproc);
122         vec = (char **) calloc ((unsigned) (mp -> numsel + 2), sizeof *vec);
123         if (vec == NULL)
124             adios (NULLCP, "unable to allocate exec vector");
125         vecp = 1;
126         for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
127             if (mp -> msgstats[msgnum] & SELECTED)
128                 vec[vecp++] = getcpy (m_name (msgnum));
129         vec[vecp] = NULL;
130
131         (void) fflush (stdout);
132         vec[0] = r1bindex (rmmproc, '/');
133         execvp (rmmproc, vec);
134         adios (rmmproc, "unable to exec");
135     }
136
137     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
138         if (mp -> msgstats[msgnum] & SELECTED) {
139             (void) strcpy (buf, m_backup (dp = m_name (msgnum)));
140             if (rename (dp, buf) == NOTOK)
141                 admonish (buf, "unable to rename %s to", dp);
142         }
143
144     done (0);
145 }