]> diplodocus.org Git - nmh/blob - docs/historical/2.9BSD/cmds/rmf.c
Added start_test/finish_test to a bunch of tests.
[nmh] / docs / historical / 2.9BSD / 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 <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 && removedir(maildir))
161 return(0);
162 else
163 fprintf(stderr, "Folder %s not removed!\n", fold);
164 return(1);
165 }
166
167
168 removedir(dir)
169 {
170 register int pid, wpid;
171 int status;
172
173 if((pid = fork()) == 0) {
174 m_update();
175 fflush(stdout);
176 execl("/bin/rmdir", "rmdir", dir, 0);
177 execl("/usr/bin/rmdir", "rmdir", dir, 0);
178 fprintf(stderr, "Can't exec rmdir!!?\n");
179 return(0);
180 }
181 if(pid == -1) {
182 fprintf(stderr, "Can't fork\n");
183 return(0);
184 }
185 while((wpid = wait(&status)) != pid && wpid != -1) ;
186 if(status) {
187 fprintf(stderr, "Bad exit status (%o) from rmdir.\n", status);
188 /* return(0); */
189 }
190 return(1);
191 }