int SRopen(ScsiReq *rp, char *unit) { if(SRopenraw(rp, unit) == -1) return -1; SRready(rp); if(SRinquiry(rp) >= 0){ switch(rp->inquiry[0]){ default: fprint(2, "unknown device type 0x%.2x\n", rp->inquiry[0]); rp->status = Status_SW; break; case Devdir: case Devcd: case Devmo: if(dirdevopen(rp) == -1) break; return 0; case Devseq: rp->flags |= Fseqdev; if(seqdevopen(rp) == -1) break; return 0; case Devprint: rp->flags |= Fprintdev; return 0; case Devworm: rp->flags |= Fwormdev; if(wormdevopen(rp) == -1) break; return 0; case Devjuke: rp->flags |= Fchanger; return 0; } } SRclose(rp); return -1; }
static long cmdmodeselect10(ScsiReq *rp, int argc, char *argv[]) { uchar list[MaxDirData]; long nbytes, ul; char *p; memset(list, 0, sizeof list); for(nbytes = 0; argc; argc--, argv++, nbytes++){ if((ul = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){ rp->status = Status_BADARG; return -1; } list[nbytes] = ul; } if(!(rp->flags & Finqok) && SRinquiry(rp) == -1) Bprint(&bout, "warning: couldn't determine whether SCSI-1/SCSI-2 mode"); return SRmodeselect10(rp, list, nbytes); }
static long cmdinquiry(ScsiReq *rp, int argc, char *argv[]) { long status; int i, n; uchar *p; USED(argc, argv); if((status = SRinquiry(rp)) != -1){ n = rp->inquiry[4]+4; for(i = 0; i < MIN(8, n); i++) Bprint(&bout, " %2.2uX", rp->inquiry[i]); p = &rp->inquiry[8]; n = MIN(n, sizeof(rp->inquiry)-8); while(n && (*p == ' ' || *p == '\t' || *p == '\n')){ n--; p++; } Bprint(&bout, "\t%.*s\n", n, (char*)p); } return status; }