static long cmdreqsense(ScsiReq *rp, int argc, char *argv[]) { long nbytes; USED(argc, argv); if((nbytes = SRreqsense(rp)) != -1) makesense(rp); return nbytes; }
static long cmdprobe(ScsiReq *rp, int argc, char *argv[]) { char buf[32]; ScsiReq scsireq; char *ctlr, *unit; USED(argc, argv); rp->status = STok; scsireq.flags = 0; for(ctlr="CDEFGHIJ0123456789abcdef"; *ctlr; ctlr++) { /* * I can guess how many units you have. * SATA controllers can have more than two drives each. */ if(*ctlr >= 'C' && *ctlr <= 'D') unit = "01"; else if((*ctlr >= '0' && *ctlr <= '9') || (*ctlr >= 'a' && *ctlr <= 'f')) unit = "0123456789abcdef"; /* allow wide scsi */ else unit = "01234567"; for(; *unit; unit++){ sprint(buf, "/dev/sd%c%c", *ctlr, *unit); if(SRopenraw(&scsireq, buf) == -1) continue; SRreqsense(&scsireq); switch(scsireq.status){ case STok: case Status_SD: Bprint(&bout, "%s: ", buf); cmdinquiry(&scsireq, 0, 0); break; } SRclose(&scsireq); } } return 0; }
int32_t SRrequest(ScsiReq *rp) { int32_t n; int status; retry: if(debug) SRdumpReq(rp); if(rp->flags&Fusb) n = umsrequest(rp->umsc, &rp->cmd, &rp->data, &status); else n = request(rp->fd, &rp->cmd, &rp->data, &status); rp->status = status; if(status == STok) rp->data.count = n; if(debug) SRdumpRep(rp); switch(status){ case STok: break; case STcheck: if(rp->cmd.p[0] != ScmdRsense && SRreqsense(rp) != -1) rp->status = Status_SD; if(debug || exabyte) SRdumpErr(rp); werrstr("%s", scsierr(rp)); return -1; case STbusy: sleep(1000); /* TODO: try a shorter sleep? */ goto retry; default: if(debug || exabyte) SRdumpErr(rp); werrstr("%s", scsierr(rp)); return -1; } return n; }