Annotation of 43BSD/contrib/mh/uip/rmf.c, revision 1.1.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.