From 572d431816271830cc321c2c7b596236e5708ea0 Mon Sep 17 00:00:00 2001 From: Douglas Gilbert Date: Wed, 27 Jan 2016 15:13:35 +0000 Subject: sg_logs: LPS misalignment lpage; sg_format: add ffmt option; sg_lib: big sense reporting rework git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@657 6180dd3e-e324-4e3e-922d-17de1ae2f315 --- src/sg_xcopy.c | 227 ++------------------------------------------------------- 1 file changed, 7 insertions(+), 220 deletions(-) (limited to 'src/sg_xcopy.c') diff --git a/src/sg_xcopy.c b/src/sg_xcopy.c index 9ac5d69f..57369bc8 100644 --- a/src/sg_xcopy.c +++ b/src/sg_xcopy.c @@ -30,7 +30,7 @@ #define _XOPEN_SOURCE 600 #ifndef _GNU_SOURCE -#define _GNU_SOURCE /* resolves u_char typedef in scsi/scsi.h [lk 2.4] */ +#define _GNU_SOURCE 1 #endif #include @@ -63,7 +63,7 @@ #include "sg_unaligned.h" #include "sg_pr2serr.h" -static const char * version_str = "0.51 20160104"; +static const char * version_str = "0.53 20160126"; #define ME "sg_xcopy: " @@ -989,224 +989,11 @@ scsi_operating_parameter(struct xcopy_fp_t *xfp, int is_target) static void decode_designation_descriptor(const unsigned char * ucp, int i_len) { - int m, p_id, piv, c_set, assoc, desig_type, d_id, naa; - int k; - const unsigned char * ip; - uint64_t vsei; - char b[64]; - - ip = ucp + 4; - p_id = ((ucp[0] >> 4) & 0xf); - c_set = (ucp[0] & 0xf); - piv = ((ucp[1] & 0x80) ? 1 : 0); - assoc = ((ucp[1] >> 4) & 0x3); - desig_type = (ucp[1] & 0xf); - pr2serr(" designator type: %d, code set: %d\n", desig_type, c_set); - if (piv && ((1 == assoc) || (2 == assoc))) - pr2serr(" transport: %s\n", - sg_get_trans_proto_str(p_id, sizeof(b), b)); - - switch (desig_type) { - case 0: /* vendor specific */ - k = 0; - if ((1 == c_set) || (2 == c_set)) { /* ASCII or UTF-8 */ - for (k = 0; (k < i_len) && isprint(ip[k]); ++k) - ; - if (k >= i_len) - k = 1; - } - if (k) - pr2serr(" vendor specific: %.*s\n", i_len, ip); - else { - pr2serr(" vendor specific:\n"); - dStrHexErr((const char *)ip, i_len, 0); - } - break; - case 1: /* T10 vendor identification */ - pr2serr(" vendor id: %.8s\n", ip); - if (i_len > 8) - pr2serr(" vendor specific: %.*s\n", i_len - 8, ip + 8); - break; - case 2: /* EUI-64 based */ - if ((8 != i_len) && (12 != i_len) && (16 != i_len)) { - pr2serr(" << expect 8, 12 and 16 byte EUI, got %d>>\n", - i_len); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - pr2serr(" 0x"); - for (m = 0; m < i_len; ++m) - pr2serr("%02x", (unsigned int)ip[m]); - pr2serr("\n"); - break; - case 3: /* NAA */ - if (1 != c_set) { - pr2serr(" << unexpected code set %d for NAA>>\n", c_set); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - naa = (ip[0] >> 4) & 0xff; - if (! ((2 == naa) || (5 == naa) || (6 == naa))) { - pr2serr(" << unexpected NAA [0x%x]>>\n", naa); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - if ((5 == naa) && (0x10 == i_len)) { - if (verbose > 2) - pr2serr(" << unexpected NAA 5 len 16, assuming NAA 6 " - ">>\n"); - naa = 6; - } - if (2 == naa) { - if (8 != i_len) { - pr2serr(" << unexpected NAA 2 identifier length: " - "0x%x>>\n", i_len); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - d_id = (((ip[0] & 0xf) << 8) | ip[1]); - /* c_id = ((ip[2] << 16) | (ip[3] << 8) | ip[4]); */ - /* vsi = ((ip[5] << 16) | (ip[6] << 8) | ip[7]); */ - pr2serr(" 0x"); - for (m = 0; m < 8; ++m) - pr2serr("%02x", (unsigned int)ip[m]); - pr2serr("\n"); - } else if (5 == naa) { - if (8 != i_len) { - pr2serr(" << unexpected NAA 5 identifier length: " - "0x%x>>\n", i_len); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - /* c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) | */ - /* (ip[2] << 4) | ((ip[3] & 0xf0) >> 4)); */ - vsei = ip[3] & 0xf; - for (m = 1; m < 5; ++m) { - vsei <<= 8; - vsei |= ip[3 + m]; - } - pr2serr(" 0x"); - for (m = 0; m < 8; ++m) - pr2serr("%02x", (unsigned int)ip[m]); - pr2serr("\n"); - } else if (6 == naa) { - if (16 != i_len) { - pr2serr(" << unexpected NAA 6 identifier length: " - "0x%x>>\n", i_len); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - /* c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) | */ - /* (ip[2] << 4) | ((ip[3] & 0xf0) >> 4)); */ - vsei = ip[3] & 0xf; - for (m = 1; m < 5; ++m) { - vsei <<= 8; - vsei |= ip[3 + m]; - } - pr2serr(" 0x"); - for (m = 0; m < 16; ++m) - pr2serr("%02x", (unsigned int)ip[m]); - pr2serr("\n"); - } - break; - case 4: /* Relative target port */ - if ((1 != c_set) || (1 != assoc) || (4 != i_len)) { - pr2serr(" << expected binary code_set, target port " - "association, length 4>>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - d_id = sg_get_unaligned_be16(ip + 2); - pr2serr(" Relative target port: 0x%x\n", d_id); - break; - case 5: /* (primary) Target port group */ - if ((1 != c_set) || (1 != assoc) || (4 != i_len)) { - pr2serr(" << expected binary code_set, target port " - "association, length 4>>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - d_id = sg_get_unaligned_be16(ip + 2); - pr2serr(" Target port group: 0x%x\n", d_id); - break; - case 6: /* Logical unit group */ - if ((1 != c_set) || (0 != assoc) || (4 != i_len)) { - pr2serr(" << expected binary code_set, logical unit " - "association, length 4>>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - d_id = sg_get_unaligned_be16(ip + 2); - pr2serr(" Logical unit group: 0x%x\n", d_id); - break; - case 7: /* MD5 logical unit identifier */ - if ((1 != c_set) || (0 != assoc)) { - pr2serr(" << expected binary code_set, logical unit " - "association>>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - pr2serr(" MD5 logical unit identifier:\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - case 8: /* SCSI name string */ - if (3 != c_set) { - pr2serr(" << expected UTF-8 code_set>>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - pr2serr(" SCSI name string:\n"); - /* does %s print out UTF-8 ok?? - * Seems to depend on the locale. Looks ok here with my - * locale setting: en_AU.UTF-8 - */ - pr2serr(" %s\n", (const char *)ip); - break; - case 9: /* Protocol specific port identifier */ - /* added in spc4r36, PIV must be set, proto_id indicates */ - /* whether UAS (USB) or SOP (PCIe) or ... */ - if (! piv) - pr2serr(" >>>> Protocol specific port identifier " - "expects protocol\n" - " identifier to be valid and it is not\n"); - if (TPROTO_UAS == p_id) { - pr2serr(" USB device address: 0x%x\n", 0x7f & ip[0]); - pr2serr(" USB interface number: 0x%x\n", ip[2]); - } else if (TPROTO_SOP == p_id) { - pr2serr(" PCIe routing ID, bus number: 0x%x\n", ip[0]); - pr2serr(" function number: 0x%x\n", ip[1]); - pr2serr(" [or device number: 0x%x, function number: " - "0x%x]\n", (0x1f & (ip[1] >> 3)), 0x7 & ip[1]); - } else - pr2serr(" >>>> unexpected protocol indentifier: 0x%x\n" - " with Protocol specific port " - "identifier\n", p_id); - break; - case 0xa: /* UUID identifier */ - if (1 != c_set) { - pr2serr(" << expected binary code_set >>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - if ((1 != ((ip[0] >> 4) & 0xf)) || (18 != i_len)) { - pr2serr(" << expected locally assigned UUID, 16 bytes long " - ">>\n"); - dStrHexErr((const char *)ip, i_len, 0); - break; - } - printf(" Locally assigned UUID: "); - for (m = 0; m < 16; ++m) { - if ((4 == m) || (6 == m) || (8 == m) || (10 == m)) - printf("-"); - printf("%02x", (unsigned int)ip[2 + m]); - } - printf("\n"); - break; - default: /* reserved */ - pr2serr(" reserved designator=0x%x\n", desig_type); - dStrHexErr((const char *)ip, i_len, 0); - break; - } + char c[2048]; + + sg_get_designation_descriptor_str(NULL, ucp, i_len, 1, verbose, + sizeof(c), c); + pr2serr("%s", c); } static int -- cgit v1.2.3