Annotation of researchv10no/cmd/worm/vlink.c, revision 1.1.1.1

1.1       root        1: #include       <libc.h>
                      2: #include       "worm.h"
                      3: #include       "sym.h"
                      4: 
                      5: char *
                      6: lkopi(s, blk, doinodes)
                      7:        register Superblock *s;
                      8:        long blk;
                      9: {
                     10:        register Inode *i;
                     11:        short fd = s->fd;
                     12:        char *b;
                     13:        long nb;
                     14:        char *nameb;
                     15:        Inode *inodes;
                     16:        static char buf[64];
                     17: 
                     18:        if((b = malloc(s->blocksize)) == 0){
                     19:                sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
                     20:                return(buf);
                     21:        }
                     22:        numinodes = 0;
                     23:        numnamechars = 0;
                     24:        for(;;){
                     25:                if(s->magic != SMAGIC){
                     26:                        fprint(2, "bad Superblock at %ld\n", blk);
                     27:                        exit(1);
                     28:                }
                     29:                if(s->ninodes){
                     30:                        numinodes += s->ninodes;
                     31:                        numnamechars += s->ninochars;
                     32:                }
                     33:                if(doinodes && s->ninodes){
                     34:                        nb = (s->ninodes+IPERB-1)/IPERB;
                     35:                        inodes = (Inode *)malloc((unsigned)(s->blocksize*nb));
                     36:                        if(inodes == 0){
                     37:                                sprint(buf, "inode malloc(%d) fail, sbrk=%d\n",
                     38:                                        (s->blocksize*nb), sbrk(0));
                     39:                                return(buf);
                     40:                        }
                     41:                        Seek(s, s->binodes);
                     42:                        if(Read(s, (char *)inodes, nb))
                     43:                                goto skip;
                     44:                        nb = (s->ninochars+s->blocksize-1)/s->blocksize;
                     45:                        nameb = malloc((unsigned)(s->blocksize*nb));
                     46:                        if(nameb == 0){
                     47:                                sprint(buf, "name buffer malloc(%d) fail, sbrk=%d\n",
                     48:                                        (s->blocksize*nb), sbrk(0));
                     49:                                return(buf);
                     50:                        }
                     51:                        if(Read(s, nameb, nb))
                     52:                                goto skip;
                     53:                        for(nb = 0, i = inodes; nb < s->ninodes; nb++, i++){
                     54:                                i->name.n = i->name.o+nameb;
                     55: if(strcmp(i->name.n, "v14725/791")==0) print("%s at block %d\n", i->name.n, i->block);
                     56:                                if(i->block < 0)
                     57:                                        (void)symdel(i->name.n, S_INODE);
                     58:                                else {
                     59:                                        (void)symlook(i->name.n, S_INODE, (void *)i);
                     60:                                }
                     61:                        }
                     62:                        if(sym_mem_fail){
                     63:                                sprint(buf, "%d inode malloc fails: %d, %d sbrk=%d\n",
                     64:                                        sym_mem_fail, numinodes, s->ninodes, sbrk(0));
                     65:                                return(buf);
                     66:                        }
                     67:                }
                     68:        skip:
                     69:                blk = s->nextsb;
                     70:                Seek(s, blk);
                     71:                if(Read(s, b, 1L))
                     72:                        break;
                     73:                *s = *((Superblock *)b);
                     74:                s->fd = fd;
                     75:                if(s->myblock == 0)
                     76:                        s->myblock = blk;
                     77:        }
                     78:        free(b);
                     79:        return((char *)0);
                     80: }
                     81: 
                     82: char *
                     83: lkwri(s, i, ni, c, nc, ndata)
                     84:        Superblock *s;
                     85:        Inode *i;
                     86:        long ni, nc, ndata;
                     87:        char *c;
                     88: {
                     89:        char *b;
                     90:        long blk;
                     91:        static char buf[256];
                     92:        long ib, ic;
                     93: 
                     94:        s->ninodes = ni;
                     95:        s->ninochars = nc;
                     96:        ib = (ni+IPERB-1)/IPERB;
                     97:        ic = (nc+s->blocksize-1)/s->blocksize;
                     98:        if(ndata+ib+ic+1 > s->nfree)            /* one for superblock */
                     99:                return("not enough space for new files");
                    100:        s->binodes = s->nextffree+ndata;
                    101:        s->nextffree += ndata+ib+ic;
                    102:        s->nfree -= ndata+ib+ic;
                    103: 
                    104:        if((b = malloc(s->blocksize)) == 0){
                    105:                sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
                    106:                return(buf);
                    107:        }
                    108:        blk = s->nextsb;
                    109:        s->nextsb = s->nextffree++;
                    110:        s->nfree--;
                    111:        s->myblock = blk;
                    112:        time(&s->ctime);
                    113:        memset(b, 0, s->blocksize);
                    114:        *((Superblock *)b) = *s;
                    115:        Seek(s, blk);
                    116:        if(Write(s, b, 1L)){
                    117:                sprint(buf, "couldn't write superblock at %d", blk);
                    118:                return(buf);
                    119:        }
                    120:        free(b);
                    121:        Seek(s, s->binodes);
                    122:        if(Write(s, (char *)i, ib))
                    123:                return("write1 error");
                    124:        if(Write(s, c, ic))
                    125:                return("write2 error");
                    126:        return((char *)0);
                    127: }
                    128: 
                    129: 
                    130: char *
                    131: lkwsb(s)
                    132:        Superblock *s;
                    133: {
                    134:        char *b;
                    135:        long blk;
                    136:        static char buf[64];
                    137: 
                    138:        if((b = malloc(s->blocksize)) == 0){
                    139:                sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
                    140:                return(buf);
                    141:        }
                    142:        blk = s->nextsb;
                    143:        s->nextsb = s->nextffree++;
                    144:        s->nfree--;
                    145:        memset(b, 0, s->blocksize);
                    146:        s->myblock = blk;
                    147:        *((Superblock *)b) = *s;
                    148:        Seek(s, blk);
                    149:        if(Write(s, b, 1L))
                    150:                return("couldn't write superblock");
                    151:        free(b);
                    152:        return((char *)0);
                    153: }
                    154: 
                    155: Inode *
                    156: vinodefn(s)
                    157:        char *s;
                    158: {
                    159:        return((Inode *)symlook(s, S_INODE, (void *)0));
                    160: }
                    161: 
                    162: void
                    163: vtraverse(fn)
                    164:        void (*fn)();
                    165: {
                    166:        symtraverse(S_INODE, fn);
                    167: }

unix.superglobalmegacorp.com

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