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

1.1       root        1: #include       <libc.h>
                      2: #include       "worm.h"
                      3: #include       "sym.h"
                      4: #include       <sys/types.h>
                      5: #include       <sys/stat.h>
                      6: #include       <fio.h>
                      7: 
                      8: Inode **inos;
                      9: long nino;
                     10: int fdT, fdF;
                     11: char *inonames;
                     12: char *timenow();
                     13: char *tmp = "/tmp";
                     14: 
                     15: cmp(a, b)
                     16:        Inode **a, **b;
                     17: {
                     18:        return(strcmp((*a)->name.n, (*b)->name.n));
                     19: }
                     20: 
                     21: main(argc, argv)
                     22:        char **argv;
                     23: {
                     24:        Superblock s, news;
                     25:        char *e;
                     26:        char *dev = "/dev/worm0";
                     27:        int c, fd;
                     28:        char dbname[256];
                     29:        extern char *optarg;
                     30:        extern int optind;
                     31:        void blkfn();
                     32: 
                     33:        while((c = getopt(argc, argv, "t:f:")) != -1)
                     34:                switch(c)
                     35:                {
                     36:                case 'f':       dev = optarg; break;
                     37:                case 't':       tmp = optarg; break;
                     38:                case '?':       usage();
                     39:                }
                     40:        dev = mapdev(dev);
                     41:        if(optind != argc-1)
                     42:                usage();
                     43:        sprint(dbname, "%s/cbt%d", tmp, getpid());
                     44:        fd = dbinit(dbname);
                     45:        if((s.fd = open(dev, 2)) < 0){
                     46:                perror(dev);
                     47:                exit(1);
                     48:        }
                     49:        if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
                     50:                fprint(2, "%s: %s\n", dev, e);
                     51:                exit(1);
                     52:        }
                     53:        if(strcmp(argv[optind], s.vol_id)){
                     54:                fprint(2, "wanted volid '%s'; got '%s'\n", argv[optind], s.vol_id);
                     55:                exit(1);
                     56:        }
                     57:        if((inos = (Inode **)malloc(sizeof(inos[0])*(int)numinodes)) == 0){
                     58:                fprint(2, "out of memory (%d inodes, %d bytes)\n", numinodes, sizeof(inos[0])*(int)numinodes);
                     59:                exit(1);
                     60:        }
                     61:        nino = 0;
                     62:        inodetraverse(blkfn);
                     63:        fprint(2, "%s: sorting inodes\n", timenow());
                     64:        qsort((char *)inos, (int)nino, sizeof(inos[0]), cmp);
                     65:        news = s;
                     66:        news.ninodes = nino;
                     67:        creatdb(fd, dbname, &news);     /* fills in nF, nT, inochars */
                     68:        c = NBLKS(&news, news.nF)+NBLKS(&news, news.nT)+NBLKS(&news, news.ninochars);
                     69:        if(c > news.nfree){
                     70:                fprint(2, "%s: sorry, not enough blocks; %d+%d+%d>%d\n", news.vol_id,
                     71:                        NBLKS(&news, news.nF), NBLKS(&news, news.nT),
                     72:                        NBLKS(&news, news.ninochars), news.nfree);
                     73:                exit(1);
                     74:        }
                     75:        Seek(&s, news.binodes = s.nextffree);
                     76:        fdwrite(&s, fdF, (int)news.nF);
                     77:        fdwrite(&s, fdT, (int)news.nT);
                     78:        memwrite(&s, inonames, (int)news.ninochars);
                     79:        /* set up link ptrs so that zeroing block zero undoes btreeing */
                     80:        s.nfree -= c;
                     81:        s.nextffree += c;
                     82:        s.ninodes = 0;
                     83:        if(e = lkwsb(&s))
                     84:                fprint(2, "%s\n", e);
                     85:        news.nextffree = s.nextffree;
                     86:        news.nfree = s.nfree;
                     87:        news.myblock = 0;
                     88:        news.version = VBTREE;
                     89:        news.nextsb = s.myblock;
                     90:        time(&news.ctime);
                     91:        Seek(&s, news.myblock);
                     92:        free((char *)inos);
                     93:        e = malloc(news.blocksize);
                     94:        if(e == 0){
                     95:                fprint(2, "wbtree: unbelievable malloc fail of %d\n", news.blocksize);
                     96:                exit(1);
                     97:        }
                     98:        memset(e, 0, news.blocksize);
                     99:        *((Superblock *)e) = news;
                    100:        Write(&s, e, 1L);
                    101:        exit(0);
                    102: }
                    103: 
                    104: usage()
                    105: {
                    106:        fprint(2, "Usage: worm btree [-fdevice] [-ttmpdir] vol_id\n");
                    107:        exit(2);
                    108: }
                    109: 
                    110: dbinit(name)
                    111:        char *name;
                    112: {
                    113:        char buf[256];
                    114:        struct stat sbuf;
                    115:        int pid, pip[2];
                    116: 
                    117:        fprint(2, "%s: init db '%s'\n", timenow(), name);
                    118:        sprint(buf, "cbt creat %s", name);
                    119:        if(system(buf))
                    120:                exit(1);
                    121:        pipe(pip);
                    122:        pid = fork();
                    123:        if(pid < 0){
                    124:                perror("fork");
                    125:                exit(1);
                    126:        }
                    127:        if(pid){
                    128:                close(pip[0]);
                    129:                return(pip[1]);
                    130:        } else {
                    131:                close(pip[1]);
                    132:                dup2(pip[0], 0);
                    133:                close(pip[0]);
                    134:                execl("/usr/lib/btree/btbuild", "btbuild", name, 0);
                    135:                perror("execl");
                    136:                exit(1);
                    137:                return(0);
                    138:        }
                    139: }
                    140: 
                    141: creatdb(fd, name, s)
                    142:        char *name;
                    143:        Superblock *s;  /* fills in nF, nT, inochars */
                    144: {
                    145:        char buf[256];
                    146:        struct stat sbuf;
                    147:        int status, i;
                    148:        short n;
                    149:        char *np;
                    150: 
                    151:        fprint(2, "%s: creating db '%s'\n", timenow(), name);
                    152:        inonames = malloc((int)numnamechars+1024);
                    153:        if(inonames == 0){
                    154:                sprint(buf, "malloc(%d) namechars failed", numnamechars+1024);
                    155:                perror(buf);
                    156:                exit(1);
                    157:        }
                    158:        Finit(fd, (char *)0);
                    159:        np = inonames;
                    160:        for(i = 0; i < nino; i++){
                    161:                n = strlen(inos[i]->name.n);
                    162:                Fwrite(fd, (char *)&n, 2L);
                    163:                Fwrite(fd, inos[i]->name.n, (long)n);
                    164:                memcpy(np, inos[i]->name.n, n+1);
                    165:                inos[i]->name.o = np - inonames;
                    166:                np += n+1;
                    167:                n = sizeof(Inode);
                    168:                Fwrite(fd, (char *)&n, 2L);
                    169:                Fwrite(fd, (char *)inos[i], (long)n);
                    170:        }
                    171:        s->ninochars = np-inonames;
                    172:        Fflush(fd);
                    173:        close(fd);
                    174:        if(wait(&status) < 0){
                    175:                perror("wbtree: wait");
                    176:                exit(1);
                    177:        }
                    178:        if(status){
                    179:                fprint(2, "wbtree: bad status %d from btbuild\n", status);
                    180:                exit(1);
                    181:        }
                    182:        sprint(buf, "%s.F", name);
                    183:        if(((fdF = open(buf, 0)) < 0) || (fstat(fdF, &sbuf) < 0)){
                    184:                perror(buf);
                    185:                exit(1);
                    186:        }
                    187:        unlink(buf);
                    188:        s->nF = sbuf.st_size;
                    189:        sprint(buf, "%s.T", name);
                    190:        if(((fdT = open(buf, 0)) < 0) || (fstat(fdT, &sbuf) < 0)){
                    191:                perror(buf);
                    192:                exit(1);
                    193:        }
                    194:        unlink(buf);
                    195:        s->nT = sbuf.st_size;
                    196:        fprint(2, "%s: db done\n", timenow());
                    197: }
                    198: 
                    199: void
                    200: blkfn(i)
                    201:        Inode *i;
                    202: {
                    203:        inos[nino++] = i;
                    204: }
                    205: 
                    206: fdwrite(s, fd, cnt)
                    207:        Superblock *s;
                    208: {
                    209:        char b[BIGBLOCK];
                    210:        int n;
                    211: 
                    212:        lseek(fd, 0L, 0);
                    213:        while(cnt >= sizeof b){
                    214:                n = read(fd, b, sizeof b);
                    215:                if(n != sizeof b){
                    216:                        perror("short read");
                    217:                        exit(3);
                    218:                }
                    219:                Write(s, b, NBLKS(s, sizeof b));
                    220:                cnt -= sizeof b;
                    221:        }
                    222:        if(cnt){
                    223:                if(read(fd, b, cnt) != cnt){
                    224:                        perror("short read");
                    225:                        exit(4);
                    226:                }
                    227:                memset(b+cnt, 0, sizeof b - cnt);
                    228:                Write(s, b, NBLKS(s, cnt));
                    229:        }
                    230: }
                    231: 
                    232: memwrite(s, base, cnt)
                    233:        Superblock *s;
                    234:        char *base;
                    235: {
                    236:        int chunk = (BIGBLOCK/1024)*s->blocksize;
                    237: 
                    238:        while(cnt >= chunk){
                    239:                Write(s, base, NBLKS(s, chunk));
                    240:                cnt -= chunk;
                    241:                base += chunk;
                    242:        }
                    243:        if(cnt)
                    244:                Write(s, base, NBLKS(s, cnt));
                    245: }
                    246: 
                    247: char *
                    248: timenow()
                    249: {
                    250:        long tim;
                    251:        char *tims;
                    252: 
                    253:        time(&tim);
                    254:        tims = ctime(&tim);
                    255:        tims[19] = 0;
                    256:        return(tims);
                    257: }

unix.superglobalmegacorp.com

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