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