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