Annotation of researchv10dc/cmd/worm/oscsi/generic/copy.c, revision 1.1.1.1

1.1       root        1: #include       <stdio.h>
                      2: #include       "../scsi.h"
                      3: #include       "../scsish.h"
                      4: #include       "fns.h"
                      5: 
                      6: #define        PROGRESS        \
                      7:                if(sbase/TALK != goo){\
                      8:                        goo = sbase/TALK;\
                      9:                        time(&t2);\
                     10:                        printf("\tdoing block %ld at %s", goo*TALK, ctime(&t2));\
                     11:                }
                     12: 
                     13: static int copy1(int, int, int, int, int, int, int, char *);
                     14: 
                     15: int
                     16: gen_copy(int niargs, int *iargs, int ncargs, char **cargs, char *err)
                     17: {
                     18:        int n;
                     19:        int sdr = 0;
                     20:        int sbase = iargs[1];
                     21:        int nblocks = iargs[2];
                     22:        int ddr = 0;
                     23:        int dbase = iargs[4];
                     24:        int starget = iargs[0];
                     25:        int dtarget = iargs[3];
                     26:        int block = 256;
                     27:        long nb = nblocks;
                     28:        long t1, t2;
                     29:        long goo;
                     30: 
                     31: #define                TALK            10000
                     32:        extern char *ctime();
                     33: 
                     34: #pragma ref ncargs
                     35: #pragma ref cargs
                     36: 
                     37:        if(niargs == 6)
                     38:                block = iargs[5];
                     39:        printf("copying drive (%d,%d)[%d-%d] to drive (%d,%d)[%d-%d] blk=%dK\n",
                     40:                starget, sdr, sbase, sbase+nblocks-1,
                     41:                dtarget, ddr, dbase, dbase+nblocks-1, block);
                     42:        time(&t1);
                     43:        goo = -1;
                     44:        while(nblocks > 0){
                     45:                n = min(block, nblocks);
                     46:                printf("writing %d-%d\n", sbase, sbase+n-1);/**/
                     47:                if(copy1(starget, sdr, sbase, n, dtarget, ddr, dbase, err))
                     48:                        break;
                     49:                sbase += n;
                     50:                dbase += n;
                     51:                nblocks -= n;
                     52:                PROGRESS
                     53:        }
                     54:        time(&t2);
                     55:        t2 -= t1;
                     56:        if(t2 == 0) t2 = 1;
                     57:        printf("%ds: ", t2);
                     58:        if(nblocks){
                     59:                printf("copy buggered up: sbase=%d nblks=%d dbase=%d\n",
                     60:                        sbase, nblocks, dbase);
                     61:                return(1);
                     62:        }
                     63:        printf("%d blocks at %.1fKB/s\n", nb, nb/(float)t2);
                     64:        return(0);
                     65: }
                     66: 
                     67: static int
                     68: copy1(int st, int sd, int sb, int n, int dt, int dd, int db, char *err)
                     69: {
                     70:        struct scsi_cmd cmd;
                     71:        struct scsi_return ret;
                     72: 
                     73:        set6(cmd, 0x18, sd<<5, 0, 0, 20, 0);
                     74:        cmd.data[0] = 0x10;     /* copy */
                     75:        cmd.data[1] = 0;
                     76:        cmd.data[2] = 0;
                     77:        cmd.data[3] = 0;
                     78:        cmd.data[4] = (st<<5)|sd;
                     79:        cmd.data[5] = (dt<<5)|dd;
                     80:        cmd.data[6] = 0;
                     81:        cmd.data[7] = 0;
                     82:        cmd.data[8] = n>>24;
                     83:        cmd.data[9] = n>>16;
                     84:        cmd.data[10] = n>>8;
                     85:        cmd.data[11] = n;
                     86:        cmd.data[12] = sb>>24;
                     87:        cmd.data[13] = sb>>16;
                     88:        cmd.data[14] = sb>>8;
                     89:        cmd.data[15] = sb;
                     90:        cmd.data[16] = db>>24;
                     91:        cmd.data[17] = db>>16;
                     92:        cmd.data[18] = db>>8;
                     93:        cmd.data[19] = db;
                     94:        return(s_io(0, &cmd, 20, &ret, 0, err));
                     95: }

unix.superglobalmegacorp.com

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