Do media checks on getting next block encryption status (#74)

* Do media check before getting NBES and allow getting status without media
* Supress error from BLANK CHECK sense when querying next block encryption status
This commit is contained in:
James Wilson
2022-05-18 13:27:11 -07:00
committed by GitHub
parent 8caaf85fbb
commit a7a7c4750c
3 changed files with 53 additions and 15 deletions

View File

@@ -83,7 +83,7 @@ static void scsi_execute(const std::string& device, const std::uint8_t *cmd_p,
std::size_t dxfer_len, scsi_direction direction)
{
#if defined(OS_LINUX)
unique_fd fd {open(device.c_str(), O_RDONLY)};
unique_fd fd {open(device.c_str(), O_RDONLY | O_NDELAY)};
if (!fd) {
std::ostringstream oss;
oss << "Cannot open device " << device;
@@ -146,6 +146,19 @@ static void scsi_execute(const std::string& device, const std::uint8_t *cmd_p,
namespace scsi {
bool is_device_ready(const std::string& device)
{
const std::uint8_t test_unit_ready_cmd[6] {};
try {
scsi_execute(device, test_unit_ready_cmd, sizeof(test_unit_ready_cmd),
nullptr, 0u, scsi_direction::from_device);
return true;
} catch (const scsi::scsi_error& err) {
return false;
}
}
void get_des(const std::string& device, std::uint8_t *buffer, std::size_t length)
{
const std::uint8_t spin_des_command[] {
@@ -266,31 +279,31 @@ void write_sde(const std::string& device, const std::uint8_t *sde_buffer)
void print_sense_data(std::ostream& os, const sense_data& sd) {
os << std::left << std::setw(25) << "Sense Code: ";
auto sense_key {static_cast<unsigned int>(sd.flags & sense_data::flags_sense_key_mask)};
auto sense_key {sd.flags & sense_data::flags_sense_key_mask};
switch (sense_key) {
case 0u:
case sense_data::no_sense:
os << "No specific error";
break;
case 2u:
case sense_data::not_ready:
os << "Device not ready";
break;
case 3u:
case sense_data::medium_error:
os << "Medium Error";
break;
case 4u:
case sense_data::hardware_error:
os << "Hardware Error";
break;
case 5u:
case sense_data::illegal_request:
os << "Illegal Request";
break;
case 6u:
case sense_data::unit_attention:
os << "Unit Attention";
break;
case 7u:
case sense_data::data_protect:
os << "Data protect";
break;
case 8u:
case sense_data::blank_check:
os << "Blank tape";
break;
}