|
|
1.1 ! root 1: #include "scsi.h" ! 2: #include "worm.h" ! 3: ! 4: s_copy(sdr, sbase, nblocks, ddr, dbase) ! 5: { ! 6: struct scsi_o o; ! 7: int bn, c; ! 8: char buf[256]; ! 9: int lower; ! 10: int wr, unwr; ! 11: int n; ! 12: long nb = nblocks; ! 13: long t1, t2; ! 14: long goo; ! 15: #define TALK 10000 ! 16: extern char *ctime(); ! 17: ! 18: fprint(1, "copying drive %d[%d-%d] to drive %d[%d-%d]\n", sdr, ! 19: sbase, sbase+nblocks-1, ddr, dbase, dbase+nblocks-1); ! 20: time(&t1); ! 21: goo = sbase/TALK; ! 22: while(nblocks > 0){ ! 23: if(sbase/TALK != goo){ ! 24: goo = sbase/TALK; ! 25: time(&t2); ! 26: print("doing block %ld at %s", goo*TALK, ctime(&t2)); ! 27: } ! 28: n = min(256, nblocks); ! 29: wr = s_wsearch(sdr, sbase, n); ! 30: if(wr < 0) ! 31: break; ! 32: if(wr == n){ ! 33: sbase += n; ! 34: dbase += n; ! 35: nblocks -= n; ! 36: continue; ! 37: } ! 38: sbase += wr; ! 39: dbase += wr; ! 40: n -= wr; /* number of blocks */ ! 41: nblocks -= wr; ! 42: unwr = s_bsearch(sdr, sbase, n); ! 43: if(unwr < 0) ! 44: break; ! 45: /*print("writing %d-%d\n", sbase, sbase+unwr-1);/**/ ! 46: if(s_copy1(sdr, sbase, unwr, ddr, dbase)) ! 47: break; ! 48: sbase += unwr; ! 49: dbase += unwr; ! 50: nblocks -= unwr; ! 51: } ! 52: time(&t2); ! 53: t2 -= t1; ! 54: if(t2 == 0) t2 = 1; ! 55: fprint(1, "%ds: ", t2); ! 56: if(nblocks){ ! 57: fprint(1, "copy buggered up: sbase=%d nblks=%d dbase=%d\n", ! 58: sbase, nblocks, dbase); ! 59: return(1); ! 60: } ! 61: fprint(1, "%d blocks at %.1fKB/s\n", nb, nb/(float)t2); ! 62: return(0); ! 63: } ! 64: ! 65: s_copy1(sd, sb, n, dd, db) ! 66: { ! 67: struct scsi_i input; ! 68: struct scsi_o o; ! 69: ! 70: input.bus_id = 1<<scsi_id; ! 71: input.cmd[0] = 0x18; ! 72: input.cmd[1] = sd<<5; ! 73: input.cmd[2] = 0; ! 74: input.cmd[3] = 0; ! 75: input.cmd[4] = 20; ! 76: input.cmd[5] = 0; ! 77: input.data[0] = 0x10; /* copy */ ! 78: input.data[1] = 0; ! 79: input.data[2] = 0; ! 80: input.data[3] = 0; ! 81: input.data[4] = (scsi_id<<5)|sd; ! 82: input.data[5] = (scsi_id<<5)|dd; ! 83: input.data[6] = 0; ! 84: input.data[7] = 0; ! 85: input.data[8] = n>>24; ! 86: input.data[9] = n>>16; ! 87: input.data[10] = n>>8; ! 88: input.data[11] = n; ! 89: input.data[12] = sb>>24; ! 90: input.data[13] = sb>>16; ! 91: input.data[14] = sb>>8; ! 92: input.data[15] = sb; ! 93: input.data[16] = db>>24; ! 94: input.data[17] = db>>16; ! 95: input.data[18] = db>>8; ! 96: input.data[19] = db; ! 97: if(scsiio(&input, &o, 20, "media") < 0) ! 98: return(1); ! 99: if(CHECK(o)){ ! 100: scsidump(&o); ! 101: s_sense(sd, -1); ! 102: return(1); ! 103: } ! 104: return(0); ! 105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.