aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--README2
-rw-r--r--debian/changelog2
-rw-r--r--doc/sg_sync.84
-rw-r--r--include/sg_cmds_extra.h9
-rw-r--r--include/sg_lib.h18
-rw-r--r--lib/sg_cmds_basic.c2
-rw-r--r--lib/sg_cmds_basic2.c10
-rw-r--r--lib/sg_cmds_extra.c127
-rw-r--r--lib/sg_cmds_mmc.c6
-rw-r--r--lib/sg_lib.c74
-rw-r--r--lib/sg_lib_data.c2
-rw-r--r--sg3_utils.spec2
-rw-r--r--src/sg_compare_and_write.c2
-rw-r--r--src/sg_copy_results.c40
-rw-r--r--src/sg_format.c7
-rw-r--r--src/sg_get_config.c8
-rw-r--r--src/sg_inq.c92
-rw-r--r--src/sg_logs.c39
-rw-r--r--src/sg_luns.c6
-rw-r--r--src/sg_persist.c4
-rw-r--r--src/sg_raw.c2
-rw-r--r--src/sg_requests.c6
-rw-r--r--src/sg_rtpg.c2
-rw-r--r--src/sg_sanitize.c4
-rw-r--r--src/sg_ses.c8
-rw-r--r--src/sg_stpg.c10
-rw-r--r--src/sg_vpd.c150
-rw-r--r--src/sg_write_buffer.c6
-rw-r--r--src/sg_write_same.c9
-rw-r--r--src/sg_xcopy.c109
31 files changed, 456 insertions, 311 deletions
diff --git a/ChangeLog b/ChangeLog
index b1740cb1..0572fec7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,7 @@ Each utility has its own version number, date of last change and
some description at the top of its ".c" file. All utilities in the main
directory have their own "man" pages. There is also a sg3_utils man page.
-Changelog for sg3_utils-1.37 [20130719] [svn: r502]
+Changelog for sg3_utils-1.37 [20130730] [svn: r503]
- sg_compare_and_write: fix wrprotect setting
- sg_inq: fix referrals VPD page
- dev_id VPD: T10 vendor id designator clean up
@@ -11,6 +11,9 @@ Changelog for sg3_utils-1.37 [20130719] [svn: r502]
- sg_unmap: fix core dump on -g option
- sg_vpd: dev_id VPD: T10 vendor id designator clean up
- sg_libs: extended copy opcode renamed (spc4r34)
+ - sg_ll_receive_copy_results(): expand for all sa_s
+ - add dStrHexErr(): ascii hex to stderr
+ - add dStrHexStr(): ascii hex to string
- scripts/rescan-scsi-bus.sh KR's v1.57 + HR patch
- Makefile.am cleanup
diff --git a/README b/README
index 468a0cae..bb3ffd24 100644
--- a/README
+++ b/README
@@ -382,4 +382,4 @@ See http://sg.danny.cz/sg/tools.html
Douglas Gilbert
-19th July 2013
+30th July 2013
diff --git a/debian/changelog b/debian/changelog
index 9e3a3a45..dba07c00 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,7 +2,7 @@ sg3-utils (1.37-0.1) unstable; urgency=low
* New upstream version
- -- Douglas Gilbert <dgilbert@interlog.com> Fri, 19 Jul 2013 18:00:00 -0400
+ -- Douglas Gilbert <dgilbert@interlog.com> Tue, 30 Jul 2013 20:00:00 -0400
sg3-utils (1.36-0.1) unstable; urgency=low
diff --git a/doc/sg_sync.8 b/doc/sg_sync.8
index a43bd408..68035ab7 100644
--- a/doc/sg_sync.8
+++ b/doc/sg_sync.8
@@ -1,4 +1,4 @@
-.TH SG_SYNC "8" "May 2013" "sg3_utils\-1.36" SG3_UTILS
+.TH SG_SYNC "8" "July 2013" "sg3_utils\-1.37" SG3_UTILS
.SH NAME
sg_sync \- send SCSI SYNCHRONIZE CACHE command
.SH SYNOPSIS
@@ -56,7 +56,7 @@ synchronize to the medium. Default value is 0 .
synchronize the (volatile) cache with the non\-volatile cache. Without this
option (or if there is no non\-volatile cache in the device) the
synchronization is with the medium. The SYNC_NV bit was made obsolete in
-SBC\-3 revsion 35d.
+SBC\-3 revision 35d.
.TP
\fB\-t\fR, \fB\-\-timeout\fR=\fISECS\fR
where \fISECS\fR is the number of seconds the OS allows the SYNCHRONIZE
diff --git a/include/sg_cmds_extra.h b/include/sg_cmds_extra.h
index c11198b5..d06e5d05 100644
--- a/include/sg_cmds_extra.h
+++ b/include/sg_cmds_extra.h
@@ -2,7 +2,7 @@
#define SG_CMDS_EXTRA_H
/*
- * Copyright (c) 2004-2012 Douglas Gilbert.
+ * Copyright (c) 2004-2013 Douglas Gilbert.
* All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the BSD_LICENSE file.
@@ -274,7 +274,8 @@ extern int sg_ll_write_long16(int sg_fd, int cor_dis, int wr_uncor, int pblock,
uint64_t llba, void * data_out, int xfer_len,
int * offsetp, int noisy, int verbose);
-/* Invokes a SCSI RECEIVE COPY RESULTS command. Return of 0 -> success,
+/* Invokes a SPC-3 SCSI RECEIVE COPY RESULTS command. In SPC-4 this function
+ * supports all service action variants of the THIRD-PARTY COPY IN opcode.
* SG_LIB_CAT_INVALID_OP -> Receive copy results not supported,
* SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
* SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
@@ -283,12 +284,12 @@ extern int sg_ll_receive_copy_results(int sg_fd, int sa, int list_id,
void * resp, int mx_resp_len,
int noisy, int verbose);
-/* Invokes a SCSI EXTENDEd COPY command. Return of 0 -> success,
+/* Invokes a SCSI EXTENDED COPY(LID1) command. Return of 0 -> success,
* SG_LIB_CAT_INVALID_OP -> Extended copy not supported,
* SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
* SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
* -1 -> other failure */
-extern int sg_ll_extended_copy(int sg_fd, void * resp, int mx_resp_len,
+extern int sg_ll_extended_copy(int sg_fd, void * paramp, int param_len,
int noisy, int verbose);
#ifdef __cplusplus
diff --git a/include/sg_lib.h b/include/sg_lib.h
index cdad585d..9bf29fa9 100644
--- a/include/sg_lib.h
+++ b/include/sg_lib.h
@@ -100,12 +100,12 @@ extern "C" {
#define TPROTO_SAS 6
#define TPROTO_ADT 7
#define TPROTO_ATA 8
-#define TPROTO_UAS 9
-#define TPROTO_SOP 0xa
+#define TPROTO_UAS 9 /* USB attached SCSI */
+#define TPROTO_SOP 0xa /* SCSI over PCIe */
#define TPROTO_NONE 0xf
-/* The format of the version string is like this: "1.47 20090201" */
+/* The format of the version string is like this: "1.87 20130731" */
extern const char * sg_lib_version();
/* Returns length of SCSI command given the opcode (first byte).
@@ -302,6 +302,18 @@ extern char * safe_strerror(int errnum);
*/
extern void dStrHex(const char* str, int len, int no_ascii);
+/* Print (to sg_warnings_strm (stderr)) 'str' of bytes in hex, 16 bytes per
+ * line optionally followed at right by its ASCII interpretation. Same
+ * logic as dStrHex() with different output stream (i.e. stderr). */
+extern void dStrHexErr(const char* str, int len, int no_ascii);
+
+/* Read 'len' bytes from 'str' and output as ASCII-Hex bytes (space
+ * separated) to 'b' not to exceed 'b_len' characters. Each line
+ * starts with 'leadin' (NULL for no leadin) and there are 16 bytes
+ * per line with an extra space between the 8th and 9th bytes */
+extern void dStrHexStr(const char* str, int len, const char * leadin,
+ int b_len, char * b);
+
/* Returns 1 when executed on big endian machine; else returns 0.
* Useful for displaying ATA identify words (which need swapping on a
* big endian machine).
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
index fbbb774e..f0a3dee1 100644
--- a/lib/sg_cmds_basic.c
+++ b/lib/sg_cmds_basic.c
@@ -27,7 +27,7 @@
#endif
-static const char * version_str = "1.61 20130507";
+static const char * version_str = "1.62 20130728";
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
diff --git a/lib/sg_cmds_basic2.c b/lib/sg_cmds_basic2.c
index 81ecef2b..77cf8367 100644
--- a/lib/sg_cmds_basic2.c
+++ b/lib/sg_cmds_basic2.c
@@ -351,7 +351,7 @@ sg_ll_mode_sense6(int sg_fd, int dbd, int pc, int pg_code, int sub_pg_code,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " mode sense (6): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -426,7 +426,7 @@ sg_ll_mode_sense10(int sg_fd, int llbaa, int dbd, int pc, int pg_code,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " mode sense (10): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -465,7 +465,7 @@ sg_ll_mode_select6(int sg_fd, int pf, int sp, void * paramp, int param_len,
}
if (verbose > 1) {
fprintf(sg_warnings_strm, " mode select (6) parameter list\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
@@ -537,7 +537,7 @@ sg_ll_mode_select10(int sg_fd, int pf, int sp, void * paramp, int param_len,
}
if (verbose > 1) {
fprintf(sg_warnings_strm, " mode select (10) parameter list\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
@@ -856,7 +856,7 @@ sg_ll_log_select(int sg_fd, int pcr, int sp, int pc, int pg_code,
}
if ((verbose > 1) && (param_len > 0)) {
fprintf(sg_warnings_strm, " log select parameter list\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c
index d162bb7c..345d51bd 100644
--- a/lib/sg_cmds_extra.c
+++ b/lib/sg_cmds_extra.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2012 Douglas Gilbert.
+ * Copyright (c) 1999-2013 Douglas Gilbert.
* All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the BSD_LICENSE file.
@@ -164,7 +164,7 @@ sg_ll_get_lba_status(int sg_fd, uint64_t start_llba, void * resp,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " get LBA status: response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -246,7 +246,7 @@ sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " report target port group: "
"response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -283,7 +283,7 @@ sg_ll_set_tgt_prt_grp(int sg_fd, void * paramp, int param_len, int noisy,
if ((verbose > 1) && paramp && param_len) {
fprintf(sg_warnings_strm, " set target port groups "
"parameter list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
}
@@ -396,7 +396,7 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, int one_seg,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " report referrals: response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -436,7 +436,7 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit,
if ((verbose > 1) && paramp && param_len) {
fprintf(sg_warnings_strm, " Send diagnostic parameter "
"list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
}
@@ -544,7 +544,7 @@ sg_ll_receive_diag(int sg_fd, int pcv, int pg_code, void * resp,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " receive diagnostic results: "
"response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -618,7 +618,7 @@ sg_ll_read_defect10(int sg_fd, int req_plist, int req_glist, int dl_format,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read defect (10): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -691,7 +691,7 @@ sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read media serial number: respon"
"se%s\n", (ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -767,7 +767,7 @@ sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " report identifying information: "
"response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -807,7 +807,7 @@ sg_ll_set_id_info(int sg_fd, int itype, void * paramp, int param_len,
if ((verbose > 1) && paramp && param_len) {
fprintf(sg_warnings_strm, " Set identifying information "
"parameter list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
}
@@ -886,7 +886,7 @@ sg_ll_format_unit(int sg_fd, int fmtpinfo, int longlist, int fmtdata,
}
if ((verbose > 1) && (param_len > 0)) {
fprintf(sg_warnings_strm, " format parameter list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
@@ -952,7 +952,7 @@ sg_ll_reassign_blocks(int sg_fd, int longlba, int longlist, void * paramp,
}
if (verbose > 1) {
fprintf(sg_warnings_strm, " reassign blocks parameter list\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
@@ -1055,7 +1055,7 @@ sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " persistent reserve in: "
"response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -1094,7 +1094,7 @@ sg_ll_persistent_reserve_out(int sg_fd, int rq_servact, int rq_scope,
if (verbose > 1) {
fprintf(sg_warnings_strm, " Persistent Reservation Out "
"parameters:\n");
- dStrHex((const char *)paramp, param_len, 0);
+ dStrHexErr((const char *)paramp, param_len, 0);
}
}
@@ -1244,7 +1244,7 @@ sg_ll_read_long10(int sg_fd, int pblock, int correct, unsigned int lba,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read long(10): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -1349,7 +1349,7 @@ sg_ll_read_long16(int sg_fd, int pblock, int correct, uint64_t llba,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read long(16): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -1599,7 +1599,7 @@ sg_ll_verify10(int sg_fd, int vrprotect, int dpo, int bytchk,
k = data_out_len > 4104 ? 4104 : data_out_len;
fprintf(sg_warnings_strm, " data_out buffer%s\n",
(data_out_len > 4104 ? ", first 4104 bytes" : ""));
- dStrHex((const char *)data_out, k, verbose < 5);
+ dStrHexErr((const char *)data_out, k, verbose < 5);
}
}
ptvp = construct_scsi_pt_obj();
@@ -1702,7 +1702,7 @@ sg_ll_verify16(int sg_fd, int vrprotect, int dpo, int bytchk, uint64_t llba,
k = data_out_len > 4104 ? 4104 : data_out_len;
fprintf(sg_warnings_strm, " data_out buffer%s\n",
(data_out_len > 4104 ? ", first 4104 bytes" : ""));
- dStrHex((const char *)data_out, k, verbose < 5);
+ dStrHexErr((const char *)data_out, k, verbose < 5);
}
}
ptvp = construct_scsi_pt_obj();
@@ -1985,7 +1985,7 @@ sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read buffer: response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -2026,7 +2026,7 @@ sg_ll_write_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
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,
+ dStrHexErr((const char *)paramp,
((param_len > 256) ? 256 : param_len), -1);
}
}
@@ -2107,7 +2107,7 @@ sg_ll_unmap_v2(int sg_fd, int anchor, int group_num, int timeout_secs,
fprintf(sg_warnings_strm, "\n");
if ((verbose > 1) && paramp && param_len) {
fprintf(sg_warnings_strm, " unmap parameter list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
}
@@ -2203,7 +2203,7 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
if ((verbose > 2) && (ret > 0)) {
fprintf(sg_warnings_strm, " read block limits: response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (ret > 256 ? 256 : ret), -1);
+ dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
}
@@ -2211,7 +2211,22 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
return ret;
}
-/* Invokes a SCSI RECEIVE COPY RESULTS command. Return of 0 -> success,
+/* If error or debug, want to know the service action */
+#define REC_COPY_RESULTS_NUM_SAS 9
+static const char * receive_copy_results_sas[REC_COPY_RESULTS_NUM_SAS] = {
+ "status (LID1)",
+ "data (LID1)",
+ "unused [0x2]",
+ "operating parameters",
+ "failure details (LID1)",
+ "status (LID4)",
+ "data (LID4)",
+ "ROD token information", /* this is different name */
+ "Report all ROD tokens", /* this is different name */
+};
+
+/* Invokes a SCSI RECEIVE COPY RESULTS command. Actually cover all current
+ * uses of opcode 0x84 (Third-party copy IN). Return of 0 -> success,
* SG_LIB_CAT_INVALID_OP -> Receive copy results not supported,
* SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
* SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
@@ -2225,9 +2240,23 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
{RECEIVE_COPY_RESULTS_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
+ const char * old_opcode_name = "Receive copy results";
+ char b[64];
+ if ((sa >= REC_COPY_RESULTS_NUM_SAS) || ( sa < 0))
+ snprintf(b, sizeof(b), "%s [sa=0x%x]", old_opcode_name, sa);
+ else
+ snprintf(b, sizeof(b), "%s [sa: %s]", old_opcode_name,
+ receive_copy_results_sas[sa]);
rcvcopyresCmdBlk[1] = (unsigned char)(sa & 0x1f);
- rcvcopyresCmdBlk[2] = (unsigned char)(list_id);
+ if (sa <= 4) /* LID1 variants */
+ rcvcopyresCmdBlk[2] = (unsigned char)(list_id);
+ else if ((sa >= 5) && (sa <= 7)) { /* LID4 variants */
+ rcvcopyresCmdBlk[2] = (unsigned char)((list_id >> 24) & 0xff);
+ rcvcopyresCmdBlk[3] = (unsigned char)((list_id >> 16) & 0xff);
+ rcvcopyresCmdBlk[4] = (unsigned char)((list_id >> 8) & 0xff);
+ rcvcopyresCmdBlk[5] = (unsigned char)(list_id & 0xff);
+ }
rcvcopyresCmdBlk[10] = (unsigned char)((mx_resp_len >> 24) & 0xff);
rcvcopyresCmdBlk[11] = (unsigned char)((mx_resp_len >> 16) & 0xff);
rcvcopyresCmdBlk[12] = (unsigned char)((mx_resp_len >> 8) & 0xff);
@@ -2236,7 +2265,7 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
if (NULL == sg_warnings_strm)
sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Receive copy results cmd: ");
+ fprintf(sg_warnings_strm, " %s cmd: ", b);
for (k = 0; k < RECEIVE_COPY_RESULTS_CMDLEN; ++k)
fprintf(sg_warnings_strm, "%02x ", rcvcopyresCmdBlk[k]);
fprintf(sg_warnings_strm, "\n");
@@ -2244,17 +2273,15 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "receive copy results: out of "
- "memory\n");
+ fprintf(sg_warnings_strm, "%s: out of memory\n", b);
return -1;
}
set_scsi_pt_cdb(ptvp, rcvcopyresCmdBlk, sizeof(rcvcopyresCmdBlk));
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
set_scsi_pt_data_in(ptvp, (unsigned char *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
- ret = sg_cmds_process_resp(ptvp, "receive copy results", res,
- mx_resp_len, sense_b, noisy, verbose,
- &sense_cat);
+ ret = sg_cmds_process_resp(ptvp, b, res, mx_resp_len, sense_b, noisy,
+ verbose, &sense_cat);
if (-1 == ret)
;
else if (-2 == ret) {
@@ -2280,47 +2307,59 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
return ret;
}
-/* Invokes a SCSI RECEIVE COPY RESULTS command. Return of 0 -> success,
+
+/* SPC-4 rev 35 and later calls this opcode (0x83) "Third-party copy OUT"
+ * The original EXTENDED COPY command (now called EXTENDED COPY (LID1))
+ * is the only one supported by sg_ll_extended_copy(). Another function
+ * perhaps sg_ll_3party_copy_out() is needed for the other service actions
+ * ( > 0 ). */
+
+/* Invokes a SCSI EXTENDED COPY (LID1) command. Return of 0 -> success,
* SG_LIB_CAT_INVALID_OP -> Receive copy results not supported,
* SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
* SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
* -1 -> other failure */
int
-sg_ll_extended_copy(int sg_fd, void * resp,
- int mx_resp_len, int noisy, int verbose)
+sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, int noisy,
+ int verbose)
{
int k, res, ret, sense_cat;
unsigned char xcopyCmdBlk[EXTENDED_COPY_CMDLEN] =
{EXTENDED_COPY_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
+ const char * opcode_name = "Extended copy (LID1)";
- xcopyCmdBlk[10] = (unsigned char)((mx_resp_len >> 24) & 0xff);
- xcopyCmdBlk[11] = (unsigned char)((mx_resp_len >> 16) & 0xff);
- xcopyCmdBlk[12] = (unsigned char)((mx_resp_len >> 8) & 0xff);
- xcopyCmdBlk[13] = (unsigned char)(mx_resp_len & 0xff);
+ xcopyCmdBlk[10] = (unsigned char)((param_len >> 24) & 0xff);
+ xcopyCmdBlk[11] = (unsigned char)((param_len >> 16) & 0xff);
+ xcopyCmdBlk[12] = (unsigned char)((param_len >> 8) & 0xff);
+ xcopyCmdBlk[13] = (unsigned char)(param_len & 0xff);
if (NULL == sg_warnings_strm)
sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Extended copy cmd: ");
+ fprintf(sg_warnings_strm, " %s cmd: ", opcode_name);
for (k = 0; k < EXTENDED_COPY_CMDLEN; ++k)
fprintf(sg_warnings_strm, "%02x ", xcopyCmdBlk[k]);
fprintf(sg_warnings_strm, "\n");
+ if ((verbose > 1) && paramp && param_len) {
+ fprintf(sg_warnings_strm, " %s parameter list:\n",
+ opcode_name);
+ dStrHexErr((const char *)paramp, param_len, -1);
+ }
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "extended copy: out of memory\n");
+ fprintf(sg_warnings_strm, "%s: out of memory\n", opcode_name);
return -1;
}
set_scsi_pt_cdb(ptvp, xcopyCmdBlk, sizeof(xcopyCmdBlk));
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
- set_scsi_pt_data_out(ptvp, (unsigned char *)resp, mx_resp_len);
+ set_scsi_pt_data_out(ptvp, (unsigned char *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
- ret = sg_cmds_process_resp(ptvp, "extended copy", res,
- mx_resp_len, sense_b, noisy, verbose,
- &sense_cat);
+ ret = sg_cmds_process_resp(ptvp, opcode_name, res, 0, sense_b,
+ noisy, verbose, &sense_cat);
if (-1 == ret)
;
else if (-2 == ret) {
diff --git a/lib/sg_cmds_mmc.c b/lib/sg_cmds_mmc.c
index 0fbc8bd7..e6d2c8a8 100644
--- a/lib/sg_cmds_mmc.c
+++ b/lib/sg_cmds_mmc.c
@@ -185,7 +185,7 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp,
len = (ret < len) ? ret : len;
fprintf(sg_warnings_strm, " get configuration: response%s\n",
(len > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (len > 256 ? 256 : len), -1);
+ dStrHexErr((const char *)resp, (len > 256 ? 256 : len), -1);
}
ret = 0;
}
@@ -280,7 +280,7 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba,
len = (ret < len) ? ret : len;
fprintf(sg_warnings_strm, " get performance:: response%s\n",
(len > 256 ? ", first 256 bytes" : ""));
- dStrHex((const char *)resp, (len > 256 ? 256 : len), -1);
+ dStrHexErr((const char *)resp, (len > 256 ? 256 : len), -1);
}
ret = 0;
}
@@ -316,7 +316,7 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len,
if ((verbose > 1) && paramp && param_len) {
fprintf(sg_warnings_strm, " set streaming "
"parameter list:\n");
- dStrHex((const char *)paramp, param_len, -1);
+ dStrHexErr((const char *)paramp, param_len, -1);
}
}
diff --git a/lib/sg_lib.c b/lib/sg_lib.c
index 227b4b0c..e4b8d745 100644
--- a/lib/sg_lib.c
+++ b/lib/sg_lib.c
@@ -49,8 +49,6 @@
FILE * sg_warnings_strm = NULL; /* would like to default to stderr */
-static void dStrHexErr(const char* str, int len, int b_len, char * b);
-
/* Want safe, 'n += snprintf(b + n, blen - n, ...)' style sequence of
* functions. Returns number number of chars placed in cp excluding the
@@ -1015,7 +1013,8 @@ sg_get_sense_str(const char * leadin, const unsigned char * sense_buffer,
"\n");
if (n >= (buff_len - 1))
return;
- dStrHexErr((const char *)sense_buffer, len, buff_len - n, buff + n);
+ dStrHexStr((const char *)sense_buffer, len, " ", buff_len - n,
+ buff + n);
}
}
@@ -1391,8 +1390,8 @@ safe_strerror(int errnum)
> 0 each line has address then up to 16 ASCII-hex bytes
= 0 in addition, the bytes are listed in ASCII to the right
< 0 only the ASCII-hex bytes are listed (i.e. without address) */
-void
-dStrHex(const char* str, int len, int no_ascii)
+static void
+dStrHexFp(const char* str, int len, int no_ascii, FILE * fp)
{
const char * p = str;
const char * formatstr;
@@ -1421,14 +1420,14 @@ dStrHex(const char* str, int len, int no_ascii)
(int)(unsigned char)c);
buff[bpos + 2] = ' ';
if ((k > 0) && (0 == ((k + 1) % 16))) {
- printf(formatstr, buff);
+ fprintf(fp, formatstr, buff);
bpos = bpstart;
memset(buff, ' ', 80);
}
}
if (bpos > bpstart) {
buff[bpos + 2] = '\0';
- printf("%s\n", buff);
+ fprintf(fp, "%s\n", buff);
}
return;
}
@@ -1451,7 +1450,7 @@ dStrHex(const char* str, int len, int no_ascii)
buff[cpos++] = c;
}
if (cpos > (cpstart + 15)) {
- printf(formatstr, buff);
+ fprintf(fp, formatstr, buff);
bpos = bpstart;
cpos = cpstart;
a += 16;
@@ -1462,45 +1461,70 @@ dStrHex(const char* str, int len, int no_ascii)
}
if (cpos > cpstart) {
buff[cpos] = '\0';
- printf("%s\n", buff);
+ fprintf(fp, "%s\n", buff);
}
}
-/* Output to ASCII-Hex bytes to 'b' not to exceed 'b_len' characters.
- * 16 bytes per line with an extra space between the 8th and 9th bytes */
-static void
-dStrHexErr(const char* str, int len, int b_len, char * b)
+void
+dStrHex(const char* str, int len, int no_ascii)
+{
+ dStrHexFp(str, len, no_ascii, stdout);
+}
+
+void
+dStrHexErr(const char* str, int len, int no_ascii)
+{
+ dStrHexFp(str, len, no_ascii,
+ (sg_warnings_strm ? sg_warnings_strm : stderr));
+}
+
+/* Read 'len' bytes from 'str' and output as ASCII-Hex bytes (space
+ * separated) to 'b' not to exceed 'b_len' characters. Each line
+ * starts with 'leadin' (NULL for no leadin) and there are 16 bytes
+ * per line with an extra space between the 8th and 9th bytes */
+void
+dStrHexStr(const char* str, int len, const char * leadin, int b_len, char * b)
{
const char * p = str;
unsigned char c;
- char buff[82];
- const int bpstart = 5;
- int bpos = bpstart;
- int k, n;
+ char buff[122];
+ int bpstart, bpos, k, n;
if (len <= 0)
return;
+ if (leadin) {
+ bpstart = strlen(leadin);
+ /* Cap leadin at 60 characters */
+ if (bpstart > 60)
+ bpstart = 60;
+ } else
+ bpstart = 0;
+ bpos = bpstart;
n = 0;
- memset(buff, ' ', 80);
- buff[80] = '\0';
+ memset(buff, ' ', 120);
+ buff[120] = '\0';
+ if (bpstart > 0)
+ memcpy(buff, leadin, bpstart);
for (k = 0; k < len; k++) {
c = *p++;
- bpos += 3;
- if (bpos == (bpstart + (9 * 3)))
+ if (bpos == (bpstart + (8 * 3)))
bpos++;
my_snprintf(&buff[bpos], (int)sizeof(buff) - bpos, "%.2x",
(int)(unsigned char)c);
buff[bpos + 2] = ' ';
if ((k > 0) && (0 == ((k + 1) % 16))) {
- n += my_snprintf(b + n, b_len - n, "%.60s\n", buff);
+ n += my_snprintf(b + n, b_len - n, "%.*s\n", bpstart + 48, buff);
if (n >= (b_len - 1))
return;
bpos = bpstart;
- memset(buff, ' ', 80);
- }
+ memset(buff, ' ', 120);
+ if (bpstart > 0)
+ memcpy(buff, leadin, bpstart);
+ } else
+ bpos += 3;
}
if (bpos > bpstart)
- n += my_snprintf(b + n, b_len - n, "%.60s\n", buff);
+ n += my_snprintf(b + n, b_len - n, "%.*s\n", bpstart + 48, buff);
return;
}
diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c
index 7d45ef91..424a3e50 100644
--- a/lib/sg_lib_data.c
+++ b/lib/sg_lib_data.c
@@ -15,7 +15,7 @@
#endif
-const char * sg_lib_version_str = "1.86 20130701"; /* spc4r36, sbc3r32 */
+const char * sg_lib_version_str = "1.87 20130730"; /* spc4r36, sbc3r32 */
#ifdef SG_SCSI_STRINGS
struct sg_lib_value_name_t sg_lib_normal_opcodes[] = {
diff --git a/sg3_utils.spec b/sg3_utils.spec
index a2e3a212..5954eb3d 100644
--- a/sg3_utils.spec
+++ b/sg3_utils.spec
@@ -79,7 +79,7 @@ fi
%{_libdir}/*.la
%changelog
-* Fri Jul 19 2013 - dgilbert at interlog dot com
+* Tue Jul 30 2013 - dgilbert at interlog dot com
- track t10 changes
* sg3_utils-1.37
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;