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

1.1     ! root        1: #include       <stdio.h>
        !             2: #include       "../scsi.h"
        !             3: #include       "../scsish.h"
        !             4: #include       <scsi.h>
        !             5: 
        !             6: #define                DEV             "/dev/scsi"
        !             7: 
        !             8: static fd = -1;
        !             9: int s_id;
        !            10: int s_ignua = 1;
        !            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 n;
        !            16:        int retv;
        !            17: 
        !            18:        err[0] = 0;
        !            19:        retv = -1;
        !            20:        if(fd < 0){
        !            21:                if((fd = open(DEV, 2)) < 0){
        !            22:                        pperror(err, DEV);
        !            23:                        return(-1);
        !            24:                }
        !            25:        }
        !            26:        cmd->flags |= (ncmd == 0)? SCSI_RD:SCSI_WR;
        !            27:        if((n = write(fd, cmd, 16+ncmd)) != 16+ncmd){
        !            28:                pperror(err, "scsiio write");
        !            29: err_ret:
        !            30:                close(fd);
        !            31:                fd = -1;
        !            32:                return(retv);
        !            33:        }
        !            34:        if(nret >= 0){
        !            35:                if((n = read(fd, ret, 36+nret)) != 36+nret){
        !            36:                        if(n == 36)
        !            37:                                retv = 1;
        !            38:                        else
        !            39:                                pperror(err, "scsiio read");
        !            40:                        goto err_ret;
        !            41:                }
        !            42:        } else {
        !            43:                if((n = read(fd, ret, 36-nret)) < 0){
        !            44:                        pperror(err, "scsiio read");
        !            45:                        goto err_ret;
        !            46:                }
        !            47:                ret->nread = n-36;
        !            48:        }
        !            49:        if(!preserve){
        !            50:                close(fd);
        !            51:                fd = -1;
        !            52:        }
        !            53:        return(0);
        !            54: }
        !            55: 
        !            56: static char *smsg[16] =
        !            57: {
        !            58:        "good", "check condition", "met/good", "reserved",
        !            59:        "busy", "reserved", "reserved", "reserved",
        !            60:        "intermediate good", "reserved", "intermediate good/met", "reserved",
        !            61:        "reservation conflict", "reserved", "reserved", "reserved",
        !            62: };
        !            63: 
        !            64: s_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
        !            65: {
        !            66:        int n;
        !            67:        int status;
        !            68:        char buf[512];
        !            69:        char ioerr[512];
        !            70:        struct scsi_cmd mycmd;
        !            71:        int ignoredua = 0;
        !            72: 
        !            73:        cmd->bus_id = s_id;
        !            74: again:
        !            75:        if(n = ss_io(preserve, cmd, ncmd, ret, nret, err)){
        !            76:                if(n < 0)
        !            77:                        return(n);
        !            78:                strcpy(ioerr, err);
        !            79:                err[0] = 0;
        !            80:        } else
        !            81:                ioerr[0] = 0;
        !            82:        if(status = ret->scsi_stat){
        !            83:                mycmd.bus_id = s_id;
        !            84:                set6(mycmd, 0x03, cmd->cmd[1]&0xE0, 0, 0, 100, 0);
        !            85:                if(n = ss_io(0, &mycmd, 0, ret, -100, err))
        !            86:                        return(n);
        !            87:                if(s_ignua){    /* ignore unit attention ?? */
        !            88:                        if((ret->data[2]&0xF) == 6){    /* it is */
        !            89:                                if(ignoredua++ == 0){   /* but only ignore once */
        !            90:                                        mycmd.bus_id = s_id;
        !            91:                                        set6(mycmd, 0x12, cmd->cmd[1]&0xE0, 0, 0, 5, 0);
        !            92:                                        if(n = ss_io(0, &mycmd, 0, ret, 5, err))
        !            93:                                                return(n);
        !            94:                                        goto again;
        !            95:                                }
        !            96:                        }
        !            97:                }
        !            98:                if(ss_extsense == 0)
        !            99:                        ss_extsense = gen_extsense;
        !           100:                (*ss_extsense)(ret->data, buf, sizeof buf);
        !           101:                sprintf(err, "%s; %s", ioerr[0]? ioerr : smsg[(status>>1)&0xF], buf);
        !           102:                return(1);
        !           103:        }
        !           104:        return(0);
        !           105: }

unix.superglobalmegacorp.com

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