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

1.1     ! root        1: #include       <libc.h>
        !             2: #include       "worm.h"
        !             3: #include       <sys/types.h>
        !             4: #include       <sys/udaioc.h>
        !             5: 
        !             6: Inode *(*inodefn)();
        !             7: void (*traversefn)();
        !             8: extern Inode *vinodefn(), *binodefn();
        !             9: extern void vtraverse(), btraverse();
        !            10: extern char *lkopi(), *cbtinit();
        !            11: long numinodes;
        !            12: long numnamechars;
        !            13: 
        !            14: char *
        !            15: openinode(s, flags)
        !            16:        register Superblock *s;
        !            17: {
        !            18:        short fd = s->fd;
        !            19:        char *b, *z;
        !            20:        long blk;
        !            21:        unsigned short ibuf[3];
        !            22:        static char buf[64];
        !            23:        extern char *getenv();
        !            24:        extern long atol();
        !            25: int goo; extern errno; int ntry;
        !            26: 
        !            27:        if(z = getenv("WORMZERO"))
        !            28:                blk = atol(z);
        !            29:        else
        !            30:                blk = 0;
        !            31:        ntry = 0;
        !            32: loop:
        !            33:        bigseek(s->fd, blk, 1024, 0);
        !            34:        if(((goo = read(s->fd, (char *)ibuf, sizeof ibuf)) != sizeof ibuf) ||
        !            35:                        ((((long)ibuf[1])<<16|ibuf[0]) != SMAGIC)){
        !            36:                if((goo < 0) && (errno == ENXIO))
        !            37:                        blk++;  /* blank check (unwritten), try next blk */
        !            38:                else if((goo == sizeof ibuf) && (ibuf[0] == 0) && (ibuf[1] == 0))
        !            39:                        blk++;  /* zeroes(??), try next blk */
        !            40:                else {
        !            41:                        fprint(2, "DEBUGGING[%d]: read=%d magic=0x%lx errno=%d\n",
        !            42:                                ntry, goo, (((long)ibuf[1])<<16|ibuf[0]), errno);
        !            43:                        if(ntry++ < 3)
        !            44:                                goto loop;
        !            45:                }
        !            46:                bigseek(s->fd, blk, 1024, 0);
        !            47:                if(read(s->fd, (char *)ibuf, sizeof ibuf) < sizeof ibuf)
        !            48:                        return("no block size");
        !            49:        }
        !            50:        if(flags&SPIN_DOWN)
        !            51:                ioctl(s->fd, UIOSPDW);
        !            52:        s->blocksize = ibuf[2];         /* magic is 0-1 */
        !            53:        if((b = malloc(s->blocksize)) == 0){
        !            54:                sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
        !            55:                return(buf);
        !            56:        }
        !            57:        bigseek(s->fd, blk, 1024, 0);
        !            58:        if(read(s->fd, b, s->blocksize) != s->blocksize)
        !            59:                return("superblock read error");
        !            60:        *s = *((Superblock *)b);
        !            61:        free(b);
        !            62:        s->fd = fd;
        !            63:        if(s->myblock == 0)
        !            64:                s->myblock = blk;
        !            65:        switch(s->version)
        !            66:        {
        !            67:        case VLINK:
        !            68:                if(flags&DO_INODE){
        !            69:                        Superblock tmpsb;
        !            70: 
        !            71:                        tmpsb = *s;
        !            72:                        if(b = lkopi(s, blk, 0))
        !            73:                                return(b);
        !            74:                        if(fastlink(s, &b, &inodefn, &traversefn))
        !            75:                                return(b);
        !            76:                        *s = tmpsb;
        !            77:                }
        !            78:                inodefn = vinodefn;
        !            79:                traversefn = vtraverse;
        !            80:                return(lkopi(s, blk, flags&DO_INODE));
        !            81:        case VBTREE:
        !            82:                inodefn = binodefn;
        !            83:                traversefn = btraverse;
        !            84:                return(cbtinit(s, blk, flags&DO_INODE));
        !            85:        default:
        !            86:                sprint(buf, "unknown version %d@%ld", s->version, blk);
        !            87:                return(buf);
        !            88:        }
        !            89: }

unix.superglobalmegacorp.com

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