From 44f6bb019c90542ed1ec1effd03fca94cec269c1 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 9 Apr 2021 09:44:51 +0200 Subject: [PATCH] sgutils2: implement scsi_request_sense() --- src/tools/sgutils2.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/tools/sgutils2.rs b/src/tools/sgutils2.rs index af6ab6de..3570aca7 100644 --- a/src/tools/sgutils2.rs +++ b/src/tools/sgutils2.rs @@ -753,3 +753,40 @@ pub fn scsi_mode_sense( Ok((head, block_descriptor, page)) }).map_err(|err: Error| format_err!("decode mode sense failed - {}", err)) } + +/// Resuqest Sense +pub fn scsi_request_sense( + file: &mut F, +) -> Result { + + // request 252 bytes, as mentioned in the Seagate SCSI reference + let allocation_len: u8 = 252; + + let mut sg_raw = SgRaw::new(file, allocation_len as usize)?; + sg_raw.set_timeout(30); // use short timeout + let mut cmd = Vec::new(); + cmd.extend(&[0x03, 0, 0, 0, allocation_len, 0]); // REQUEST SENSE FIXED FORMAT + + let data = sg_raw.do_command(&cmd) + .map_err(|err| format_err!("request sense failed - {}", err))?; + + let sense = proxmox::try_block!({ + let data_len = data.len(); + + if data_len < std::mem::size_of::() { + bail!("got short data len ({})", data_len); + } + let code = data[0] & 0x7f; + if code != 0x70 { + bail!("received unexpected sense code '0x{:02x}'", code); + } + + let mut reader = &data[..]; + + let sense: RequestSenseFixed = unsafe { reader.read_be_value()? }; + + Ok(sense) + }).map_err(|err: Error| format_err!("decode request sense failed - {}", err))?; + + Ok(sense) +}