Annotation of researchv10no/cmd/chuck/dir.c, revision 1.1.1.1

1.1       root        1: #include "fs.h"
                      2: 
                      3: dirblocks()
                      4: {      int i;
                      5:        i = -1;
                      6: loop:
                      7:        if(++i >= lblk)
                      8:                return;
                      9:        switch(bmap[i].type) {
                     10:        default:
                     11:                pmesg("strange blk type %d in dirblocks\n", bmap[i].type);
                     12:                bmap[i].type = Bad;
                     13:                goto loop;
                     14:        case Unk: case Sblock: case Inode: case Free: case Data: case Ind:
                     15:        case Ind2: case Ind3: case Bits: case Ioerr: case Bad: case Boot:
                     16:                goto loop;
                     17:        case First:
                     18:                if(bread(i, buf, 1)) {
                     19:                        pmesg("dir %d first read %d failed\n", bmap[i].ino, i);
                     20:                        bmap[i].type = Ioerr;
                     21:                        direrror(Efirstio, bmap[i].ino);
                     22:                        goto loop;
                     23:                }
                     24:                dofirst(i);
                     25:                doother(i);
                     26:                goto loop;
                     27:        case Other:
                     28:                if(bread(i, buf, 1)) {
                     29:                        pmesg("dir %d blk read %d failed\n", bmap[i].ino, i);
                     30:                        bmap[i].type = Ioerr;
                     31:                        direrror(Edirio, bmap[i].ino);
                     32:                        goto loop;
                     33:                }
                     34:                doother(i);
                     35:                goto loop;
                     36:        }
                     37: }
                     38: 
                     39: /* check that the first two entries are named . and .., and that .'s ino is ours */
                     40: /* also check the directory's length somewhere FIX */
                     41: dofirst(i)
                     42: {      struct direct *dp;
                     43:        int ino = bmap[i].ino;
                     44:        dp = (struct direct *) buf;
                     45:        if(dp->d_name[0] != '.' || dp->d_name[1] != 0)
                     46:                direrror(Enotdot, ino, 0);
                     47:        if(dp->d_ino != ino)
                     48:                direrror(Edotino, ino, dp->d_ino);
                     49:        dp++;
                     50:        if(dp->d_name[0] != '.' || dp->d_name[1] != '.' || dp->d_name[2] != 0)
                     51:                direrror(Enotdotdot, ino, 0);
                     52:        else {
                     53:                if(imap[ino].dotdot)
                     54:                        direrror(Emulti, ino, imap[ino].dotdot);
                     55:                imap[ino].dotdot = dp->d_ino;   /* unchecked FIX */
                     56:        }
                     57:        if(ino == imap[ino].dotdot && ino != ROOTINO)
                     58:                direrror(Efakeroot, ino, 0);
                     59: }
                     60:        
                     61: doother(n)
                     62: {      register int ino = bmap[n].ino, j;
                     63:        register struct direct *dp = (struct direct *) buf, *dend;
                     64:        register char *p;
                     65:        register im *ip;
                     66:        dend = (struct direct *) (buf + bsize);
                     67:        if(dmapptr+(dend-dp) >= dmaplen) {
                     68:                dmaplen *= 3;
                     69:                dmap = (dm *) realloc((char *) dmap, dmaplen*sizeof(dm));
                     70:                if(!dmap)
                     71:                        fatal("doother realloc(%d) failed\n", dmaplen);
                     72:        }
                     73:        for(; dp < dend; dp++) {
                     74:                if(dp->d_ino == 0)
                     75:                        continue;
                     76:                if(dp->d_ino < 1 || dp->d_ino >= ninode) {
                     77:                        direrror(Ebadino, ino, n);
                     78:                        continue;
                     79:                }
                     80:                ip = imap + dp->d_ino;
                     81:                if(ip->type == Dir) {
                     82:                        dmap[dmapptr].dino = ino;
                     83:                        dmap[dmapptr].ino = dp->d_ino;
                     84:                        dmapptr++;
                     85:                }
                     86:                else if(ip->type == Unalloc) {
                     87:                        direrror(Ebadino, ino, n);
                     88:                        /* should we look more closely at inode? FIX */
                     89:                }
                     90:                ip->nrefs++;
                     91:                p = dp->d_name;
                     92:                if(p[0] != '.' || (p[1] != '.' && p[1]) || p[2] != 0)
                     93:                        ip->parent = ino;       /* ., .. don't help */
                     94:                for(j = 0; j < DIRSIZ; j++, p++)
                     95:                        if(*p <= 0 || *p > 127)
                     96:                                break;
                     97:                if(j >= DIRSIZ)
                     98:                        continue;
                     99:                if(*p) {
                    100:                        direrror(Ebadname, ino, dp->d_ino);
                    101:                        continue;
                    102:                }
                    103:                for(; j < DIRSIZ; j++, p++)
                    104:                        if(*p)
                    105:                                break;
                    106:                if(j >= DIRSIZ)
                    107:                        continue;
                    108:                direrror(Ebadname, ino, dp->d_ino);
                    109:        }
                    110: }
                    111: 
                    112: dcmp(a, b)
                    113: register dm *a, *b;
                    114: {
                    115:        return(a->dino - b->dino);
                    116: }
                    117: 
                    118: dirtree()
                    119: {      register int i, last = -1;
                    120:        /* sort by directory */
                    121:        qsort((char *)dmap, dmapptr, sizeof(dm), dcmp);
                    122:        for(i = 0; i < dmapptr; i++)
                    123:                if(dmap[i].dino != last) {
                    124:                        last = dmap[i].dino;
                    125:                        imap[last].ptr = i;
                    126:                }
                    127:        /* is dotdot really a parent pointer? */
                    128:        for(i = 1; i < ninode; i++) {
                    129:                if(imap[i].type != Dir)
                    130:                        continue;
                    131:                if(dirin(i, imap[i].dotdot))
                    132:                        continue;
                    133:                direrror(Ebadparent, i, imap[i].dotdot);
                    134:        }
                    135:        /* are they all accessible from the root? */
                    136:        if(imap[ROOTINO].type != Dir)
                    137:                fatal("root ino %d not a directory\n", ROOTINO);        /* FIX */
                    138:        chtree(ROOTINO);
                    139:        for(i = 0; i < ninode; i++) {
                    140:                if(imap[i].type != Dir)
                    141:                        continue;
                    142:                if(!imap[i].seen)
                    143:                        direrror(Eattach, i, 0);
                    144:        }
                    145: }
                    146: 
                    147: chtree(n)
                    148: {      dm *d;
                    149:        if(!imap[n].ptr && n != ROOTINO) {
                    150:                pmesg("dir %s contains nothing\n", prino(n));
                    151:                return;
                    152:        }
                    153:        imap[n].seen = 1;
                    154:        for(d = dmap + imap[n].ptr; d->dino == n; d++)  /* end condition? FIX */
                    155:                if(!imap[d->ino].seen)
                    156:                        chtree(d->ino);
                    157: }
                    158:                
                    159: dirin(child, parent)
                    160: {      int n, i;
                    161:        for(n = imap[parent].ptr; n < dmapptr && dmap[n].dino == parent; n++)
                    162:                if(dmap[n].ino == child)
                    163:                        return(1);
                    164:        return(0);
                    165: }

unix.superglobalmegacorp.com

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