]> diplodocus.org Git - nmh/blob - docs/historical/SRI-NOSC/rmf.c
Added start_test/finish_test to a bunch of tests.
[nmh] / docs / historical / SRI-NOSC / rmf.c
1 #include "mh.h"
2 #include "stat.h"
3
4 char *anoyes[]; /* Std no/yes gans array */
5 char defalt[];
6
7 int fout;
8 int subf;
9
10 struct msgs *mp;
11 struct dirent {
12 int inum;
13 char name[14];
14 int pad;
15 };
16 struct swit switches[] {
17 "help", 4, /* 0 */
18 0, 0
19 };
20
21 main(argc, argv)
22 char *argv[];
23 {
24 register char *cp, *ap;
25 char *folder, buf[128];
26 int i, def_fold;
27 struct inode stbf;
28 struct dirent ent;
29 char *arguments[50], **argp;
30
31 fout = dup(1);
32 #ifdef NEWS
33 m_news();
34 #endif
35 folder = 0;
36 ap = cp = argv[0];
37 while(*cp)
38 if(*cp++ == '/')
39 ap = cp;
40 if((cp = m_find(ap)) != -1) {
41 ap = brkstring(cp = getcpy(cp), " ", "\n");
42 ap = copyip(ap, arguments);
43 } else
44 ap = arguments;
45 copyip(argv+1, ap);
46 argp = arguments;
47 while(cp = *argp++) {
48 if(*cp == '-')
49 switch(smatch(++cp, switches)) {
50 case -2:ambigsw(cp, switches); /* ambiguous */
51 goto leave;
52 /* unknown */
53 case -1:printf("rmf: -%s unknown\n", cp);
54 goto leave;
55 /* -help */
56 case 0: help("rmf [+folder] [switches]", switches);
57 goto leave;
58 }
59 if(*cp == '+')
60 if(folder) {
61 printf("Only one folder at a time.\n");
62 goto leave;
63 } else
64 folder = cp + 1;
65 else {
66 printf("Usage: rmf [+folder]\n");
67 goto leave;
68 }
69 }
70 if(!folder) {
71 folder = m_getfolder();
72 def_fold++;
73 }
74 subf = !((!any('/', folder)) | (*folder == '/') | (*folder == '.'));
75 if(def_fold && !subf) {
76 cp = concat("Remove folder \"", folder, "\" ?? ", 0);
77 if(!gans(cp, anoyes))
78 goto leave;
79 free(cp);
80 }
81 if(rmfold(folder))
82 goto leave;
83 if(subf) {
84 cp = copy(folder, buf);
85 while(cp > buf && *cp != '/') --cp;
86 if(cp > buf) {
87 *cp = 0;
88 printf("[+%s now current]\n", buf);
89 m_replace("folder", buf);
90 }
91 }
92 leave:
93 m_update();
94 flush();
95 }
96
97 struct dirent ent;
98
99 rmfold(fold)
100 char *fold;
101 {
102 register char *maildir;
103 int i, leftover;
104 register char *cp, *sp;
105 char nambuf[10];
106 struct inode stbf;
107
108 leftover = 0;
109 if(!subf && equal(m_find("folder"), fold)) { /* don't re-do */
110 printf("[+%s now current]\n", defalt);
111 flush(); /*??*/
112 m_replace("folder", defalt);
113 }
114 maildir = m_maildir(fold);
115 if(chdir(maildir) < 0) {
116 printf("Can't chdir to: "); flush();
117 perror(maildir);
118 return(1);
119 }
120 if(access(".", 2) == -1) {
121 if(!m_delete(concat("cur-", fold, 0)))
122 printf("[Folder %s de-referenced]\n", fold);
123 else
124 printf("You have no profile entry for the read-only folder %s\n", fold);
125 return(1);
126 }
127 i = open(".", 0);
128 ent.pad = 0;
129 while(read(i, &ent.inum, sizeof ent.name + sizeof ent.inum))
130 if(ent.inum)
131 if((ent.name[0] >= '0' && ent.name[0] <= '9') ||
132 ent.name[0] == ',' ||
133 equal(ent.name, "cur") ||
134 equal(ent.name, "@")) {
135 if(unlink(ent.name) == -1) {
136 printf("Can't unlink %s:%s\n", fold,ent.name);
137 leftover++;
138 }
139 } else if(!equal(ent.name,".")&& !equal(ent.name,"..")) {
140 printf("File \"%s/%s\" not deleted!\n",
141 fold, ent.name);
142 leftover++;
143 }
144 close(i);
145 if(!leftover && removedir(maildir))
146 return(0);
147 else
148 printf("Folder %s not removed!\n", fold);
149 return(1);
150 }
151
152
153 removedir(dir)
154 {
155 register int i, j;
156 int status;
157
158 if((i = fork()) == 0) {
159 m_update();
160 flush();
161 execl("/bin/rmdir", "rmdir", dir, 0);
162 printf("Can't exec rmdir!!?\n");
163 flush();
164 return(0);
165 }
166 if(i == -1) {
167 printf("Can't fork\n");
168 flush();
169 return(0);
170 }
171 while((j = waita(&status)) != i && j != -1) ;
172 if(status) {
173 printf("Bad exit status (%o) from rmdir.\n", status);
174 flush();
175 /* return(0); */
176 }
177 return(1);
178 }