diff options
Diffstat (limited to 'src/sg_vpd.c')
-rw-r--r-- | src/sg_vpd.c | 150 |
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; } |