aboutsummaryrefslogtreecommitdiff
path: root/src/sg_xcopy.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2016-01-27 15:13:35 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2016-01-27 15:13:35 +0000
commit572d431816271830cc321c2c7b596236e5708ea0 (patch)
treefc4216b9e9af787d73423029acfd9632f214db4a /src/sg_xcopy.c
parent92f622b977ac1f47099c4092b816e11f531f47c2 (diff)
downloadsg3_utils-572d431816271830cc321c2c7b596236e5708ea0.tar.gz
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
Diffstat (limited to 'src/sg_xcopy.c')
-rw-r--r--src/sg_xcopy.c227
1 files changed, 7 insertions, 220 deletions
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 <unistd.h>
@@ -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