0
|
1 /* rmf.c - remove a folder */
|
|
2 #ifndef lint
|
12
|
3 static char ident[] = "@(#)$Id: rmf.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
|
0
|
4 #endif /* lint */
|
|
5
|
|
6 #include "../h/mh.h"
|
|
7 #include "../h/local.h"
|
|
8 #include <stdio.h>
|
|
9 #ifdef LOCALE
|
|
10 #include <locale.h>
|
|
11 #endif
|
|
12
|
|
13 /* */
|
|
14
|
|
15 static struct swit switches[] = {
|
|
16 #define INTRSW 0
|
|
17 "interactive", 0,
|
|
18 #define NINTRSW 1
|
|
19 "nointeractive", 0,
|
|
20
|
|
21 #define HELPSW 2
|
|
22 "help", 4,
|
|
23
|
|
24 NULL, 0
|
|
25 };
|
|
26
|
|
27 static int rmf();
|
|
28 static rma();
|
|
29 /* */
|
|
30
|
|
31 /* ARGSUSED */
|
|
32
|
|
33 main (argc, argv)
|
|
34 int argc;
|
|
35 char *argv[];
|
|
36 {
|
|
37 int defolder = 0,
|
|
38 interactive = -1;
|
|
39 char *cp,
|
|
40 *folder = NULL,
|
|
41 newfolder[BUFSIZ],
|
|
42 buf[100],
|
|
43 **ap,
|
|
44 **argp,
|
|
45 *arguments[MAXARGS];
|
|
46
|
|
47 #ifdef LOCALE
|
|
48 setlocale(LC_ALL, "");
|
|
49 #endif
|
|
50 #ifdef JAPAN
|
|
51 ml_init();
|
|
52 #endif /* JAPAN */
|
|
53 invo_name = r1bindex (argv[0], '/');
|
|
54 if ((cp = m_find (invo_name)) != NULL) {
|
|
55 ap = brkstring (cp = getcpy (cp), " ", "\n");
|
|
56 ap = copyip (ap, arguments);
|
|
57 }
|
|
58 else
|
|
59 ap = arguments;
|
|
60 (void) copyip (argv + 1, ap);
|
|
61 argp = arguments;
|
|
62
|
|
63 /* */
|
|
64
|
|
65 while (cp = *argp++) {
|
|
66 if (*cp == '-')
|
|
67 switch (smatch (++cp, switches)) {
|
|
68 case AMBIGSW:
|
|
69 ambigsw (cp, switches);
|
|
70 done (1);
|
|
71 case UNKWNSW:
|
|
72 adios (NULLCP, "-%s unknown", cp);
|
|
73 case HELPSW:
|
|
74 (void) sprintf (buf, "%s [+folder] [switches]", invo_name);
|
|
75 help (buf, switches);
|
|
76 done (1);
|
|
77
|
|
78 case INTRSW:
|
|
79 interactive = 1;
|
|
80 continue;
|
|
81 case NINTRSW:
|
|
82 interactive = 0;
|
|
83 continue;
|
|
84 }
|
|
85 if (*cp == '+' || *cp == '@') {
|
|
86 if (folder)
|
|
87 adios (NULLCP, "only one folder at a time!");
|
|
88 else
|
|
89 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
|
|
90 }
|
|
91 else
|
|
92 adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
|
|
93 }
|
|
94
|
|
95 /* */
|
|
96
|
|
97 if (!m_find ("path"))
|
|
98 free (path ("./", TFOLDER));
|
|
99 if (!folder) {
|
|
100 folder = m_getfolder ();
|
|
101 defolder++;
|
|
102 }
|
|
103 if (strcmp (m_mailpath (folder), pwd ()) == 0)
|
|
104 adios (NULLCP, "sorry, you can't remove the current working directory");
|
|
105
|
|
106 if (interactive == -1)
|
|
107 interactive = defolder;
|
|
108
|
|
109 if (index (folder, '/') && (*folder != '/') && (*folder != '.')) {
|
|
110 for (cp = copy (folder, newfolder); cp > newfolder && *cp != '/'; cp--)
|
|
111 continue;
|
|
112 if (cp > newfolder)
|
|
113 *cp = '\0';
|
|
114 else
|
|
115 (void) strcpy (newfolder, (cp = m_find (inbox)) ? cp : defalt);
|
|
116 }
|
|
117 else
|
|
118 (void) strcpy (newfolder, (cp = m_find (inbox)) ? cp : defalt);
|
|
119
|
|
120 if (interactive) {
|
|
121 cp = concat ("Remove folder \"", folder, "\"? ", NULLCP);
|
|
122 if (!getanswer (cp))
|
|
123 done (0);
|
|
124 free (cp);
|
|
125 }
|
|
126
|
|
127 if (rmf (folder) == OK && strcmp (m_find (pfolder), newfolder)) {
|
|
128 printf ("[+%s now current]\n", newfolder);
|
|
129 m_replace (pfolder, newfolder);
|
|
130 }
|
|
131 m_update ();
|
|
132
|
|
133 done (0);
|
|
134 }
|
|
135
|
|
136 /* */
|
|
137
|
|
138 static int rmf (folder)
|
|
139 register char *folder;
|
|
140 {
|
|
141 int i,
|
|
142 j,
|
|
143 others;
|
|
144 register char *maildir;
|
|
145 char cur[BUFSIZ];
|
|
146 #ifdef SYS5DIR
|
|
147 register struct dirent *dp;
|
|
148 #else /* SYS5DIR */
|
|
149 register struct direct *dp;
|
|
150 #endif /* SYS5DIR */
|
|
151 register DIR * dd;
|
|
152
|
|
153 #ifdef COMPAT
|
|
154 (void) m_delete (concat (current, "-", m_mailpath (folder), NULLCP));
|
|
155 #endif /* COMPAT */
|
|
156 switch (i = chdir (maildir = m_maildir (folder))) {
|
|
157 case OK:
|
|
158 if (access (".", 2) != NOTOK && access ("..", 2) != NOTOK)
|
|
159 break; /* fall otherwise */
|
|
160
|
|
161 case NOTOK:
|
|
162 (void) sprintf (cur, "atr-%s-%s", current, m_mailpath (folder));
|
|
163 if (!m_delete (cur)) {
|
|
164 printf ("[+%s de-referenced]\n", folder);
|
|
165 return OK;
|
|
166 }
|
|
167 advise (NULLCP, "you have no profile entry for the %s folder +%s",
|
|
168 i == NOTOK ? "unreadable" : "read-only", folder);
|
|
169 return NOTOK;
|
|
170 }
|
|
171
|
|
172 if ((dd = opendir (".")) == NULL)
|
|
173 adios (NULLCP, "unable to read folder +%s", folder);
|
|
174 others = 0;
|
|
175
|
|
176 j = strlen (SBACKUP);
|
|
177 while (dp = readdir (dd)) {
|
|
178 switch (dp -> d_name[0]) {
|
|
179 case '.':
|
|
180 if (strcmp (dp -> d_name, ".") == 0
|
|
181 || strcmp (dp -> d_name, "..") == 0)
|
|
182 continue; /* else fall */
|
|
183
|
|
184 case ',':
|
|
185 #ifdef MHE
|
|
186 case '+':
|
|
187 #endif /* MHE */
|
|
188 #ifdef UCI
|
|
189 case '_':
|
|
190 case '#':
|
|
191 #endif /* UCI */
|
|
192 break;
|
|
193
|
|
194 default:
|
|
195 if (m_atoi (dp -> d_name))
|
|
196 break;
|
|
197 #ifdef COMPAT
|
|
198 if (strcmp (dp -> d_name, current) == 0)
|
|
199 break;
|
|
200 #endif /* COMPAT */
|
|
201 if (strcmp (dp -> d_name, LINK) == 0
|
|
202 || strncmp (dp -> d_name, SBACKUP, j) == 0)
|
|
203 break;
|
|
204
|
|
205 admonish (NULLCP, "file \"%s/%s\" not deleted",
|
|
206 folder, dp -> d_name);
|
|
207 others++;
|
|
208 continue;
|
|
209 }
|
|
210 if (unlink (dp -> d_name) == NOTOK) {
|
|
211 admonish (dp -> d_name, "unable to unlink %s:", folder);
|
|
212 others++;
|
|
213 }
|
|
214 }
|
|
215
|
|
216 closedir (dd);
|
|
217
|
|
218 rma (folder);
|
|
219
|
|
220 (void) chdir ("..");
|
|
221 if (others == 0 && remdir (maildir))
|
|
222 return OK;
|
|
223
|
|
224 advise (NULLCP, "folder +%s not removed", folder);
|
|
225 return NOTOK;
|
|
226 }
|
|
227
|
|
228 /* */
|
|
229
|
|
230 static rma (folder)
|
|
231 register char *folder;
|
|
232 {
|
|
233 register int alen,
|
|
234 j,
|
|
235 plen;
|
|
236 register char *cp;
|
|
237 register struct node *np,
|
|
238 *pp;
|
|
239
|
|
240 alen = strlen ("atr-");
|
|
241 plen = strlen (cp = m_mailpath (folder)) + 1;
|
|
242
|
|
243 m_getdefs ();
|
|
244 for (np = m_defs, pp = NULL; np; np = np -> n_next)
|
|
245 if (ssequal ("atr-", np -> n_name)
|
|
246 && (j = strlen (np -> n_name) - plen) > alen
|
|
247 && *(np -> n_name + j) == '-'
|
|
248 && strcmp (cp, np -> n_name + j + 1) == 0) {
|
|
249 if (!np -> n_context)
|
|
250 admonish (NULLCP, "bug: m_delete(key=\"%s\")", np -> n_name);
|
|
251 if (pp) {
|
|
252 pp -> n_next = np -> n_next;
|
|
253 np = pp;
|
|
254 }
|
|
255 else
|
|
256 m_defs = np -> n_next;
|
|
257 ctxflags |= CTXMOD;
|
|
258 }
|
|
259 else
|
|
260 pp = np;
|
|
261 }
|