Annotation of researchv10no/cmd/worm/scsi/sony/copy.c, revision 1.1

1.1     ! root        1: #include       <stdio.h>
        !             2: #include       "../scsi.h"
        !             3: #include       "../scsish.h"
        !             4: #include       "../tcl.h"
        !             5: #include       "fns.h"
        !             6: 
        !             7: #define        PROGRESS        \
        !             8:                if(sbase/TALK != goo){\
        !             9:                        goo = sbase/TALK;\
        !            10:                        time(&t2);\
        !            11:                        printf("\tdoing block %ld at %s", goo*TALK, ctime(&t2));\
        !            12:                }
        !            13: 
        !            14: static char good[256]; /* by default, all BAD */
        !            15: typedef enum { BAD = 0, GOOD } Searchtype;
        !            16: static int copy1(int, int, int, int, int, int, int, char *);
        !            17: static int search(int, int, int, int, Searchtype, char *);
        !            18: 
        !            19: int
        !            20: sony_copy(ClientData cd, Tcl_Interp *it, int argc, char **argv)
        !            21: {
        !            22:        int n;
        !            23:        int sdr, sbase, nblocks, ddr, dbase;
        !            24:        int starget = s_id;
        !            25:        int dtarget = s_id;
        !            26:        int wr, unwr;
        !            27:        long nb = nblocks;
        !            28:        long t1, t2;
        !            29:        long goo;
        !            30:        int lower;
        !            31:        struct scsi_return ret;
        !            32: #define                TALK            10000
        !            33:        extern char *ctime();
        !            34: 
        !            35:        if(argc != 6)
        !            36:                USAGE_RETURN
        !            37:        sdr = atoi(argv[1]);
        !            38:        sbase = atoi(argv[2]);
        !            39:        nblocks = atoi(argv[3]);
        !            40:        ddr = atoi(argv[4]);
        !            41:        dbase = atoi(argv[5]);
        !            42:        printf("copying drive (%d,%d)[%d-%d] to drive (%d,%d)[%d-%d]\n",
        !            43:                starget, sdr, sbase, sbase+nblocks-1,
        !            44:                dtarget, ddr, dbase, dbase+nblocks-1);
        !            45:        if(sony_istatus(&ret, cd->err))
        !            46:                ERR_RETURN
        !            47:        if((ret.data[100]&0x80) && (sdr == (ret.data[100]&7)))
        !            48:                lower = 0;
        !            49:        else if((ret.data[101]&0x80) && (sdr == (ret.data[101]&7)))
        !            50:                lower = 1;
        !            51:        else {
        !            52:                sprintf(cd->err, "drive %d not occupied\n", sdr);
        !            53:                ERR_RETURN
        !            54:        }
        !            55:        good[0] = good[0x81] = good[0x82] = good[0x83] = GOOD;
        !            56:        time(&t1);
        !            57:        goo = -1;
        !            58:        while(nblocks > 0){
        !            59:                /* search for a block to copy */
        !            60:                while(n = min(256, nblocks)){
        !            61:                        wr = search(sdr, lower, sbase, n, GOOD, cd->err);
        !            62:                        if(wr < 0)
        !            63:                                break;
        !            64:                        sbase += wr;
        !            65:                        dbase += wr;
        !            66:                        nblocks -= wr;
        !            67:                        if(wr < n)
        !            68:                                break;
        !            69:                        PROGRESS
        !            70:                }
        !            71:                /* now copy until the first bad block */
        !            72:                while(n = min(256, nblocks)){
        !            73:                        unwr = search(sdr, lower, sbase, n, BAD, cd->err);
        !            74:                        if(unwr < 0)
        !            75:                                break;
        !            76:                        /*printf("writing %d-%d\n", sbase, sbase+unwr-1);/**/
        !            77:                        if(copy1(starget, sdr, sbase, unwr, dtarget, ddr, dbase, cd->err))
        !            78:                                break;
        !            79:                        sbase += unwr;
        !            80:                        dbase += unwr;
        !            81:                        nblocks -= unwr;
        !            82:                        PROGRESS
        !            83:                }
        !            84:        }
        !            85:        time(&t2);
        !            86:        t2 -= t1;
        !            87:        if(t2 == 0) t2 = 1;
        !            88:        printf("%ds: ", t2);
        !            89:        if(nblocks){
        !            90:                printf("copy buggered up: sbase=%d nblks=%d dbase=%d\n",
        !            91:                        sbase, nblocks, dbase);
        !            92:                it->result = cd->err;
        !            93:                return(TCL_ERROR);
        !            94:        }
        !            95:        printf("%d blocks at %.1fKB/s\n", nb, nb/(float)t2);
        !            96:        return(TCL_OK);
        !            97: }
        !            98: 
        !            99: static int
        !           100: copy1(int st, int sd, int sb, int n, int dt, int dd, int db, char *err)
        !           101: {
        !           102:        struct scsi_cmd cmd;
        !           103:        struct scsi_return ret;
        !           104: 
        !           105:        set6(cmd, 0x18, sd<<5, 0, 0, 20, 0);
        !           106:        cmd.data[0] = 0x10;     /* copy */
        !           107:        cmd.data[1] = 0;
        !           108:        cmd.data[2] = 0;
        !           109:        cmd.data[3] = 0;
        !           110:        cmd.data[4] = (st<<5)|sd;
        !           111:        cmd.data[5] = (dt<<5)|dd;
        !           112:        cmd.data[6] = 0;
        !           113:        cmd.data[7] = 0;
        !           114:        cmd.data[8] = n>>24;
        !           115:        cmd.data[9] = n>>16;
        !           116:        cmd.data[10] = n>>8;
        !           117:        cmd.data[11] = n;
        !           118:        cmd.data[12] = sb>>24;
        !           119:        cmd.data[13] = sb>>16;
        !           120:        cmd.data[14] = sb>>8;
        !           121:        cmd.data[15] = sb;
        !           122:        cmd.data[16] = db>>24;
        !           123:        cmd.data[17] = db>>16;
        !           124:        cmd.data[18] = db>>8;
        !           125:        cmd.data[19] = db;
        !           126:        return(s_io(0, &cmd, 20, &ret, 0, err));
        !           127: }
        !           128: 
        !           129: static int
        !           130: search(int dr, int lower, int sbase, int n, Searchtype s, char *err)
        !           131: {
        !           132:        uchar *cp;
        !           133:        struct scsi_return ret;
        !           134: 
        !           135:        if(n <= 0)
        !           136:                return(0);
        !           137:        if(n > 256)
        !           138:                n = 256;
        !           139:        if(sony_media1(dr, sbase, lower, &ret, err))
        !           140:                return(-1);
        !           141:        for(cp = ret.data; n-- > 0; cp++)
        !           142:                if(good[*cp] != s)
        !           143:                        break;
        !           144:        return(cp-ret.data);
        !           145: }

unix.superglobalmegacorp.com

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