|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.