]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/cmds/rmm.c
Removed --depth 1 from git clone invocation.
[nmh] / docs / historical / mh-nov-1983 / cmds / rmm.c
1 #ifndef lint
2 static char sccsid[] = "@(#)rmm.c 4.1 2/23/83";
3 #endif
4
5 #include "mh.h"
6 #include <stdio.h>
7 #include <strings.h>
8
9 int vecp;
10 char **vec;
11 struct msgs *mp;
12
13 struct swit switches[] = {
14 "all", -3, /* 0 */
15 "help", 4, /* 1 */
16 0, 0
17 };
18
19 main(argc, argv)
20 char *argv[];
21 {
22 char *folder, *nfolder, *maildir, *msgs[100], buf[32];
23 register int msgnum;
24 register char *cp, *sp;
25 int msgp;
26 char **ap;
27 char *arguments[50], **argp;
28
29 #ifdef NEWS
30 m_news();
31 #endif
32 folder = 0; msgp = 0;
33 cp = r1bindex(argv[0], '/');
34 if((cp = m_find(cp)) != NULL) {
35 ap = brkstring(cp = getcpy(cp), " ", "\n");
36 ap = copyip(ap, arguments);
37 } else
38 ap = arguments;
39 copyip(argv+1, ap);
40 argp = arguments;
41 while(cp = *argp++) {
42 if(*cp == '-')
43 switch(smatch(++cp, switches)) {
44 case -2:ambigsw(cp, switches); /* ambiguous */
45 goto leave;
46 /* unknown */
47 case -1:fprintf(stderr, "rmm: -%s unknown\n", cp);
48 goto leave;
49 /* -all */
50 case 0: fprintf(stderr, "\"-all\" changed to \"all\"\n");
51 goto leave;
52 /* -help */
53 case 1: help("rmm [+folder] [msgs] [switches]",
54 switches);
55 goto leave;
56 }
57 if(*cp == '+') {
58 if(folder) {
59 fprintf(stderr, "Only one folder at a time.\n");
60 goto leave;
61 } else
62 folder = cp + 1;
63 } else
64 msgs[msgp++] = cp;
65 }
66 if(!msgp)
67 msgs[msgp++] = "cur";
68 if(!folder)
69 folder = m_getfolder();
70 maildir = m_maildir(folder);
71 if(chdir(maildir) < 0) {
72 fprintf(stderr, "Can't chdir to: ");
73 perror(maildir);
74 goto leave;
75 }
76 if(!(mp = m_gmsg(folder))) {
77 fprintf(stderr, "Can't read folder!?\n");
78 goto leave;
79 }
80 if(mp->hghmsg == 0) {
81 fprintf(stderr, "No messages in \"%s\".\n", folder);
82 goto leave;
83 }
84 for(msgnum = 0; msgnum < msgp; msgnum++)
85 if(!m_convert(msgs[msgnum]))
86 goto leave;
87 if(mp->numsel == 0) {
88 fprintf(stderr, "rmm: lasagne 'n sausage\n"); /* never get here */
89 goto leave;
90 }
91 m_replace(pfolder, folder);
92 if((cp = m_find("delete-prog")) == NULL) {
93 for(msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
94 if(mp->msgstats[msgnum] & SELECTED) {
95 sp = getcpy(m_name(msgnum));
96 cp = copy(sp, buf);
97 cp[1] = 0;
98 do
99 *cp = cp[-1];
100 while(--cp >= buf && *cp != '/');
101 #ifdef UCB
102 *++cp = '#';
103 #else
104 *++cp = ',';
105 #endif
106 unlink(buf);
107 if(link(sp, buf) == -1 || unlink(sp) == -1)
108 fprintf(stderr, "Can't rename %s to %s.\n", sp, buf);
109 }
110 } else {
111 if(mp->numsel > MAXARGS-2) {
112 fprintf(stderr, "rmm: more than %d messages for deletion-prog\n",MAXARGS-2);
113 goto leave;
114 }
115 vec = (char **) calloc(MAXARGS +2, sizeof *vec);
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] = 0;
121 vec[0] = cp;
122 m_update();
123 fflush(stdout);
124 execv(vec[0], vec);
125 fprintf(stderr, "Can't exec deletion prog--");
126 perror(cp);
127 }
128 leave:
129 m_update();
130 done(0);
131 }