Annotation of 43BSD/contrib/mh/uip/rmf.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.