]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/rmm.c
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / 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 }