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