Annotation of researchv10no/cmd/worm/oscsi/scsi/volid.c, revision 1.1

1.1     ! root        1: #include       <stddef.h>
        !             2: #include       <stdio.h>
        !             3: #include       "../scsi.h"
        !             4: #include       "../juke.h"
        !             5: 
        !             6: static
        !             7: myread(int drive, long block, struct scsi_return *ret, char *err)
        !             8: {
        !             9:        struct scsi_cmd cmd;
        !            10: 
        !            11:        cmd.bus_id = s_id;
        !            12:        set10(cmd, 0x28, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
        !            13:        return(s_io(0, &cmd, 0, ret, 1024, err));
        !            14: }
        !            15: 
        !            16: j_rvolid(int drive, char *err)
        !            17: {
        !            18:        struct scsi_return ret;
        !            19:        long b, lastb;
        !            20:        char buf[1024];
        !            21:        int debug = 0;
        !            22: 
        !            23:        err[0] = 0;
        !            24:        if(s_start(drive, err) < 0)
        !            25:                return(-1);
        !            26:        if(myread(drive, 0L, &ret, err) == 0){
        !            27:                memset(buf, 0, 1024);
        !            28:                if(memcmp(buf, ret.data, 1024)){
        !            29:                        if(debug)
        !            30:                                fprintf(stderr, "superblok at 0\n");
        !            31:                        goto done;      /* found a superblock at 0 */
        !            32:                }
        !            33:        }
        !            34:        for(b = 1, lastb = -1;;){
        !            35: hack:
        !            36:                if(debug)
        !            37:                        fprintf(stderr, "read block %d\n", b);
        !            38:                if(myread(drive, b, &ret, err))
        !            39:                        break;
        !            40:                lastb = b;
        !            41:                b = ((long *)ret.data)[9];
        !            42:        }
        !            43:        if(lastb < 0){
        !            44:                if(b == 1){     /* for disks with a bad block 1 */
        !            45:                        b = 2;
        !            46:                        goto hack;
        !            47:                }
        !            48:                if(debug)
        !            49:                        fprintf(stderr, "tried for superblock at blocks 1,2\n");
        !            50:                sprintf(err, "no superblock");
        !            51:                s_stop(drive, buf);
        !            52:                return(1);
        !            53:        }
        !            54:        if(myread(drive, lastb, &ret, err) < 0){
        !            55:                s_stop(drive, buf);
        !            56:                fprintf(stderr, "read fail on block %d (b=%d)\n", lastb, b);/**/
        !            57:                return(-1);
        !            58:        }
        !            59:        if(debug)
        !            60:                fprintf(stderr, "superblock at %d\n", lastb);
        !            61: done:
        !            62:        strncpy(err, (char *)&ret.data[42], 128);
        !            63:        err[127] = 0;
        !            64:        s_stop(drive, buf);
        !            65:        return(0);
        !            66: }
        !            67: 
        !            68: static
        !            69: mywrite(int drive, long block, struct scsi_cmd *cmd, struct scsi_return *ret, char *err)
        !            70: {
        !            71:        set10((*cmd), 0x2A, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
        !            72:        return(s_io(0, cmd, 1024, ret, 0, err));
        !            73: }
        !            74: 
        !            75: j_wvolid(int drive, char *vol_id, char *err)
        !            76: {
        !            77:        char tmpfile[L_tmpnam];
        !            78:        char buf[512];
        !            79:        struct scsi_return ret;
        !            80:        struct scsi_cmd cmd;
        !            81:        FILE *fp;
        !            82:        int n;
        !            83: 
        !            84:        printf("mkfs %s\n", vol_id);
        !            85:        /* first get the capacity/size for mkfs to make a valid superblock */
        !            86:        tmpnam(tmpfile);
        !            87:        if((fp = fopen(tmpfile, "w+r")) == NULL){
        !            88:                pperror(err, tmpfile);
        !            89:                return(-1);
        !            90:        }
        !            91:        if(s_start(drive, err) < 0)
        !            92:                return(-1);
        !            93:        set10(cmd, 0x25, drive<<5, 0, 0, 0, 0, 0, 0, 0, 0);
        !            94:        if(n = s_io(0, &cmd, 0, &ret, 8, err))
        !            95:                return(n);
        !            96:        switch(longat(&ret.data[0]))
        !            97:        {
        !            98:        case 1637999:           /* sony 12in clv single density */
        !            99:                sprintf(buf, "worm mkfs -n %d -f %s %s", 1600000, tmpfile, vol_id);
        !           100:                break;
        !           101:        case 3275999:           /* sony 12in clv double density */
        !           102:                sprintf(buf, "worm mkfs -n %d -f %s %s", 3250000, tmpfile, vol_id);
        !           103:                break;
        !           104:        default:
        !           105:                fprintf(stderr, "warning: bad capacity %d\n", longat(&ret.data[0]));
        !           106:                sprintf(buf, "worm mkfs -f %s %s", tmpfile, vol_id);
        !           107:                break;
        !           108:        }
        !           109:        if(system(buf)){
        !           110:                sprintf(err, "%s: error", buf);
        !           111:                return(-1);
        !           112:        }
        !           113:        unlink(tmpfile);
        !           114:        fseek(fp, 1024L, 0);
        !           115:        if(fread(cmd.data, 1, 1024, fp) == 0){
        !           116:                pperror(err, "mkfs read");
        !           117:                return(-1);
        !           118:        }
        !           119:        fclose(fp);
        !           120:        if(mywrite(drive, 1L, &cmd, &ret, err))
        !           121:                return(-1);
        !           122:        unlink(tmpfile);
        !           123:        s_stop(drive, err);
        !           124:        return(0);
        !           125: }

unix.superglobalmegacorp.com

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