static int dirdevopen(ScsiReq *rp) { uint64_t blocks; uint8_t data[8+4+20]; /* 16-byte result: lba, blksize, reserved */ memset(data, 0, sizeof data); if(SRstart(rp, 1) == -1 || SRrcapacity(rp, data) == -1) return -1; rp->lbsize = GETBELONG(data+4); blocks = GETBELONG(data); if(debug) fprint(2, "disk: dirdevopen: 10-byte logical block size %lud, " "# blocks %llud\n", rp->lbsize, blocks); if(blocks == 0xffffffff){ if(SRrcapacity16(rp, data) == -1) return -1; rp->lbsize = GETBELONG(data + 8); blocks = (int64_t)GETBELONG(data)<<32 | GETBELONG(data + 4); if(debug) fprint(2, "disk: dirdevopen: 16-byte logical block size" " %lud, # blocks %llud\n", rp->lbsize, blocks); } /* some newer dev's don't support 6-byte commands */ if(blocks > Max24off && !force6bytecmds) rp->flags |= Frw10; return 0; }
static long cmdcapacity(ScsiReq *rp, int argc, char *argv[]) { uchar d[8]; long n; USED(argc, argv); if((n = SRrcapacity(rp, d)) == -1) return -1; Bprint(&bout, " %ud %ud\n", d[0]<<24|d[1]<<16|d[2]<<8|d[3], d[4]<<24|d[5]<<16|d[6]<<8|d[7]); return n; }