Annotation of researchv10no/cmd/worm/wcopy.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: long minfree = 40000;
                      9: int verbose = 0;
                     10: 
                     11: main(argc, argv)
                     12:        char **argv;
                     13: {
                     14:        Superblock in, out;
                     15:        char *e;
                     16:        char buf[4096];
                     17:        int n;
                     18:        long lineno;
                     19:        int c;
                     20:        char *dev = "/dev/worm0";
                     21:        long tfiles, tbytes;
                     22:        int eof;
                     23:        char first[4096];
                     24:        extern char *optarg;
                     25:        extern int optind;
                     26: 
                     27:        argout = argv[0];
                     28:        while((c = getopt(argc, argv, "vm:f:")) != -1)
                     29:                switch(c)
                     30:                {
                     31:                case 'f':       dev = optarg; break;
                     32:                case 'm':       minfree = atol(optarg); break;
                     33:                case 'v':       verbose = 1; break;
                     34:                case '?':       usage();
                     35:                }
                     36: 
                     37:        if(optind+3 != argc)
                     38:                usage();
                     39:        e = mapdev(argv[optind+1]);
                     40:        if((out.fd = open(e, 2)) < 0){
                     41:                perror(e);
                     42:                exit(1);
                     43:        }
                     44:        if(e = openinode(&out, SPIN_DOWN)){
                     45:                fprint(2, "%s: %s\n", *argv, e);
                     46:                exit(1);
                     47:        }
                     48:        if(strcmp(out.vol_id, argv[optind+2])){
                     49:                fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind+2], out.vol_id);
                     50:                exit(1);
                     51:        }
                     52:        if(out.version != VLINK){
                     53:                fprint(2, "%s: can't write on a b-tree disk\n", out.vol_id);
                     54:                exit(1);
                     55:        }
                     56:        dev = mapdev(dev);
                     57:        if((in.fd = open(dev, 2)) < 0){
                     58:                perror(*argv);
                     59:                exit(1);
                     60:        }
                     61:        if(e = openinode(&in, DO_INODE|SPIN_DOWN)){
                     62:                fprint(2, "%s: %s\n", *argv, e);
                     63:                exit(1);
                     64:        }
                     65:        if(strcmp(in.vol_id, argv[optind])){
                     66:                fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind], in.vol_id);
                     67:                exit(1);
                     68:        }
                     69:        for(n = 1; n <= NSIG; n++)
                     70:                signal(n, SIG_IGN);
                     71:        eof = 0;
                     72:        tfiles = tbytes = 0;
                     73:        lineno = 0;
                     74:        while(!eof){
                     75:                /* flush seperater lines */
                     76:                while(e = Frdline(0)){
                     77:                        lineno++;
                     78:                        if(*e)
                     79:                                break;
                     80:                }
                     81:                if(e == 0)
                     82:                        break;
                     83:                ininit();
                     84:                proc(&out, e);
                     85:                strncpy(first, e, sizeof first);
                     86:                if(out.nfree < minfree){
                     87:                        fprint(2, "wcopy: disk %s full before copying group '%s' line %d\n",
                     88:                                out.vol_id, first, lineno);
                     89:                        exit(1);
                     90:                }
                     91:                while(e = Frdline(0)){
                     92:                        lineno++;
                     93:                        if(*e == 0)
                     94:                                break;
                     95:                        proc(&out, e);
                     96:                }
                     97:                if(e == 0)
                     98:                        eof = 1;
                     99:                if(bad)
                    100:                        exit(1);
                    101:                nfiles = nbytes = 0;
                    102:                blkdone = 0;
                    103:                inwrite(&out, &in);
                    104:                if(bad)
                    105:                        exit(1);
                    106:                if(verbose)
                    107:                        fprint(1, "%s group('%s' %d files, %.6fMB) done\n",
                    108:                                timenow(), first, nfiles, nbytes/1e6);
                    109:                tfiles += nfiles;
                    110:                tbytes += nbytes;
                    111:        }
                    112:        if(verbose)
                    113:                fprint(1, "%s total: %d files, %.6fMB\n", timenow(), tfiles, tbytes/1e6);
                    114:        exit(0);
                    115: }
                    116: 
                    117: usage()
                    118: {
                    119:        fprint(2, "Usage: worm copy [-v] [-m minfree] [-f src_dev] src_id dest_dev dest_id < files\n");
                    120:        exit(1);
                    121: }
                    122: 
                    123: proc(s, file)
                    124:        Superblock *s;
                    125:        char *file;
                    126: {
                    127:        struct stat sbuf;
                    128:        unsigned short mode;
                    129:        Inode i;
                    130:        Inode *srci;
                    131: 
                    132:        if((srci = inodeof(file)) == 0){
                    133:                fprint(2, "can't find file '%s'\n", file);
                    134:                return;
                    135:        }
                    136:        memset((char *)&i, 0, sizeof(i));
                    137:        i = *srci;
                    138:        i.block = 0;
                    139:        nbytes += i.nbytes;
                    140:        if(inadd(s, &i))
                    141:                bad = 1;
                    142: }
                    143: 
                    144: writeout(dest, i, blk, src)
                    145:        Superblock *dest, *src;
                    146:        Inode *i;
                    147:        long *blk;
                    148: {
                    149:        char b[BIGBLOCK];
                    150:        Inode *srci;
                    151:        long n, len, blen;
                    152:        char *name;
                    153: 
                    154:        n = (i->nbytes+dest->blocksize-1)/dest->blocksize;
                    155:        *blk += n;
                    156:        blkdone += n;
                    157:        blen = sizeof b/dest->blocksize;
                    158:        len = blen*dest->blocksize;
                    159:        nbytes += i->nbytes;
                    160:        nfiles++;
                    161:        name = i->name.n;
                    162:        srci = inodeof(name);
                    163:        Seek(src, srci->block);
                    164:        for(n = i->nbytes; n > len; n -= len){
                    165:                if(Read(src, b, blen)){
                    166:        out:
                    167:                        fprint(2, "read problem: seek=%d n=%d blen=%d len=%d; ",
                    168:                                srci->block, n, blen, len);
                    169:                        perror(name);
                    170:                        bad = 1;
                    171:                        return;
                    172:                }
                    173:                if(Write(dest, b, blen)){
                    174: fprint(2, "nb=%d, n=%d len=%d blen=%d\n", i->nbytes, n, len, blen);
                    175:                        perror("data write");
                    176:                        exit(1);
                    177:                }
                    178:        }
                    179:        if(n){
                    180:                n += dest->blocksize-1;
                    181:                n /= dest->blocksize;
                    182:                if(Read(src, b, n))
                    183:                        goto out;
                    184:                if(Write(dest, b, n)){
                    185:                        perror("data write");
                    186:                        exit(1);
                    187:                }
                    188:        }
                    189: }

unix.superglobalmegacorp.com

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