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

1.1       root        1: #include       <libc.h>
                      2: #include       <cbt.h>
                      3: #undef nfree
                      4: #include       "worm.h"
                      5: #include       "sym.h"
                      6: #include       <sys/types.h>
                      7: #include       <sys/stat.h>
                      8: 
                      9: static char *inonames;
                     10: static bfile *bf;
                     11: static dirlk(), wormdir();
                     12: 
                     13: char *
                     14: cbtinit(s, blk, doinodes)
                     15:        register Superblock *s;
                     16:        long blk;
                     17: {
                     18:        static char buf[64];
                     19:        char name[256], buf1[256];
                     20: 
                     21:        if(s->magic != SMAGIC){
                     22:                fprint(2, "bad Superblock at %ld\n", blk);
                     23:                exit(1);
                     24:        }
                     25:        numinodes = s->ninodes;
                     26:        if(doinodes){
                     27:                inonames = malloc(s->blocksize*(int)NBLKS(s, s->ninochars));
                     28:                if(inonames == 0){
                     29:                        sprint(buf, "cbtinit: can't malloc %d\n", s->blocksize*(int)NBLKS(s, s->ninochars));
                     30:                        return(buf);
                     31:                }
                     32:                if(dirlk(s) == 0)
                     33:                        wormdir(s);
                     34:        } else
                     35:                inonames = 0;
                     36:        return((char *)0);
                     37: }
                     38: 
                     39: static
                     40: dirlk(s)
                     41:        register Superblock *s;
                     42: {
                     43:        char name[256], buf1[256];
                     44:        struct stat sbuf;
                     45:        int fd;
                     46: 
                     47:        sprint(name, "/usr/worm/dirs/%s", s->vol_id);
                     48:        sprint(buf1, "%s.I", name);
                     49:        if(stat(buf1, &sbuf) < 0)
                     50:                return(0);
                     51:        if(sbuf.st_mtime < s->ctime)
                     52:                return(0);      /* worm is more recent than disk */
                     53:        if((bf = bopen(name, 0)) == 0)
                     54:                return(0);
                     55:        sprint(buf1, "%s.I", name);
                     56:        if((fd = open(buf1, 0)) < 0){
                     57:                fprint(2, "%s: btree but no inodes\n", name);
                     58:                return(0);
                     59:        }
                     60:        if(read(fd, inonames, (int)s->ninochars) != s->ninochars){
                     61:                fprint(2, "%s: expected %d chars\n", buf1, s->ninochars);
                     62:                close(fd);
                     63:                return(0);
                     64:        }
                     65:        close(fd);
                     66:        return(1);
                     67: }
                     68: 
                     69: static
                     70: wormdir(s)
                     71:        register Superblock *s;
                     72: {
                     73:        char name[256], buf1[256];
                     74: 
                     75:        sprint(name, "/tmp/worm%d", getpid());
                     76:        Seek(s, s->binodes);
                     77:        sprint(buf1, "%s.F", name);
                     78:        copyout(s, buf1, s->nF, 0, 0);
                     79:        sprint(buf1, "%s.T", name);
                     80:        copyout(s, buf1, s->nT, 0, 0);
                     81:        if(Read(s, inonames, NBLKS(s, s->ninochars)))
                     82:                return(0);
                     83:        if((bf = bopen(name, 0)) == 0){
                     84:                fprint(2, "can't bopen %s", name);
                     85:                return(0);
                     86:        }
                     87:        sprint(buf1, "%s.F", name); unlink(buf1);
                     88:        sprint(buf1, "%s.T", name); unlink(buf1);
                     89:        return(1);
                     90: }
                     91: 
                     92: copyout(s, name, len, overwrite, verbose)
                     93:        register Superblock *s;
                     94:        char *name;
                     95:        long len;
                     96: {
                     97:        int fd, l;
                     98:        char *buf;
                     99: 
                    100:        if(access(name, 0) == 0){
                    101:                if(!overwrite){
                    102:                        fprint(2, "%s already exists!\n", name);
                    103:                        exit(1);
                    104:                }
                    105:                if(verbose)
                    106:                        fprint(2, "overwriting %s\n", name);
                    107:        }
                    108:        if((fd = creat(name, 0666)) < 0){
                    109:                perror(name);
                    110:                exit(1);
                    111:        }
                    112:        if((buf = malloc(l = (BIGBLOCK/1024)*s->blocksize)) == 0){
                    113:                fprint(2, "can't malloc %d\n", l);
                    114:                exit(1);
                    115:        }
                    116:        if(verbose)
                    117:                print("%s: %d bytes\n", name, len);
                    118:        while(len >= l){
                    119:                if(Read(s, buf, NBLKS(s, l)))
                    120:                        exit(1);
                    121:                if(write(fd, buf, l) != l){
                    122:                        perror(name);
                    123:                        exit(2);
                    124:                }
                    125:                len -= l;
                    126:        }
                    127:        if(Read(s, buf, NBLKS(s, len)))
                    128:                exit(2);
                    129:        if(write(fd, buf, (int)len) != len){
                    130:                perror(name);
                    131:                exit(2);
                    132:        }
                    133:        free(buf);
                    134: }
                    135: 
                    136: Inode *
                    137: binodefn(s)
                    138:        char *s;
                    139: {
                    140:        static Inode i;
                    141:        mbuf key;
                    142: 
                    143:        if(inonames == 0)
                    144:                return((Inode *)0);
                    145:        key.mdata = s;
                    146:        key.mlen = strlen(s);
                    147:        if(bseek(bf, key) != 1)
                    148:                return((Inode *)0);
                    149:        key.mdata = (char *)&i;
                    150:        if(bread(bf, (mbuf *)0, &key)){
                    151:                perror("inode read");
                    152:                return((Inode *)0);
                    153:        }
                    154:        i.name.n = i.name.o+inonames;
                    155:        return(&i);
                    156: }
                    157: 
                    158: void
                    159: btraverse(fn)
                    160:        void (*fn)();
                    161: {
                    162:        static Inode i;
                    163:        mbuf key;
                    164: 
                    165:        if(inonames == 0)
                    166:                return;
                    167:        bfirst(bf);
                    168:        key.mdata = (char *)&i;
                    169:        while(bread(bf, (mbuf *)0, &key) == 0){
                    170:                i.name.n = i.name.o+inonames;
                    171:                (*fn)(&i);
                    172:        }
                    173: }

unix.superglobalmegacorp.com

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