diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2013-07-30 23:58:53 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2013-07-30 23:58:53 +0000 |
commit | 88732e65ad3158fb372c2077ea47ba3016f5cb17 (patch) | |
tree | 24fe93526ed6846754d9cb39350573d65d95dc6a /src | |
parent | 736d019894943c1ba75b6f9051a7e40ee8f061c8 (diff) | |
download | sg3_utils-88732e65ad3158fb372c2077ea47ba3016f5cb17.tar.gz |
sg_lib: add dStrHexErr() and dStrHexStr(); sg_xcopy work (and in sg_cmds_extra.c)
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@503 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src')
-rw-r--r-- | src/sg_compare_and_write.c | 2 | ||||
-rw-r--r-- | src/sg_copy_results.c | 40 | ||||
-rw-r--r-- | src/sg_format.c | 7 | ||||
-rw-r--r-- | src/sg_get_config.c | 8 | ||||
-rw-r--r-- | src/sg_inq.c | 92 | ||||
-rw-r--r-- | src/sg_logs.c | 39 | ||||
-rw-r--r-- | src/sg_luns.c | 6 | ||||
-rw-r--r-- | src/sg_persist.c | 4 | ||||
-rw-r--r-- | src/sg_raw.c | 2 | ||||
-rw-r--r-- | src/sg_requests.c | 6 | ||||
-rw-r--r-- | src/sg_rtpg.c | 2 | ||||
-rw-r--r-- | src/sg_sanitize.c | 4 | ||||
-rw-r--r-- | src/sg_ses.c | 8 | ||||
-rw-r--r-- | src/sg_stpg.c | 10 | ||||
-rw-r--r-- | src/sg_vpd.c | 150 | ||||
-rw-r--r-- | src/sg_write_buffer.c | 6 | ||||
-rw-r--r-- | src/sg_write_same.c | 9 | ||||
-rw-r--r-- | src/sg_xcopy.c | 109 |
18 files changed, 285 insertions, 219 deletions
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c index 627031c9..f97ca4bf 100644 --- a/src/sg_compare_and_write.c +++ b/src/sg_compare_and_write.c @@ -343,7 +343,7 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks, } if ((verbose > 2) && (xfer_len > 0)) { fprintf(stderr, " Data-out buffer contents:\n"); - dStrHex((const char *)buff, xfer_len, 1); + dStrHexErr((const char *)buff, xfer_len, 1); } res = do_scsi_pt(ptvp, sg_fd, DEF_TIMEOUT_SECS, verbose); ret = sg_cmds_process_resp(ptvp, "COMPARE AND WRITE", res, 0, diff --git a/src/sg_copy_results.c b/src/sg_copy_results.c index 20c32815..1bb4f25a 100644 --- a/src/sg_copy_results.c +++ b/src/sg_copy_results.c @@ -34,7 +34,7 @@ and the optional list identifier passed as the list_id argument. */ -static const char * version_str = "1.2 20130627"; +static const char * version_str = "1.4 20130730"; #define MAX_XFER_LEN 10000 @@ -286,6 +286,14 @@ usage() ); } +static const char * rec_copy_name_arr[] = { + "Receive copy status(LID1)", + "Receive copy data(LID1)", + "Receive copy [0x2]", + "Receive copy operating parameters", + "Receive copy failure details(LID1)", +}; + int main(int argc, char * argv[]) { @@ -296,6 +304,7 @@ main(int argc, char * argv[]) int list_id = 0; int do_hex = 0; int verbose = 0; + const char * cp; const char * device_name = NULL; char file_name[256]; int ret = 1; @@ -394,46 +403,41 @@ main(int argc, char * argv[]) return SG_LIB_FILE_ERROR; } + cp = (const char *)&rec_copy_name_arr[sa]; if (verbose) - fprintf(stderr, ME "issue receive copy results to device %s\n" - "\t\txfer_len= %d (0x%x), sa=%d, list_id=%d\n", - device_name, xfer_len, xfer_len, sa, list_id); + fprintf(stderr, ME "issue %s to device %s\n\t\txfer_len= %d (0x%x), " + "list_id=%d\n", cp, device_name, xfer_len, xfer_len, + list_id); /* In SPC-4 opcode 0x84, service actions have command names: * 0x0 RECEIVE COPY STATUS(LID1) * 0x1 RECEIVE COPY DATA(LID1) * 0x3 RECEIVE COPY OPERATING PARAMETERS * 0x4 RECEIVE COPY FAILURE DETAILS(LID1) - */ + */ res = sg_ll_receive_copy_results(sg_fd, sa, list_id, cpResultBuff, - xfer_len, 0, verbose); + xfer_len, 1, verbose); ret = res; switch (res) { case 0: break; case SG_LIB_CAT_NOT_READY: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS failed, " - "device not ready\n"); + fprintf(stderr, " SCSI %s failed, device not ready\n", cp); break; case SG_LIB_CAT_UNIT_ATTENTION: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS failed, " - "unit attention\n"); + fprintf(stderr, " SCSI %s failed, unit attention\n", cp); break; case SG_LIB_CAT_ABORTED_COMMAND: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS failed, " - "aborted command\n"); + fprintf(stderr, " SCSI %s failed, aborted command\n", cp); break; case SG_LIB_CAT_INVALID_OP: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS command not " - "supported\n"); + fprintf(stderr, " SCSI %s command not supported\n", cp); break; case SG_LIB_CAT_ILLEGAL_REQ: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS failed, " - "bad field in cdb\n"); + fprintf(stderr, " SCSI %s failed, bad field in cdb\n", cp); break; default: - fprintf(stderr, " SCSI RECEIVE COPY RESULTS command error %d\n", - res); + fprintf(stderr, " SCSI %s command error %d\n", cp, res); break; } if (res != 0) diff --git a/src/sg_format.c b/src/sg_format.c index 77f6f81a..0ef19b1e 100644 --- a/src/sg_format.c +++ b/src/sg_format.c @@ -47,7 +47,7 @@ #include "sg_cmds_basic.h" #include "sg_cmds_extra.h" -static const char * version_str = "1.23 20130530"; +static const char * version_str = "1.23 20130730"; #define RW_ERROR_RECOVERY_PAGE 1 /* every disk should have one */ #define FORMAT_DEV_PAGE 3 /* Format Device Mode Page [now obsolete] */ @@ -276,7 +276,8 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed, resp_len = reqSense[7] + 8; if (verb) { fprintf(stderr, "Parameter data in hex:\n"); - dStrHex((const char *)reqSense, resp_len, 1); + dStrHexErr((const char *)reqSense, resp_len, + 1); } progress = -1; sg_get_sense_progress_fld(reqSense, resp_len, @@ -318,7 +319,7 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed, resp_len = requestSenseBuff[7] + 8; if (verbose > 1) { fprintf(stderr, "Parameter data in hex\n"); - dStrHex((const char *)requestSenseBuff, resp_len, 1); + dStrHexErr((const char *)requestSenseBuff, resp_len, 1); } progress = -1; sg_get_sense_progress_fld(requestSenseBuff, resp_len, diff --git a/src/sg_get_config.c b/src/sg_get_config.c index 801c095c..0d0ebbd4 100644 --- a/src/sg_get_config.c +++ b/src/sg_get_config.c @@ -873,10 +873,10 @@ decode_feature(int feature, unsigned char * ucp, int len) } break; default: - printf(" Unknown feature [0x%x], version=%d persist=%d, " - "current=%d\n", feature, ((ucp[2] >> 2) & 0xf), - !!(ucp[2] & 0x2), !!(ucp[2] & 0x1)); - dStrHex((const char *)ucp, len, 1); + fprintf(stderr, " Unknown feature [0x%x], version=%d persist=%d, " + "current=%d\n", feature, ((ucp[2] >> 2) & 0xf), + !!(ucp[2] & 0x2), !!(ucp[2] & 0x1)); + dStrHexErr((const char *)ucp, len, 1); break; } } diff --git a/src/sg_inq.c b/src/sg_inq.c index 69fdb6f8..62d480e8 100644 --- a/src/sg_inq.c +++ b/src/sg_inq.c @@ -1201,8 +1201,10 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) } if (k) printf(" vendor specific: %.*s\n", i_len, ip); - else + else { + printf(" vendor specific:\n"); dStrHex((const char *)ip, i_len, -1); + } break; case 1: /* T10 vendor identification */ printf(" vendor id: %.8s\n", ip); @@ -1221,7 +1223,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } ci_off = 0; @@ -1237,7 +1239,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) } 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } c_id = ((ip[ci_off] << 16) | (ip[ci_off + 1] << 8) | @@ -1264,20 +1266,20 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) case 3: /* NAA */ if (1 != c_set) { fprintf(stderr, " << expected binary code_set (1)>>\n"); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); 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, -1); + dStrHexErr((const char *)ip, i_len, -1); 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } d_id = (((ip[0] & 0xf) << 8) | ip[1]); @@ -1295,7 +1297,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) if (8 != i_len) { fprintf(stderr, " << unexpected NAA 3 identifier " "length: 0x%x>>\n", i_len); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } printf(" NAA 3, Locally assigned:\n"); @@ -1307,7 +1309,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) if (8 != i_len) { fprintf(stderr, " << unexpected NAA 5 identifier " "length: 0x%x>>\n", i_len); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) | @@ -1328,7 +1330,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) 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) | @@ -1359,7 +1361,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } d_id = ((ip[2] << 8) | ip[3]); @@ -1369,7 +1371,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } d_id = ((ip[2] << 8) | ip[3]); @@ -1379,7 +1381,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) 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, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } d_id = ((ip[2] << 8) | ip[3]); @@ -1389,7 +1391,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) if ((1 != c_set) || (0 != assoc)) { fprintf(stderr, " << expected binary code_set, logical " "unit association>>\n"); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } printf(" MD5 logical unit identifier:\n"); @@ -1398,7 +1400,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) case 8: /* SCSI name string */ if (3 != c_set) { fprintf(stderr, " << expected UTF-8 code_set>>\n"); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } printf(" SCSI name string:\n"); @@ -1430,7 +1432,8 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) sg_get_trans_proto_str(p_id, sizeof(b), b)); break; default: /* reserved */ - dStrHex((const char *)ip, i_len, -1); + fprintf(stderr, " reserved designator=0x%x\n", desig_type); + dStrHexErr((const char *)ip, i_len, -1); break; } } @@ -1442,7 +1445,7 @@ static void export_dev_ids(unsigned char * buff, int len) { int u, j, m, id_len, c_set, assoc, desig_type, i_len; - int off, d_id, naa, k; + int off, d_id, naa, k, p_id; unsigned char * ucp; unsigned char * ip; const char * assoc_str; @@ -1455,6 +1458,7 @@ export_dev_ids(unsigned char * buff, int len) ip = buff; c_set = 1; assoc = 0; + p_id = 0xf; desig_type = 3; j = 1; off = 16; @@ -1474,6 +1478,7 @@ export_dev_ids(unsigned char * buff, int len) return; } ip = ucp + 4; + p_id = ((ucp[0] >> 4) & 0xf); /* protocol identifier */ c_set = (ucp[0] & 0xf); assoc = ((ucp[1] >> 4) & 0x3); desig_type = (ucp[1] & 0xf); @@ -1517,7 +1522,7 @@ export_dev_ids(unsigned char * buff, int len) case 2: /* EUI-64 based */ 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; } printf("SCSI_IDENT_%s_EUI64=", assoc_str); @@ -1528,20 +1533,20 @@ export_dev_ids(unsigned char * buff, int len) case 3: /* NAA */ 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; } 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 (6 != 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; } printf("SCSI_IDENT_%s_NAA=", assoc_str); @@ -1552,7 +1557,7 @@ export_dev_ids(unsigned char * buff, int 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; } printf("SCSI_IDENT_%s_NAA=", assoc_str); @@ -1565,7 +1570,7 @@ export_dev_ids(unsigned char * buff, int 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]); @@ -1575,7 +1580,7 @@ export_dev_ids(unsigned char * buff, int 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]); @@ -1585,7 +1590,7 @@ export_dev_ids(unsigned char * buff, int 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]); @@ -1595,7 +1600,7 @@ export_dev_ids(unsigned char * buff, int len) if ((1 != c_set) || (0 != assoc)) { 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("SCSI_IDENT_%s_MD5=", assoc_str); @@ -1604,16 +1609,41 @@ export_dev_ids(unsigned char * buff, int len) case 8: /* SCSI name string */ if (3 != c_set) { fprintf(stderr, " << expected UTF-8 code_set>>\n"); - dStrHex((const char *)ip, i_len, -1); + dStrHexErr((const char *)ip, i_len, -1); break; } printf("SCSI_IDENT_%s_NAME=%.*s\n", assoc_str, i_len, (const char *)ip); break; - case 9: /* PCIe Routing ID */ - /* new in spc4r34, looks under-specified, drop through now */ + case 9: /* Protocol specific port identifier */ + if (TPROTO_UAS == p_id) { + if ((4 != i_len) || (1 != assoc)) { + fprintf(stderr, " << UAS (USB) expected target " + "port association>>\n"); + dStrHexErr((const char *)ip, i_len, 0); + break; + } + printf("SCSI_IDENT_%s_UAS_DEVICE_ADDRESS=0x%x\n", assoc_str, + ip[0] & 0x7f); + printf("SCSI_IDENT_%s_UAS_INTERFACE_NUMBER=0x%x\n", assoc_str, + ip[2]); + } else if (TPROTO_SOP == p_id) { + if ((4 != i_len) && (8 != i_len)) { /* spc4r36h confused */ + fprintf(stderr, " << SOP (PCIe) descriptor " + "length=%d >>\n", i_len); + dStrHexErr((const char *)ip, i_len, 0); + break; + } + printf("SCSI_IDENT_%s_SOP_ROUTING_ID=0x%x\n", assoc_str, + ((ip[0] << 8) | ip[1])); + } else { + fprintf(stderr, " << Protocol specific port identifier " + "protocol_id=0x%x>>\n", p_id); + } + break; default: /* reserved */ - dStrHex((const char *)ip, i_len, -1); + fprintf(stderr, " reserved designator=0x%x\n", desig_type); + dStrHexErr((const char *)ip, i_len, -1); break; } } @@ -1737,13 +1767,13 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len) 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; } diff --git a/src/sg_logs.c b/src/sg_logs.c index fa95c279..47fac5b2 100644 --- a/src/sg_logs.c +++ b/src/sg_logs.c @@ -25,7 +25,7 @@ #include "sg_lib.h" #include "sg_cmds_basic.h" -static const char * version_str = "1.13 20130701"; /* spc4r35 + sbc3r30 */ +static const char * version_str = "1.14 20130730"; /* spc4r35 + sbc3r30 */ #define MX_ALLOC_LEN (0xfffc) #define SHORT_RESP_LEN 128 @@ -629,7 +629,7 @@ do_logs(int sg_fd, unsigned char * resp, int mx_resp_len, actual_len = (resp[2] << 8) + resp[3] + 4; if ((0 == optsp->do_raw) && (vb > 1)) { fprintf(stderr, " Log sense (find length) response:\n"); - dStrHex((const char *)resp, LOG_SENSE_PROBE_ALLOC_LEN, 1); + dStrHexErr((const char *)resp, LOG_SENSE_PROBE_ALLOC_LEN, 1); fprintf(stderr, " hence calculated response length=%d\n", actual_len); } @@ -667,7 +667,7 @@ do_logs(int sg_fd, unsigned char * resp, int mx_resp_len, } if ((0 == optsp->do_raw) && (vb > 1)) { fprintf(stderr, " Log sense response:\n"); - dStrHex((const char *)resp, actual_len, 1); + dStrHexErr((const char *)resp, actual_len, 1); } return 0; } @@ -1191,7 +1191,8 @@ show_tape_usage_log_page(unsigned char * resp, int len, int show_pcb) printf(" Total fatal suspended reads: %u", n); break; default: - printf(" unknown parameter code = 0x%x, contents in hex:\n", pc); + printf(" unknown parameter code = 0x%x, contents in " + "hex:\n", pc); dStrHex((const char *)ucp, extra, 1); break; } @@ -1240,7 +1241,8 @@ show_tape_capacity_log_page(unsigned char * resp, int len, int show_pcb) printf(" Alternate partition maximum capacity (in MiB): %u", n); break; default: - printf(" unknown parameter code = 0x%x, contents in hex:\n", pc); + printf(" unknown parameter code = 0x%x, contents in " + "hex:\n", pc); dStrHex((const char *)ucp, extra, 1); break; } @@ -1325,7 +1327,8 @@ show_data_compression_log_page(unsigned char * resp, int len, int show_pcb) printf(" Data compression enabled: 0x%" PRIx64, n); break; default: - printf(" unknown parameter code = 0x%x, contents in hex:\n", pc); + printf(" unknown parameter code = 0x%x, contents in " + "hex:\n", pc); dStrHex((const char *)ucp, extra, 1); break; } @@ -1526,7 +1529,8 @@ show_temperature_page(unsigned char * resp, int len, int show_pcb, int hdr, } } else if (show_unknown) { - printf(" unknown parameter code = 0x%x, contents in hex:\n", pc); + printf(" unknown parameter code = 0x%x, contents in " + "hex:\n", pc); dStrHex((const char *)ucp, extra, 1); } else continue; @@ -1568,9 +1572,9 @@ show_start_stop_page(unsigned char * resp, int len, int show_pcb, int verbose) printf(" Date of manufacture, year: %.4s, week: %.2s", &ucp[4], &ucp[8]); else if (verbose) { - printf(" Date of manufacture parameter length " - "strange: %d\n", extra - 4); - dStrHex((const char *)ucp, extra, 1); + fprintf(stderr, " Date of manufacture parameter length " + "strange: %d\n", extra - 4); + dStrHexErr((const char *)ucp, extra, 1); } break; case 2: @@ -1578,9 +1582,9 @@ show_start_stop_page(unsigned char * resp, int len, int show_pcb, int verbose) printf(" Accounting date, year: %.4s, week: %.2s", &ucp[4], &ucp[8]); else if (verbose) { - printf(" Accounting date parameter length strange: %d\n", - extra - 4); - dStrHex((const char *)ucp, extra, 1); + fprintf(stderr, " Accounting date parameter length " + "strange: %d\n", extra - 4); + dStrHexErr((const char *)ucp, extra, 1); } break; case 3: @@ -1624,7 +1628,8 @@ show_start_stop_page(unsigned char * resp, int len, int show_pcb, int verbose) } break; default: - printf(" unknown parameter code = 0x%x, contents in hex:\n", pc); + printf(" unknown parameter code = 0x%x, contents in " + "hex:\n", pc); dStrHex((const char *)ucp, extra, 1); break; } @@ -2263,7 +2268,7 @@ show_stats_perform_page(unsigned char * resp, int len, fprintf(stderr, "show_performance... unknown parameter " "code %d\n", param_code); if (optsp->do_verbose) - dStrHex((const char *)ucp, extra, 1); + dStrHexErr((const char *)ucp, extra, 1); break; } if ((optsp->do_pcb) && (0 == optsp->do_name)) { @@ -2386,7 +2391,7 @@ show_stats_perform_page(unsigned char * resp, int len, fprintf(stderr, "show_performance... unknown parameter " "code %d\n", param_code); if (optsp->do_verbose) - dStrHex((const char *)ucp, extra, 1); + dStrHexErr((const char *)ucp, extra, 1); break; } if ((optsp->do_pcb) && (0 == optsp->do_name)) { @@ -2521,7 +2526,7 @@ show_cache_stats_page(unsigned char * resp, int len, fprintf(stderr, "show_performance... unknown parameter " "code %d\n", pc); if (optsp->do_verbose) - dStrHex((const char *)ucp, extra, 1); + dStrHexErr((const char *)ucp, extra, 1); break; } if ((optsp->do_pcb) && (0 == optsp->do_name)) { diff --git a/src/sg_luns.c b/src/sg_luns.c index 060b9acd..33e4f222 100644 --- a/src/sg_luns.c +++ b/src/sg_luns.c @@ -28,7 +28,7 @@ * and decodes the response. */ -static const char * version_str = "1.22 20130528"; +static const char * version_str = "1.23 20130730"; #define MAX_RLUNS_BUFF_LEN (1024 * 1024) #define DEF_RLUNS_BUFF_LEN (1024 * 8) @@ -575,8 +575,8 @@ main(int argc, char * argv[]) } if (verbose > 1) { fprintf(stderr, "\nOutput response in hex\n"); - dStrHex((const char *)reportLunsBuff, - (trunc ? maxlen : list_len + 8), 1); + dStrHexErr((const char *)reportLunsBuff, + (trunc ? maxlen : list_len + 8), 1); } for (k = 0, off = 8; k < luns; ++k, off += 8) { if (0 == do_quiet) { diff --git a/src/sg_persist.c b/src/sg_persist.c index a4e00225..6a983f8f 100644 --- a/src/sg_persist.c +++ b/src/sg_persist.c @@ -306,12 +306,12 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len, break; case TPROTO_NONE: fprintf(stderr, "%s No specified protocol\n", leadin); - /* dStrHex((const char *)ucp, ((len > 24) ? 24 : len), -1); */ + /* dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), -1); */ 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), -1); + dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), -1); break; } } diff --git a/src/sg_raw.c b/src/sg_raw.c index 9f78146d..3d41c282 100644 --- a/src/sg_raw.c +++ b/src/sg_raw.c @@ -517,7 +517,7 @@ main(int argc, char *argv[]) } else { if (opts.datain_file == NULL && !opts.datain_binary) { fprintf(stderr, "Received %d bytes of data:\n", data_len); - dStrHex((const char *)dxfer_buffer_in, data_len, 0); + dStrHexErr((const char *)dxfer_buffer_in, data_len, 0); } else { const char * cp = "stdout"; diff --git a/src/sg_requests.c b/src/sg_requests.c index f6865ef1..c45dba36 100644 --- a/src/sg_requests.c +++ b/src/sg_requests.c @@ -25,7 +25,7 @@ * This program issues the SCSI command REQUEST SENSE to the given SCSI device. */ -static const char * version_str = "1.23 20130530"; +static const char * version_str = "1.24 20130730"; #define MAX_REQS_RESP_LEN 255 #define DEF_REQS_RESP_LEN 252 @@ -242,7 +242,7 @@ main(int argc, char * argv[]) resp_len = requestSenseBuff[7] + 8; if (verbose > 1) { fprintf(stderr, "Parameter data in hex\n"); - dStrHex((const char *)requestSenseBuff, resp_len, 1); + dStrHexErr((const char *)requestSenseBuff, resp_len, 1); } progress = -1; sg_get_sense_progress_fld(requestSenseBuff, resp_len, @@ -288,7 +288,7 @@ main(int argc, char * argv[]) sg_print_sense(NULL, requestSenseBuff, resp_len, 0); if (verbose > 1) { fprintf(stderr, "\nParameter data in hex\n"); - dStrHex((const char *)requestSenseBuff, resp_len, 1); + dStrHexErr((const char *)requestSenseBuff, resp_len, 1); } } continue; diff --git a/src/sg_rtpg.c b/src/sg_rtpg.c index f4fbcbd7..c13b2310 100644 --- a/src/sg_rtpg.c +++ b/src/sg_rtpg.c @@ -239,7 +239,7 @@ int main(int argc, char * argv[]) printf("Report list length = %d\n", report_len); if (hex) { if (verbose) - fprintf(stderr, "\nOutput response in hex:\n"); + printf("\nOutput response in hex:\n"); dStrHex((const char *)reportTgtGrpBuff, report_len, 1); goto err_out; } diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c index 68f03aa5..3c7c7b1b 100644 --- a/src/sg_sanitize.c +++ b/src/sg_sanitize.c @@ -184,7 +184,7 @@ do_sanitize(int sg_fd, const struct opts_t * op, const void * param_lstp, } if ((op->verbose > 2) && (param_lst_len > 0)) { fprintf(stderr, " Parameter list contents:\n"); - dStrHex((const char *)param_lstp, param_lst_len, 1); + dStrHexErr((const char *)param_lstp, param_lst_len, 1); } ptvp = construct_scsi_pt_obj(); if (NULL == ptvp) { @@ -538,7 +538,7 @@ main(int argc, char * argv[]) resp_len = requestSenseBuff[7] + 8; if (vb > 2) { fprintf(stderr, "Parameter data in hex\n"); - dStrHex((const char *)requestSenseBuff, resp_len, 1); + dStrHexErr((const char *)requestSenseBuff, resp_len, 1); } progress = -1; sg_get_sense_progress_fld(requestSenseBuff, resp_len, diff --git a/src/sg_ses.c b/src/sg_ses.c index 91ffb8cb..5ead459c 100644 --- a/src/sg_ses.c +++ b/src/sg_ses.c @@ -27,7 +27,7 @@ * commands tailored for SES (enclosure) devices. */ -static const char * version_str = "1.71 20130507"; /* ses3r05 */ +static const char * version_str = "1.72 20130730"; /* ses3r05 */ #define MX_ALLOC_LEN ((64 * 1024) - 1) #define MX_ELEM_HDR 1024 @@ -89,7 +89,7 @@ static const char * version_str = "1.71 20130507"; /* ses3r05 */ struct element_type_t { int elem_type_code; - const char * abbrev; + const char * abbrev; const char * desc; }; @@ -1103,14 +1103,14 @@ do_rec_diag(int sg_fd, int page_code, unsigned char * rsp_buff, if ((0x9 == rsp_buff[0]) && (1 & rsp_buff[1])) { fprintf(stderr, "Enclosure busy, try again later\n"); if (op->do_hex) - dStrHex((const char *)rsp_buff, rsp_len, 0); + dStrHexErr((const char *)rsp_buff, rsp_len, 0); } else if (0x8 == rsp_buff[0]) { fprintf(stderr, "Enclosure only supports Short Enclosure " "Status: 0x%x\n", rsp_buff[1]); } else { fprintf(stderr, "Invalid response, wanted page code: 0x%x " "but got 0x%x\n", page_code, rsp_buff[0]); - dStrHex((const char *)rsp_buff, rsp_len, 0); + dStrHexErr((const char *)rsp_buff, rsp_len, 0); } return -2; } diff --git a/src/sg_stpg.c b/src/sg_stpg.c index 8b89c0b9..6ee5aebb 100644 --- a/src/sg_stpg.c +++ b/src/sg_stpg.c @@ -24,7 +24,7 @@ * to the given SCSI device. */ -static const char * version_str = "1.6 20130507"; +static const char * version_str = "1.7 20130730"; #define TGT_GRP_BUFF_LEN 1024 #define MX_ALLOC_LEN (0xc000 + 0x80) @@ -161,7 +161,7 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg) 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]); @@ -170,7 +170,7 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg) 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_tpg = ((ip[2] << 8) | ip[3]); @@ -572,7 +572,7 @@ main(int argc, char * argv[]) "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; } @@ -617,7 +617,7 @@ main(int argc, char * argv[]) printf("Report list length = %d\n", report_len); if (hex) { if (verbose) - fprintf(stderr, "\nOutput response in hex:\n"); + printf("\nOutput response in hex:\n"); dStrHex((const char *)reportTgtGrpBuff, report_len, 1); goto err_out; } 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; } diff --git a/src/sg_write_buffer.c b/src/sg_write_buffer.c index b72ffc7a..d8ac38e6 100644 --- a/src/sg_write_buffer.c +++ b/src/sg_write_buffer.c @@ -25,7 +25,7 @@ * This utility issues the SCSI WRITE BUFFER command to the given device. */ -static const char * version_str = "1.10 20130507"; /* spc4r32 */ +static const char * version_str = "1.10 20130730"; /* spc4r32 */ #define ME "sg_write_buffer: " #define DEF_XFER_LEN (8 * 1024 * 1024) @@ -184,8 +184,8 @@ sg_ll_write_buffer_v2(int sg_fd, int mode, int m_specific, int buffer_id, if ((verbose > 1) && paramp && param_len) { fprintf(sg_warnings_strm, " Write buffer parameter list%s:\n", ((param_len > 256) ? " (first 256 bytes)" : "")); - dStrHex((const char *)paramp, - ((param_len > 256) ? 256 : param_len), -1); + dStrHexErr((const char *)paramp, + ((param_len > 256) ? 256 : param_len), -1); } } diff --git a/src/sg_write_same.c b/src/sg_write_same.c index 09e2f5d4..3dd235e9 100644 --- a/src/sg_write_same.c +++ b/src/sg_write_same.c @@ -26,7 +26,7 @@ #include "sg_cmds_basic.h" #include "sg_cmds_extra.h" -static const char * version_str = "1.03 20130603"; +static const char * version_str = "1.04 20130730"; #define ME "sg_write_same: " @@ -256,7 +256,7 @@ do_write_same(int sg_fd, const struct opts_t * optsp, const void * dataoutp, } if ((optsp->verbose > 3) && (optsp->xfer_len > 0)) { fprintf(stderr, " Data-out buffer contents:\n"); - dStrHex((const char *)dataoutp, optsp->xfer_len, 1); + dStrHexErr((const char *)dataoutp, optsp->xfer_len, 1); } ptvp = construct_scsi_pt_obj(); if (NULL == ptvp) { @@ -509,7 +509,7 @@ main(int argc, char * argv[]) RCAP16_RESP_LEN, 0, (vb ? (vb - 1): 0)); if (0 == res) { if (vb > 3) - dStrHex((const char *)resp_buff, RCAP16_RESP_LEN, 1); + dStrHexErr((const char *)resp_buff, RCAP16_RESP_LEN, 1); block_size = ((resp_buff[8] << 24) | (resp_buff[9] << 16) | (resp_buff[10] << 8) | @@ -528,7 +528,8 @@ main(int argc, char * argv[]) (vb ? (vb - 1): 0)); if (0 == res) { if (vb > 3) - dStrHex((const char *)resp_buff, RCAP10_RESP_LEN, 1); + dStrHexErr((const char *)resp_buff, RCAP10_RESP_LEN, + 1); block_size = ((resp_buff[4] << 24) | (resp_buff[5] << 16) | (resp_buff[6] << 8) | diff --git a/src/sg_xcopy.c b/src/sg_xcopy.c index 6ffddf8d..c6eedc04 100644 --- a/src/sg_xcopy.c +++ b/src/sg_xcopy.c @@ -61,12 +61,10 @@ #include "sg_cmds_extra.h" #include "sg_io_linux.h" -static const char * version_str = "0.36 20130627"; +static const char * version_str = "0.37 20130730"; #define ME "sg_xcopy: " -#define SG_DEBUG - #define STR_SZ 1024 #define INOUTF_SZ 512 #define EBUFF_SZ 512 @@ -561,7 +559,7 @@ scsi_extended_copy(int sg_fd, unsigned char list_id, int seg_desc_len; int verb; - verb = (verbose ? verbose - 1: 0); + verb = verbose ? (verbose - 1) : 0; memset(xcopyBuff, 0, 256); xcopyBuff[0] = list_id; @@ -580,7 +578,7 @@ scsi_extended_copy(int sg_fd, unsigned char list_id, if (verbose > 3) { fprintf(stderr, "\nParameter list in hex (length %d):\n", desc_offset); - dStrHex((const char *)xcopyBuff, desc_offset, 1); + dStrHexErr((const char *)xcopyBuff, desc_offset, 1); } /* set noisy so if a UA happens it will be printed to stderr */ return sg_ll_extended_copy(sg_fd, xcopyBuff, desc_offset, 1, verb); @@ -657,7 +655,7 @@ scsi_operating_parameter(struct xcopy_fp_t *xfp, int is_target) } if (verbose > 2) { fprintf(stderr, "\nOutput response in hex:\n"); - dStrHex((const char *)rcBuff, len, 1); + dStrHexErr((const char *)rcBuff, len, 1); } max_target_num = rcBuff[8] << 8 | rcBuff[9]; max_segment_num = rcBuff[10] << 8 | rcBuff[11]; @@ -948,8 +946,10 @@ decode_designation_descriptor(const unsigned char * ucp, 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); @@ -960,7 +960,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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"); @@ -972,13 +972,13 @@ decode_designation_descriptor(const unsigned char * ucp, 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 ((5 == naa) && (0x10 == i_len)) { @@ -991,7 +991,7 @@ decode_designation_descriptor(const unsigned char * ucp, int i_len) 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]); @@ -1005,7 +1005,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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) | */ @@ -1023,7 +1023,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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) | */ @@ -1043,7 +1043,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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]); @@ -1053,7 +1053,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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]); @@ -1063,7 +1063,7 @@ decode_designation_descriptor(const unsigned char * ucp, 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]); @@ -1071,18 +1071,18 @@ decode_designation_descriptor(const unsigned char * ucp, 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"); - dStrHex((const char *)ip, i_len, 0); + fprintf(stderr, " MD5 logical unit identifier:\n"); + dStrHexErr((const char *)ip, i_len, 0); break; 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"); @@ -1093,7 +1093,8 @@ decode_designation_descriptor(const unsigned char * ucp, int i_len) printf(" %s\n", (const char *)ip); 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; } } @@ -1127,7 +1128,7 @@ desc_from_vpd_id(int sg_fd, unsigned char *desc, int desc_len, } if (verbose > 2) { fprintf(stderr, "Output response in hex:\n"); - dStrHex((const char *)rcBuff, len, 1); + dStrHexErr((const char *)rcBuff, len, 1); } while ((u = sg_vpd_dev_id_iter(rcBuff + 4, len - 4, &off, 0, -1, -1)) == @@ -1187,7 +1188,7 @@ desc_from_vpd_id(int sg_fd, unsigned char *desc, int desc_len, desc[31] = block_size & 0xff; if (verbose > 3) { fprintf(stderr, "Descriptor in hex (bs %d):\n", block_size); - dStrHex((const char *)desc, 32, 1); + dStrHexErr((const char *)desc, 32, 1); } return 32; } @@ -1597,11 +1598,10 @@ main(int argc, char * argv[]) } } -#ifdef SG_DEBUG - fprintf(stderr, ME "%s if=%s skip=%" PRId64 " of=%s seek=%" PRId64 - " count=%" PRId64 "\n", (on_src)?"on-source":"on-destination", - ixcf.fname, skip, oxcf.fname, seek, dd_count); -#endif + if (verbose > 1) + fprintf(stderr, ME "%s if=%s skip=%" PRId64 " of=%s seek=%" PRId64 + " count=%" PRId64 "\n", (on_src)?"on-source":"on-destination", + ixcf.fname, skip, oxcf.fname, seek, dd_count); install_handler(SIGINT, interrupt_handler); install_handler(SIGQUIT, interrupt_handler); install_handler(SIGPIPE, interrupt_handler); @@ -1730,17 +1730,15 @@ main(int argc, char * argv[]) res = scsi_operating_parameter(&ixcf, 0); } else { if (-res == SG_LIB_CAT_INVALID_OP) { - fprintf(stderr, "receive copy results not supported on %s\n", - ixcf.fname); -#ifndef SG_DEBUG + fprintf(stderr, "receive copy operating parameters not " + "supported on %s\n", ixcf.fname); return EINVAL; -#endif } else if (-res == SG_LIB_CAT_NOT_READY) - fprintf(stderr, "receive copy results failed on %s - not " - "ready\n", ixcf.fname); + fprintf(stderr, "receive copy operating parameters failed " + "on %s - not ready\n", ixcf.fname); else { - fprintf(stderr, "Unable to receive copy results on %s\n", - ixcf.fname); + fprintf(stderr, "Unable to receive copy operating " + "parameters on %s\n", ixcf.fname); return -res; } } @@ -1768,17 +1766,15 @@ main(int argc, char * argv[]) res = scsi_operating_parameter(&oxcf, 1); } else { if (-res == SG_LIB_CAT_INVALID_OP) { - fprintf(stderr, "receive copy results not supported on %s\n", - oxcf.fname); -#ifndef SG_DEBUG + fprintf(stderr, "receive copy operating parameters not " + "supported on %s\n", oxcf.fname); return EINVAL; -#endif } else if (-res == SG_LIB_CAT_NOT_READY) - fprintf(stderr, "receive copy results failed on %s - not " - "ready\n", oxcf.fname); + fprintf(stderr, "receive copy operating parameters failed " + "on %s - not ready\n", oxcf.fname); else { - fprintf(stderr, "Unable to receive copy results on %s\n", - oxcf.fname); + fprintf(stderr, "Unable to receive copy operating " + "parameters on %s\n", oxcf.fname); return -res; } } @@ -1831,10 +1827,14 @@ main(int argc, char * argv[]) } } } else { + unsigned long r; + if (xcopy_flag_dc) - bpt = oxcf.max_bytes / oxcf.sect_sz; + r = oxcf.max_bytes / (unsigned long)oxcf.sect_sz; else - bpt = ixcf.max_bytes / ixcf.sect_sz; + r = ixcf.max_bytes / (unsigned long)ixcf.sect_sz; + if (r > INT_MAX) + bpt = INT_MAX / 2; } seg_desc_type = seg_desc_from_dd_type(ixcf.sg_type, 0, oxcf.sg_type, 0); @@ -1846,13 +1846,14 @@ main(int argc, char * argv[]) start_tm_valid = 1; } -#ifdef SG_DEBUG - fprintf(stderr, - "Start of loop, count=%" PRId64 ", bpt=%d, " - "lba_in=%" PRId64 ", lba_out=%" PRId64 "\n", - dd_count, bpt, skip, seek); -#endif + if (verbose) + fprintf(stderr, + "Start of loop, count=%" PRId64 ", bpt=%d, " + "lba_in=%" PRId64 ", lba_out=%" PRId64 "\n", + dd_count, bpt, skip, seek); + xcopy_fd = (on_src) ? infd : outfd; + while (dd_count > 0) { if (dd_count > bpt) blocks = bpt; |