Annotation of researchv10no/cmd/worm/owcopy.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       <pwd.h>
                      7: #include       <grp.h>
                      8: 
                      9: char *timenow();
                     10: long minfree = 40000;
                     11: int verbose = 0;
                     12: static char *copy();
                     13: 
                     14: main(argc, argv)
                     15:        char **argv;
                     16: {
                     17:        char *e;
                     18:        char *dev = "/dev/worm0";
                     19:        char *dest = 0;
                     20:        Superblock in, out;
                     21:        long start = 1;
                     22:        long count = 1000000L;
                     23:        int c;
                     24:        extern char *optarg;
                     25:        extern int optind;
                     26:        void pr();
                     27: 
                     28:        while((c = getopt(argc, argv, "vc:m:s:f:")) != -1)
                     29:                switch(c)
                     30:                {
                     31:                case 'c':       count = atol(optarg); break;
                     32:                case 'f':       dev = optarg; break;
                     33:                case 'm':       minfree = atol(optarg); break;
                     34:                case 's':       start = atol(optarg); break;
                     35:                case 'v':       verbose = 1; break;
                     36:                case '?':       usage();
                     37:                }
                     38:        dev = mapdev(dev);
                     39:        if((in.fd = open(dev, 0)) < 0){
                     40:                perror(dev);
                     41:                exit(1);
                     42:        }
                     43:        if(optind+3 != argc)
                     44:                usage();
                     45: 
                     46:        if(e = openinode(&in, SPIN_DOWN)){
                     47:                fprint(2, "worm copy: %s: %s\n", dev, e);
                     48:                exit(1);
                     49:        }
                     50:        if(strcmp(argv[optind], in.vol_id)){
                     51:                fprint(2, "src vol_id mismatch: expected %s, got %s\n",
                     52:                        argv[optind], in.vol_id);
                     53:                exit(1);
                     54:        }
                     55:        dest = mapdev(argv[optind+1]);
                     56:        if((out.fd = open(dest, 2)) < 0){
                     57:                perror(dest);
                     58:                exit(1);
                     59:        }
                     60:        if(e = openinode(&out, SPIN_DOWN)){
                     61:                fprint(2, "worm copy: %s: %s\n", dest, e);
                     62:                exit(1);
                     63:        }
                     64:        if(strcmp(argv[optind+2], out.vol_id)){
                     65:                fprint(2, "destination vol_id mismatch: expected %s, got %s\n",
                     66:                        argv[optind+2], out.vol_id);
                     67:                exit(1);
                     68:        }
                     69:        if(e = copy(&in, start, count, &out)){
                     70:                fprint(2, "worm copy: %s: %s\n", dest, e);
                     71:                exit(1);
                     72:        }
                     73:        exit(0);
                     74: }
                     75: 
                     76: usage()
                     77: {
                     78:        fprint(2, "Usage: worm copy [-v] [-fdevice] [-s startblk] [-c count] [-m minfree] srcvolid destdev destvolid\n");
                     79:        exit(2);
                     80: }
                     81: 
                     82: static char *
                     83: copy(in, blk, count, out)
                     84:        register Superblock *in, *out;
                     85:        long blk, count;
                     86: {
                     87:        register Inode *i;
                     88:        short fd = in->fd;
                     89:        char *b, *err;
                     90:        long nb, ndata;
                     91:        char *nameb;
                     92:        Inode *inodes = 0;
                     93:        Inode *iend;
                     94:        long delta;
                     95:        static char buf[64];
                     96:        extern char *lkwri();
                     97: 
                     98:        in->blocksize = 1024;
                     99:        if((b = malloc(in->blocksize)) == 0){
                    100:                sprint(buf, "couldn't malloc buffer (%d bytes)", in->blocksize);
                    101:                return(buf);
                    102:        }
                    103:        Seek(in, blk);
                    104:        if(Read(in, b, 1)){
                    105:                fprint(2, "worm copy: unexpected read error\n");
                    106:                exit(1);
                    107:        }
                    108:        *in = *((Superblock *)b);
                    109:        in->fd = fd;
                    110:        while(count-- > 0){
                    111:                if(in->magic != SMAGIC){
                    112:                        fprint(2, "bad Superblock at %ld\n", blk);
                    113:                        exit(1);
                    114:                }
                    115:                if(in->ninodes){
                    116:                        if(verbose)
                    117:                                fprint(2, "%s reading chunk %s:%ld (%.1f%%)\n",
                    118:                                        timenow(), in->vol_id, in->myblock,
                    119:                                        in->myblock*100./(float)in->nblocks);
                    120:                        if(out->nfree < minfree){
                    121:                                fprint(2, "worm copy: disk %s has < %d free at input %d\n",
                    122:                                        out->vol_id, minfree, in->myblock);
                    123:                                exit(1);
                    124:                        }
                    125:                        nb = (in->ninodes+(in->blocksize/sizeof(Inode))-1)/(in->blocksize/sizeof(Inode));
                    126:                        inodes = (Inode *)malloc((unsigned)(in->blocksize*nb));
                    127:                        if(inodes == 0){
                    128:                                sprint(buf, "inode malloc(%d) fail, sbrk=%d\n",
                    129:                                        (in->blocksize*nb), sbrk(0));
                    130:                                return(buf);
                    131:                        }
                    132:                        Seek(in, in->binodes);
                    133:                        if(Read(in, (char *)inodes, nb))
                    134:                                goto skip;
                    135:                        delta = out->nextffree - inodes->block;
                    136: print("%d inodes; delta=%d\n", in->ninodes, delta);
                    137:                        for(i = inodes, iend = inodes+in->ninodes; i < iend; i++)
                    138:                                if(i->block > 0)
                    139:                                        i->block += delta;
                    140:                        nb = (in->ninochars+in->blocksize-1)/in->blocksize;
                    141:                        nameb = malloc((unsigned)(in->blocksize*nb));
                    142:                        if(nameb == 0){
                    143:                                sprint(buf, "name buffer malloc(%d) fail, sbrk=%d\n",
                    144:                                        (in->blocksize*nb), sbrk(0));
                    145:                                return(buf);
                    146:                        }
                    147:                        if(Read(in, nameb, nb))
                    148:                                goto skip;
                    149:                        ndata = in->binodes - in->myblock - 1;
                    150:                        if(err = lkwri(out, inodes, in->ninodes, nameb, in->ninochars, ndata)){
                    151:                                fprint(2, "wcopy: lkwri: %s at input %d\n", err, in->myblock);
                    152:                                exit(1);
                    153:                        }
                    154:                        dcopy(in, out, ndata);
                    155:                }
                    156:        skip:
                    157:                blk = in->nextsb;
                    158:                Seek(in, blk);
                    159:                if(Read(in, b, 1L))
                    160:                        break;
                    161:                *in = *((Superblock *)b);
                    162:                in->fd = fd;
                    163:                if(in->myblock == 0)
                    164:                        in->myblock = blk;
                    165:        }
                    166:        free(b);
                    167:        if(verbose)
                    168:                fprint(2, "%s copy done, %s is %.1f%% full\n", timenow(), out->vol_id,
                    169:                        out->myblock*100.0/(float)out->nblocks);
                    170:        return((char *)0);
                    171: }
                    172: 
                    173: dcopy(in, out, n)
                    174:        Superblock *in, *out;
                    175:        long n;
                    176: {
                    177:        char buf[BIGBLOCK];
                    178:        long bs;
                    179: 
                    180:        bs = BIGBLOCK/in->blocksize;
                    181:        Seek(in, in->myblock+1);
                    182:        Seek(out, out->myblock+1);
                    183:        while(n > 0){
                    184:                if(bs > n) bs = n;
                    185:                if(Read(in, buf, bs)){
                    186:                        fprint(2, "wcopy: warning: data read error at %d\n", in->myblock);
                    187:                }
                    188:                if(Write(out, buf, bs)){
                    189:                        fprint(2, "wcopy: dcopy write error\n");
                    190:                        exit(1);
                    191:                }
                    192:                n -= bs;
                    193:        }
                    194: }
                    195: 
                    196: char *
                    197: timenow()
                    198: {
                    199:        long tim;
                    200:        char *tims;
                    201: 
                    202:        time(&tim);
                    203:        tims = ctime(&tim);
                    204:        tims[19] = 0;
                    205:        return(tims);
                    206: }

unix.superglobalmegacorp.com

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