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

1.1       root        1: #include       <libc.h>
                      2: #include       <fio.h>
                      3: #include       <sys/types.h>
                      4: #include       <sys/stat.h>
                      5: #include       <signal.h>
                      6: #include       "worm.h"
                      7: 
                      8: static int bad = 0;
                      9: static long nbytes;
                     10: static long nfiles;
                     11: char *argout;
                     12: 
                     13: main(argc, argv)
                     14:        char **argv;
                     15: {
                     16:        Superblock s;
                     17:        char *e;
                     18:        char buf[4096];
                     19:        int n;
                     20:        int c;
                     21:        char *dev = "/dev/worm0";
                     22:        extern char *optarg;
                     23:        extern int optind;
                     24: 
                     25:        argout = argv[0];
                     26:        while((c = getopt(argc, argv, "f:")) != -1)
                     27:                switch(c)
                     28:                {
                     29:                case 'f':       dev = optarg; break;
                     30:                case '?':       usage();
                     31:                }
                     32: 
                     33:        if(optind >= argc)
                     34:                usage();
                     35:        dev = mapdev(dev);
                     36:        if((s.fd = open(dev, 2)) < 0){
                     37:                perror(*argv);
                     38:                exit(1);
                     39:        }
                     40:        if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
                     41:                fprint(2, "%s: %s\n", *argv, e);
                     42:                exit(1);
                     43:        }
                     44:        if(strcmp(s.vol_id, argv[optind])){
                     45:                fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind], s.vol_id);
                     46:                exit(1);
                     47:        }
                     48:        if(s.nfree == 0){
                     49:                fprint(2, "%s: can't write any more!\n", dev);
                     50:                exit(1);
                     51:        }
                     52:        if(s.version != VLINK){
                     53:                fprint(2, "%s: can't write on a b-tree disk\n", s.vol_id);
                     54:                exit(1);
                     55:        }
                     56:        for(n = 1; n <= NSIG; n++)
                     57:                signal(n, SIG_IGN);
                     58:        ininit();
                     59:        if(++optind < argc)
                     60:                while(optind < argc)
                     61:                        proc(&s, argv[optind++]);
                     62:        else
                     63:                while(e = Frdline(0))
                     64:                        proc(&s, e);
                     65:        if(bad)
                     66:                exit(1);
                     67:        inwrite(&s);
                     68:        if(bad)
                     69:                exit(1);
                     70:        exit(0);
                     71: }
                     72: 
                     73: usage()
                     74: {
                     75:        fprint(2, "Usage: worm rm [-fdevice] vol_id [files]\n");
                     76:        exit(1);
                     77: }
                     78: 
                     79: proc(s, file)
                     80:        Superblock *s;
                     81:        char *file;
                     82: {
                     83:        Inode i;
                     84: 
                     85:        if(inodeof(file) == 0){
                     86:                fprint(2, "%s: not on worm\n", file);
                     87:                return;
                     88:        }
                     89:        i.magic = DMAGIC;
                     90:        i.block = -1;
                     91:        i.name.n = file;
                     92:        if(inadd(s, &i))
                     93:                bad = 1;
                     94: }
                     95: 
                     96: static Inode *inodes;
                     97: static long ip;
                     98: static long ninodes = 0;
                     99: static char *nameb;
                    100: static long np;
                    101: static long nnameb = 0;
                    102: static long nblocks;
                    103: #define                IINC            1024
                    104: #define                NINC            (64*IINC)
                    105: 
                    106: ininit()
                    107: {
                    108:        if(nnameb == 0){
                    109:                nameb = malloc((unsigned)(nnameb = NINC));
                    110:                if(nameb == 0){
                    111:                        fprint(2, "wrm: malloc fail, %d bytes\n", nnameb);
                    112:                        exit(1);
                    113:                }
                    114:        }
                    115:        np = 0;
                    116:        if(ninodes == 0){
                    117:                inodes = (Inode *)malloc(sizeof(Inode)*(unsigned)(ninodes = IINC));
                    118:                if(inodes == 0){
                    119:                        fprint(2, "wrm: malloc fail, %d inodes %d bytes\n", ninodes, ninodes*sizeof(Inode));
                    120:                        exit(1);
                    121:                }
                    122:        }
                    123:        ip = 0;
                    124: }
                    125: 
                    126: inadd(s, i)
                    127:        Superblock *s;
                    128:        register Inode *i;
                    129: {
                    130:        register long len;
                    131: 
                    132:        len = strlen(i->name.n)+1;
                    133:        if(np+len > nnameb){
                    134:                while(np+len > nnameb)
                    135:                        nnameb += NINC;
                    136:                nameb = realloc(nameb, (unsigned)nnameb);
                    137:                if(nameb == 0){
                    138:                        fprint(2, "wrm: realloc fail, %d bytes\n", nnameb);
                    139:                        exit(1);
                    140:                }
                    141:        }
                    142:        strcpy(nameb+np, i->name.n);
                    143:        i->name.o = np;
                    144:        np += len;
                    145:        if(ip == ninodes){
                    146:                ninodes += IINC;
                    147:                inodes = (Inode *)realloc((char *)inodes, (unsigned)ninodes*sizeof(Inode));
                    148:                if(inodes == 0){
                    149:                        fprint(2, "wrm: realloc fail, %d inodes %d bytes\n", ninodes, ninodes*sizeof(Inode));
                    150:                        exit(1);
                    151:                }
                    152:        }
                    153:        inodes[ip++] = *i;
                    154:        return(0);
                    155: }
                    156: 
                    157: inwrite(s)
                    158:        Superblock *s;
                    159: {
                    160:        char *e;
                    161: 
                    162:        if(e = lkwri(s, inodes, ip, nameb, np, 0L)){
                    163:                fprint(2, "%s\n", e);
                    164:                bad = 1;
                    165:                return;
                    166:        }
                    167: }

unix.superglobalmegacorp.com

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