Annotation of researchv10dc/cmd/worm/oscsi/scsi/md_io.c, revision 1.1

1.1     ! root        1: #include       <stdio.h>
        !             2: #include       "../scsi.h"
        !             3: #include       "../scsish.h"
        !             4: #include       <sys/types.h>
        !             5: #include       <sys/dsreq.h>
        !             6: 
        !             7: #define        DEV(buf, target, lun)   sprintf(buf, "/dev/scsi/sc0d%dl%d", target, lun)
        !             8: 
        !             9: static fd = -1;
        !            10: int s_id;
        !            11: void (*ss_extsense)(uchar *, char *, int);
        !            12: 
        !            13: ss_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
        !            14: {
        !            15:        int retv;
        !            16:        dsreq_t ds;
        !            17:        char dev[512];
        !            18: 
        !            19:        err[0] = 0;
        !            20:        retv = -1;
        !            21:        if(ncmd && nret){
        !            22:                sprintf(err, "both input (%d bytes) and output (%d bytes) expected", ncmd, nret);
        !            23:                return(retv);
        !            24:        }
        !            25:        if(cmd->bus_id & 0x8000){
        !            26:                sprintf(err, "reset not supported");
        !            27:                return(retv);
        !            28:        }
        !            29:        if(fd < 0){
        !            30:                DEV(dev, cmd->bus_id, ((cmd->cmd[1]>>5)&7));
        !            31:                if((fd = open(dev, 2)) < 0){
        !            32:                        pperror(err, dev);
        !            33:                        return(-1);
        !            34:                }
        !            35:        }
        !            36:        ds.ds_flags = DSRQ_SENSE;
        !            37:        ds.ds_time = 30000;
        !            38:        ds.ds_cmdbuf = (char *)cmd->cmd;
        !            39:        ds.ds_cmdlen = 10;
        !            40:        if(ncmd){
        !            41:                ds.ds_databuf = (char *)cmd->data;
        !            42:                ds.ds_datalen = ncmd;
        !            43:                ds.ds_flags |= DSRQ_WRITE;
        !            44:        } else {
        !            45:                ds.ds_databuf = (char *)ret->data;
        !            46:                ds.ds_datalen = nret;
        !            47:                ds.ds_flags |= DSRQ_READ;
        !            48:        }
        !            49:        ds.ds_sensebuf = (char *)ret->sense;
        !            50:        ds.ds_senselen = sizeof ret->sense;
        !            51:        ds.ds_iovbuf = 0;
        !            52:        ds.ds_link = 0;
        !            53:        if(ioctl(fd, DS_ENTER, &ds) < 0){
        !            54:                pperror(err, "DS_ENTER ioctl");
        !            55: err_ret:
        !            56:                close(fd);
        !            57:                fd = -1;
        !            58:                return(retv);
        !            59:        }
        !            60:        if(ds.ds_ret
        !            61:                && (ds.ds_ret != DSRT_SHORT)
        !            62:                && (ds.ds_ret != DSRT_OK)
        !            63:        )       /* an error */
        !            64:                fprintf(stderr, "ds_ret = #%x\n", ds.ds_ret);
        !            65:        ret->type = 3;
        !            66:        ret->scsi_stat = ds.ds_status;
        !            67:        ret->scsi_msg = ds.ds_msg;
        !            68:        ret->reg1 = ret->reg2 = 0;
        !            69:        if(nret >= 0){
        !            70:                if(ds.ds_datasent != nret){
        !            71:                        if(ds.ds_datasent == 0)
        !            72:                                retv = 1;
        !            73:                        else
        !            74:                                sprintf(err, "data transfer error; wanted %d, got %d", nret, ds.ds_datasent);
        !            75:                        goto err_ret;
        !            76:                }
        !            77:        } else {
        !            78:                ret->nread = ds.ds_datasent;
        !            79:        }
        !            80:        if(!preserve){
        !            81:                close(fd);
        !            82:                fd = -1;
        !            83:        }
        !            84:        return(0);
        !            85: }
        !            86: 
        !            87: static char *smsg[16] =
        !            88: {
        !            89:        "good", "check condition", "met/good", "reserved",
        !            90:        "busy", "reserved", "reserved", "reserved",
        !            91:        "intermediate good", "reserved", "intermediate good/met", "reserved",
        !            92:        "reservation conflict", "reserved", "reserved", "reserved",
        !            93: };
        !            94: 
        !            95: s_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
        !            96: {
        !            97:        int n;
        !            98:        int status;
        !            99:        char buf[512];
        !           100:        char ioerr[512];
        !           101: 
        !           102:        cmd->bus_id = s_id;
        !           103:        if(n = ss_io(preserve, cmd, ncmd, ret, nret, err)){
        !           104:                if(n < 0)
        !           105:                        return(n);
        !           106:                strcpy(ioerr, err);
        !           107:                err[0] = 0;
        !           108:        } else
        !           109:                ioerr[0] = 0;
        !           110:        if(status = ret->scsi_stat){
        !           111:                (*ss_extsense)(ret->data, buf, sizeof buf);
        !           112:                sprintf(err, "%s; %s", ioerr[0]? ioerr : smsg[(status>>1)&0xF], buf);
        !           113:                return(1);
        !           114:        }
        !           115:        return(0);
        !           116: }

unix.superglobalmegacorp.com

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