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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user