diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index 16fe68c..fe65daf 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -205,6 +205,8 @@ EXTERN const char *scsi_sense_ascq_str(int ascq); EXTERN const char *scsi_pr_type_str(enum scsi_persistent_out_type pr_type); +EXTERN const char *scsi_opcode_str(int opcode); + enum scsi_xfer_dir { SCSI_XFER_NONE = 0, SCSI_XFER_READ = 1, diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 675f061..1e2a7af 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -264,6 +264,106 @@ scsi_pr_type_str(enum scsi_persistent_out_type pr_type) return value_string_find(pr_type_strings, pr_type); } +const char * +scsi_opcode_str(int opcode) +{ + static struct value_string opcode_strings[] = { + {SCSI_OPCODE_TESTUNITREADY, + "TESTUNITREADY"}, + {SCSI_OPCODE_READ6, + "READ6"}, + {SCSI_OPCODE_INQUIRY, + "INQUIRY"}, + {SCSI_OPCODE_MODESELECT6, + "MODESELECT6"}, + {SCSI_OPCODE_RESERVE6, + "RESERVE6"}, + {SCSI_OPCODE_RELEASE6, + "RELEASE6"}, + {SCSI_OPCODE_MODESENSE6, + "MODESENSE6"}, + {SCSI_OPCODE_STARTSTOPUNIT, + "STARTSTOPUNIT"}, + {SCSI_OPCODE_PREVENTALLOW, + "PREVENTALLOW"}, + {SCSI_OPCODE_READCAPACITY10, + "READCAPACITY10"}, + {SCSI_OPCODE_READ10, + "READ10"}, + {SCSI_OPCODE_WRITE10, + "WRITE10"}, + {SCSI_OPCODE_WRITE_VERIFY10, + "WRITE VERIFY10"}, + {SCSI_OPCODE_VERIFY10, + "VERIFY10"}, + {SCSI_OPCODE_PREFETCH10, + "PREFETCH10"}, + {SCSI_OPCODE_SYNCHRONIZECACHE10, + "SYNCHRONIZECACHE10"}, + {SCSI_OPCODE_READ_DEFECT_DATA10, + "READ DEFECT DATA10"}, + {SCSI_OPCODE_WRITE_SAME10, + "WRITE SAME10"}, + {SCSI_OPCODE_UNMAP, + "UNMAP"}, + {SCSI_OPCODE_READTOC, + "READTOC"}, + {SCSI_OPCODE_SANITIZE, + "SANITIZE"}, + {SCSI_OPCODE_MODESELECT10, + "MODESELECT10"}, + {SCSI_OPCODE_MODESENSE10, + "MODESENSE10"}, + {SCSI_OPCODE_PERSISTENT_RESERVE_IN, + "PERSISTENT RESERVE IN"}, + {SCSI_OPCODE_PERSISTENT_RESERVE_OUT, + "PERSISTENT RESERVE OUT"}, + {SCSI_OPCODE_EXTENDED_COPY, + "EXTENDED COPY"}, + {SCSI_OPCODE_RECEIVE_COPY_RESULTS, + "RECEIVE COPY RESULTS"}, + {SCSI_OPCODE_READ16, + "READ16"}, + {SCSI_OPCODE_COMPARE_AND_WRITE, + "COMPARE AND WRITE"}, + {SCSI_OPCODE_WRITE16, + "WRITE16"}, + {SCSI_OPCODE_ORWRITE, + "ORWRITE"}, + {SCSI_OPCODE_WRITE_VERIFY16, + "WRITE VERIFY16"}, + {SCSI_OPCODE_VERIFY16, + "VERIFY16"}, + {SCSI_OPCODE_PREFETCH16, + "PREFETCH16"}, + {SCSI_OPCODE_SYNCHRONIZECACHE16, + "SYNCHRONIZECACHE16"}, + {SCSI_OPCODE_WRITE_SAME16, + "WRITE SAME16"}, + {SCSI_OPCODE_WRITE_ATOMIC16, + "WRITE ATOMIC16"}, + {SCSI_OPCODE_SERVICE_ACTION_IN, + "SERVICE ACTION IN"}, + {SCSI_OPCODE_REPORTLUNS, + "REPORTLUNS"}, + {SCSI_OPCODE_MAINTENANCE_IN, + "MAINTENANCE IN"}, + {SCSI_OPCODE_READ12, + "READ12"}, + {SCSI_OPCODE_WRITE12, + "WRITE12"}, + {SCSI_OPCODE_WRITE_VERIFY12, + "WRITE VERIFY12"}, + {SCSI_OPCODE_VERIFY12, + "VERIFY12"}, + {SCSI_OPCODE_READ_DEFECT_DATA12, + "READ DEFECT DATA12"}, + {0, NULL} + }; + + return value_string_find(opcode_strings, opcode); +} + uint64_t scsi_get_uint64(const unsigned char *c) {