Annotation of researchv10no/cmd/worm/flink.c, revision 1.1

1.1     ! root        1: #include       <libc.h>
        !             2: #include       "worm.h"
        !             3: 
        !             4: static Inode *inodebase;
        !             5: static char *namebase;
        !             6: static long nnames, ninodes;
        !             7: static char *expanded;
        !             8: static readinodes;
        !             9: static ifd;
        !            10: 
        !            11: static Inode *diskinode();
        !            12: 
        !            13: static Inode *
        !            14: finode(s)
        !            15:        char *s;
        !            16: {
        !            17:        register lo, hi, m;
        !            18:        register Inode *i;
        !            19: 
        !            20:        if(readinodes == 0)
        !            21:                return(diskinode(s));
        !            22: #define        EXPAND(in)      (i = inodebase+(in), expanded[in]?0:(i->name.n=i->name.o+namebase, expanded[in]=1))
        !            23: #define        CMP(str, in)    (EXPAND(in), strcmp(str, i->name.n))
        !            24: 
        !            25:        if(CMP(s, lo = 0) < 0)
        !            26:                return(0);
        !            27:        if(CMP(s, (hi = ninodes)-1) > 0)
        !            28:                return(0);
        !            29:        while(lo < hi-1){
        !            30:                m = (lo+hi)/2;
        !            31:                if(CMP(s, m) < 0)
        !            32:                        hi = m;
        !            33:                else
        !            34:                        lo = m;
        !            35:        }
        !            36:        if(CMP(s, lo) == 0)
        !            37:                return(inodebase+lo);
        !            38:        else
        !            39:                return(0);
        !            40: }
        !            41: 
        !            42: static void
        !            43: ftraverse(fn)
        !            44:        void (*fn)();
        !            45: {
        !            46:        register Inode *i;
        !            47:        register n;
        !            48: 
        !            49:        if(readinodes == 0){
        !            50:                readinodes = 1;
        !            51:                lseek(ifd, 8L, 0);
        !            52:                read(ifd, (char *)inodebase, (int)ninodes*sizeof(Inode));
        !            53:        }
        !            54:        for(n = 0; n < ninodes; n++){
        !            55:                EXPAND(n);
        !            56:                (*fn)(i);
        !            57:        }
        !            58: }
        !            59: 
        !            60: fastlink(s, msg, ifn, tfn)
        !            61:        Superblock *s;
        !            62:        char **msg;
        !            63:        Inode *(**ifn)();
        !            64:        void (**tfn)();
        !            65: {
        !            66:        int n;
        !            67:        long t;
        !            68:        static char buf[256];
        !            69: 
        !            70:        *msg = 0;
        !            71:        *ifn = finode;
        !            72:        *tfn = ftraverse;
        !            73:        sprint(buf, "/usr/worm/tmp/%s", s->vol_id);
        !            74:        if((ifd = open(buf, 0)) < 0)
        !            75:                return(0);
        !            76:        read(ifd, (char *)&t, 4);
        !            77:        if(t != s->ctime)
        !            78:                return(0);
        !            79:        read(ifd, (char *)&ninodes, 4);
        !            80:        inodebase = (Inode *)malloc(n = ninodes*sizeof(Inode));
        !            81:        expanded = malloc((int)ninodes);
        !            82:        memset(expanded, 0, (int)ninodes);
        !            83:        lseek(ifd, (long)n, 1);
        !            84:        readinodes = 0;
        !            85:        read(ifd, (char *)&nnames, 4);
        !            86:        namebase = malloc((int)nnames);
        !            87:        read(ifd, namebase, (int)nnames);
        !            88:        numinodes = ninodes;
        !            89:        numnamechars = nnames;
        !            90:        return(1);
        !            91: }
        !            92: 
        !            93: static
        !            94: readi(ino, ip)
        !            95:        Inode *ip;
        !            96: {
        !            97:        static myino = -1;
        !            98:        static Inode myi;
        !            99: 
        !           100:        if(ino != myino){
        !           101:                myino = ino;
        !           102:                lseek(ifd, 8L+myino*sizeof(Inode), 0);
        !           103:                read(ifd, (char *)&myi, sizeof myi);
        !           104:                myi.name.n = myi.name.o+namebase;
        !           105:        }
        !           106:        *ip = myi;
        !           107: }
        !           108: 
        !           109: static Inode *
        !           110: diskinode(s)
        !           111:        char *s;
        !           112: {
        !           113:        register lo, hi, m;
        !           114:        static Inode ii;
        !           115:        register Inode *i = &ii;
        !           116: 
        !           117: #define READ(in)       readi(in, i)
        !           118: #undef CMP
        !           119: #define        CMP(str, in)    (READ(in), strcmp(str, i->name.n))
        !           120: 
        !           121:        if(ninodes <= 0)
        !           122:                return(0);
        !           123:        if(CMP(s, lo = 0) < 0)
        !           124:                return(0);
        !           125:        if(CMP(s, (hi = ninodes)-1) > 0)
        !           126:                return(0);
        !           127:        while(lo < hi-1){
        !           128:                m = (lo+hi)/2;
        !           129:                if(CMP(s, m) < 0)
        !           130:                        hi = m;
        !           131:                else
        !           132:                        lo = m;
        !           133:        }
        !           134:        if(CMP(s, lo) == 0)
        !           135:                return(i);
        !           136:        else
        !           137:                return(0);
        !           138: }

unix.superglobalmegacorp.com

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