]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/cmds/rmf.c
Removed --depth 1 from git clone invocation.
[nmh] / docs / historical / mh-nov-1983 / cmds / rmf.c
1 #ifndef lint
2 static char sccsid[] = "@(#)rmf.c 1.4 7/7/83";
3 #endif
4
5 #include "mh.h"
6 #include <stdio.h>
7 #include <sys/types.h>
8 #include <sys/dir.h>
9 #include "strings.h"
10
11 char *anoyes[]; /* Std no/yes gans array */
12
13 int subf;
14
15 struct msgs *mp;
16
17 struct swit switches[] = {
18 "help", 4, /* 0 */
19 0, 0
20 };
21
22 main(argc, argv)
23 char *argv[];
24 {
25 register char *cp, **ap;
26 char *folder, buf[128];
27 int i, def_fold;
28 char *arguments[50], **argp;
29
30 #ifdef NEWS
31 m_news();
32 #endif
33 folder = 0;
34 cp = r1bindex(argv[0], '/');
35 if((cp = m_find(cp)) != NULL) {
36 ap = brkstring(cp = getcpy(cp), " ", "\n");
37 ap = copyip(ap, arguments);
38 } else
39 ap = arguments;
40 copyip(argv+1, ap);
41 argp = arguments;
42 while(cp = *argp++) {
43 if(*cp == '-')
44 switch(smatch(++cp, switches)) {
45 case -2:ambigsw(cp, switches); /* ambiguous */
46 goto leave;
47 /* unknown */
48 case -1:fprintf(stderr, "rmf: -%s unknown\n", cp);
49 goto leave;
50 /* -help */
51 case 0: help("rmf [+folder] [switches]", switches);
52 goto leave;
53 }
54 if(*cp == '+')
55 if(folder) {
56 fprintf(stderr, "Only one folder at a time.\n");
57 goto leave;
58 } else
59 folder = cp + 1;
60 else {
61 fprintf(stderr, "Usage: rmf [+folder]\n");
62 goto leave;
63 }
64 }
65 if(!folder) {
66 folder = m_getfolder();
67 def_fold++;
68 }
69 subf = !((!index(folder, '/')) | (*folder == '/') | (*folder == '.'));
70 if(def_fold && !subf) {
71 cp = concat("Remove folder \"", folder, "\" ?? ", 0);
72 if(!gans(cp, anoyes))
73 goto leave;
74 free(cp);
75 }
76 if(rmfold(folder))
77 goto leave;
78 if(subf) { /* make parent "current" */
79 cp = copy(folder, buf);
80 while(cp > buf && *cp != '/') --cp;
81 if(cp > buf) {
82 *cp = 0;
83 if(strcmp(m_find(pfolder), buf) != 0) {
84 printf("[+%s now current]\n", buf);
85 m_replace(pfolder, buf);
86 }
87 }
88 }
89 leave:
90 m_update();
91 done(0);
92 }
93
94 rmfold(fold)
95 char *fold;
96 {
97 register char *maildir;
98 struct direct *ent;
99 int i, leftover, cd;
100 register char *cp, *sp;
101 char nambuf[10];
102 register DIR *dirp;
103
104 leftover = 0;
105 if(!subf && strcmp(m_find(pfolder), fold) == 0) /* make default "current"*/
106 if(strcmp(m_find(pfolder), defalt) != 0) {
107 printf("[+%s now current]\n", defalt);
108 fflush(stdout); /*??*/
109 m_replace(pfolder, defalt);
110 }
111 maildir = m_maildir(fold);
112 if((cd = chdir(maildir)) < 0)
113 goto funnyfold;
114 if(access(".", 2) == -1) {
115 funnyfold: if(!m_delete(concat("cur-", fold, 0)))
116 printf("[Folder %s de-referenced]\n", fold);
117 else
118 fprintf(stderr, "You have no profile entry for the %s folder %s\n",
119 cd < 0 ? "unreadable" : "read-only", fold);
120 return(1);
121 }
122 dirp = opendir(".");
123 ent = readdir(dirp); /* move pointer past "." */
124 ent = readdir(dirp); /* move pointer past ".." */
125 while(ent = readdir(dirp)) {
126 if (ent->d_ino==0) continue;
127 switch (ent->d_name[0]) {
128 case '0':
129 case '1':
130 case '2':
131 case '3':
132 case '4':
133 case '5':
134 case '6':
135 case '7':
136 case '8':
137 case '9':
138 case '#':
139 case ',':
140 if(unlink(ent->d_name) == -1) {
141 fprintf(stderr, "Can't unlink %s:%s\n", fold,ent->d_name);
142 leftover++;
143 }
144 break;
145 default:
146 if (strcmp(ent->d_name, "cur") == 0 ||
147 strcmp(ent->d_name, "@") == 0) {
148 if(unlink(ent->d_name) == -1) {
149 fprintf(stderr, "Can't unlink %s:%s\n", fold,ent->d_name);
150 leftover++;
151 }
152 } else {
153 fprintf(stderr, "File \"%s/%s\" not deleted!\n", fold, ent->d_name);
154 leftover++;
155 }
156 }
157 }
158 closedir(dirp);
159 chdir(".."); /* Move out of dir to be deleted */
160 if (leftover) {
161 fprintf(stderr, "Folder %s not removed!\n", fold);
162 return(1);
163 }
164 if(rmdir(maildir))
165 fprintf(stderr, "rmdir failed!\n");
166 }