aboutsummaryrefslogtreecommitdiff
path: root/src/sg_vpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sg_vpd.c')
-rw-r--r--src/sg_vpd.c150
1 files changed, 87 insertions, 63 deletions
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index dfa596a9..4a5cd502 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -30,7 +30,7 @@
*/
-static const char * version_str = "0.68 20130715"; /* spc4r36 + sbc3r35 */
+static const char * version_str = "0.69 20130730"; /* spc4r36 + sbc3r35 */
/* And with sbc3r35, vale Mark Evans */
extern void svpd_enumerate_vendor(void);
@@ -650,20 +650,20 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
if (1 != c_set) {
fprintf(stderr, " << unexpected code set %d for "
"NAA>>\n", c_set);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
naa = (ip[0] >> 4) & 0xff;
if ((naa < 2) || (naa > 6) || (4 == naa)) {
fprintf(stderr, " << unexpected NAA [0x%x]>>\n", naa);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
if (2 == naa) { /* NAA IEEE extended */
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 2 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("0x");
@@ -675,7 +675,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 3 or 5 "
"identifier length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
if ((0 == is_sas) || (1 != assoc)) {
@@ -702,7 +702,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
if (16 != i_len) {
fprintf(stderr, " << unexpected NAA 6 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("0x");
@@ -733,7 +733,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
case 8: /* SCSI name string */
if (3 != c_set) {
fprintf(stderr, " << expected UTF-8 code_set>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
/* does %s print out UTF-8 ok??
@@ -792,8 +792,10 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
}
if (k)
printf(" vendor specific: %.*s\n", i_len, ip);
- else
- dStrHex((const char *)ip, i_len, 0);
+ else {
+ fprintf(stderr, " vendor specific:\n");
+ dStrHexErr((const char *)ip, i_len, 0);
+ }
break;
case 1: /* T10 vendor identification */
printf(" vendor id: %.8s\n", ip);
@@ -813,7 +815,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if ((8 != i_len) && (12 != i_len) && (16 != i_len)) {
fprintf(stderr, " << expect 8, 12 and 16 byte "
"EUI, got %d>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf(" 0x");
@@ -825,7 +827,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
printf(" EUI-64 based %d byte identifier\n", i_len);
if (1 != c_set) {
fprintf(stderr, " << expected binary code_set (1)>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
ci_off = 0;
@@ -841,7 +843,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
} else if ((8 != i_len) && (12 != i_len)) {
fprintf(stderr, " << can only decode 8, 12 and 16 "
"byte ids>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
c_id = ((ip[ci_off] << 16) | (ip[ci_off + 1] << 8) |
@@ -865,20 +867,20 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if (1 != c_set) {
fprintf(stderr, " << unexpected code set %d for "
"NAA>>\n", c_set);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
naa = (ip[0] >> 4) & 0xff;
if (! ((2 == naa) || (5 == naa) || (6 == naa))) {
fprintf(stderr, " << unexpected NAA [0x%x]>>\n", naa);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
if (2 == naa) {
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 2 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = (((ip[0] & 0xf) << 8) | ip[1]);
@@ -902,7 +904,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 5 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) |
@@ -930,7 +932,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if (16 != i_len) {
fprintf(stderr, " << unexpected NAA 6 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) |
@@ -968,7 +970,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -978,7 +980,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -988,7 +990,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if ((1 != c_set) || (0 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, logical "
"unit association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -996,9 +998,9 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 7: /* MD5 logical unit identifier */
if ((1 != c_set) || (0 != assoc)) {
- printf(" << expected binary code_set, logical "
+ fprintf(stderr, " << expected binary code_set, logical "
"unit association>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf(" MD5 logical unit identifier:\n");
@@ -1007,7 +1009,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
case 8: /* SCSI name string */
if (3 != c_set) {
fprintf(stderr, " << expected UTF-8 code_set>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf(" SCSI name string:\n");
@@ -1033,13 +1035,14 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
printf(" [or device number: 0x%x, function number: "
"0x%x]\n", (0x1f & (ip[1] >> 3)), 0x7 & ip[1]);
} else
- printf(" >>>> unexpected protocol indentifier: %s\n"
+ fprintf(stderr, " >>>> unexpected protocol indentifier: %s\n"
" with Protocol specific port "
"identifier\n",
sg_get_trans_proto_str(p_id, sizeof(b), b));
break;
default: /* reserved */
- dStrHex((const char *)ip, i_len, 0);
+ fprintf(stderr, " reserved designator=0x%x\n", desig_type);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
}
@@ -1163,8 +1166,9 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len)
else if (1 == format_code)
printf("world wide unique port id: %.*s\n", num, &ucp[4]);
else {
- printf(" [Unexpected format code: %d]\n", format_code);
- dStrHex((const char *)ucp, num + 4, 0);
+ fprintf(stderr, " [Unexpected format code: %d]\n",
+ format_code);
+ dStrHexErr((const char *)ucp, num + 4, 0);
}
bump = (((num + 4) < 24) ? 24 : num + 4);
break;
@@ -1205,20 +1209,21 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len)
if (0 == format_code)
printf("Routing ID: 0x%x\n", num);
else {
- printf(" [Unexpected format code: %d]\n", format_code);
- dStrHex((const char *)ucp, 24, 0);
+ fprintf(stderr, " [Unexpected format code: %d]\n",
+ format_code);
+ dStrHexErr((const char *)ucp, 24, 0);
}
bump = 24;
break;
case TPROTO_NONE:
fprintf(stderr, "%s No specified protocol\n", leadin);
- /* dStrHex((const char *)ucp, ((len > 24) ? 24 : len), 0); */
+ /* dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), 0); */
bump = 24;
break;
default:
fprintf(stderr, "%s unknown protocol id=0x%x "
"format_code=%d\n", leadin, proto_id, format_code);
- dStrHex((const char *)ucp, ((len > 24) ? 24 : len), 0);
+ dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), 0);
bump = 24;
break;
}
@@ -1535,7 +1540,7 @@ decode_proto_lu_vpd(unsigned char * buff, int len, int do_hex)
break;
default:
fprintf(stderr, "Unexpected proto=%d\n", proto);
- dStrHex((const char *)ucp, bump, 1);
+ dStrHexErr((const char *)ucp, bump, 1);
break;
}
}
@@ -1590,7 +1595,7 @@ decode_proto_port_vpd(unsigned char * buff, int len, int do_hex)
break;
default:
fprintf(stderr, "Unexpected proto=%d\n", proto);
- dStrHex((const char *)ucp, bump, 1);
+ dStrHexErr((const char *)ucp, bump, 1);
break;
}
}
@@ -1669,19 +1674,31 @@ decode_b0_vpd(unsigned char * buff, int len, int do_hex, int pdt)
break;
case 0x11:
default:
- printf(" Unable to decode pdt=0x%x, in hex:\n", pdt);
- dStrHex((const char *)buff, len, 0);
+ fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ dStrHexErr((const char *)buff, len, 0);
break;
}
}
+static const char * product_type_arr[] =
+{
+ "Not specified",
+ "CFast",
+ "CompactFlash",
+ "MemoryStick",
+ "MultiMediaCard",
+ "Secure Digital Card (SD)",
+ "XQD",
+ "Universal Flash Storage Card (UFS)",
+};
+
/* VPD_BLOCK_DEV_CHARS sbc */
/* VPD_MAN_ASS_SN ssc */
/* VPD_SECURITY_TOKEN osd */
static void
decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
{
- unsigned int u;
+ unsigned int u, k;
if (do_hex) {
dStrHex((const char *)buff, len, 0);
@@ -1703,7 +1720,14 @@ decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
printf(" Reserved [0x%x]\n", u);
else
printf(" Nominal rotation rate: %d rpm\n", u);
- printf(" Product type=%d\n", buff[6]);
+ u = buff[6];
+ k = sizeof(product_type_arr) / sizeof(product_type_arr[0]);
+ if (u < k)
+ printf(" Product type: %s\n", product_type_arr[u]);
+ else if (u < 0xf0)
+ printf(" Product type: Reserved [0x%x]\n", u);
+ else
+ printf(" Product type: Vendor specific [0x%x]\n", u);
printf(" WABEREQ=%d\n", (buff[7] >> 6) & 0x3);
printf(" WACEREQ=%d\n", (buff[7] >> 4) & 0x3);
u = buff[7] & 0xf;
@@ -1739,8 +1763,8 @@ decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
len - 4, buff + 4);
break;
default:
- printf(" Unable to decode pdt=0x%x, in hex:\n", pdt);
- dStrHex((const char *)buff, len, 0);
+ fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ dStrHexErr((const char *)buff, len, 0);
break;
}
}
@@ -1852,8 +1876,8 @@ decode_b2_vpd(unsigned char * buff, int len, int do_hex, int pdt)
decode_tapealert_supported_vpd(buff, len);
break;
default:
- printf(" Unable to decode pdt=0x%x, in hex:\n", pdt);
- dStrHex((const char *)buff, len, 0);
+ fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ dStrHexErr((const char *)buff, len, 0);
break;
}
}
@@ -1891,8 +1915,8 @@ decode_b3_vpd(unsigned char * b, int len, int do_hex, int pdt)
printf(" Automation device serial number: %s\n", obuff);
break;
default:
- printf(" Unable to decode pdt=0x%x, in hex:\n", pdt);
- dStrHex((const char *)b, len, 0);
+ fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ dStrHexErr((const char *)b, len, 0);
break;
}
}
@@ -1929,7 +1953,7 @@ svpd_unable_to_decode(int sg_fd, int num_vpd, int subvalue, int maxlen,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2015,7 +2039,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2075,7 +2099,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2126,7 +2150,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2172,7 +2196,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2216,7 +2240,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2255,7 +2279,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2308,7 +2332,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2352,7 +2376,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2397,7 +2421,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2444,7 +2468,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2488,7 +2512,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2532,7 +2556,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2575,7 +2599,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2619,7 +2643,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2679,7 +2703,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2744,7 +2768,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2801,7 +2825,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2859,7 +2883,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
@@ -2904,7 +2928,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
"INQUIRY response\n");
if (verbose) {
fprintf(stderr, "First 32 bytes of bad response\n");
- dStrHex((const char *)rsp_buff, 32, 0);
+ dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}