aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2014-02-16 04:05:54 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2014-02-16 04:05:54 +0000
commit16cc45e3f1f7bd5f8415d013664e1dd5de5aa385 (patch)
tree87b31450e6e5098fd222ca21b49d10db3c7e5dbd
parenta6cf83a7f0489516752d365830d169053c2f7fa3 (diff)
downloadsg3_utils-16cc45e3f1f7bd5f8415d013664e1dd5de5aa385.tar.gz
more --inhex work on sg_inq + cleanup; similar preparatory work for sg_vpd
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@552 6180dd3e-e324-4e3e-922d-17de1ae2f315
-rw-r--r--ChangeLog5
-rw-r--r--README2
-rw-r--r--debian/changelog2
-rw-r--r--doc/sg3_utils.82
-rw-r--r--doc/sg_inq.815
-rw-r--r--sg3_utils.spec2
-rw-r--r--src/sg_inq.c916
-rw-r--r--src/sg_vpd.c575
-rw-r--r--src/sg_vpd_vendor.c125
9 files changed, 811 insertions, 833 deletions
diff --git a/ChangeLog b/ChangeLog
index a479fdaa..da824eb8 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.38 [20140213] [svn: r551]
+Changelog for sg3_utils-1.38 [20140215] [svn: r552]
- sg_ses: add --dev-slot-num= and --sas-addr=
- fix --data=- problem with large buffers
- new --data=@FN to read hex data from file FN
@@ -11,8 +11,9 @@ Changelog for sg3_utils-1.38 [20140213] [svn: r551]
- sg_inq: add --block=0|1 option to control opens
- add --inhex=FN to read response in from a file
- make -HH (-HHH for -p di) output suitable for
- --inhex
+ another sg_inq to use --inhex
- add LU_CONG to standard inquiry response output
+ - decode ASCII information VPD pages
- sync version descriptors dated 20131126
- fix overflow in encode_whitespaces
- sg_vpd: add LU_CONG to standard inquiry response output
diff --git a/README b/README
index 0a1085e1..b145f6c9 100644
--- a/README
+++ b/README
@@ -403,4 +403,4 @@ See http://sg.danny.cz/sg/tools.html
Douglas Gilbert
-3rd February 2014
+15th February 2014
diff --git a/debian/changelog b/debian/changelog
index 95e9c5a8..eeb7bd38 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,7 +2,7 @@ sg3-utils (1.38-0.1) unstable; urgency=low
* New upstream version
- -- Douglas Gilbert <dgilbert@interlog.com> Mon, 03 Feb 2014 23:00:00 -0500
+ -- Douglas Gilbert <dgilbert@interlog.com> Sat, 15 Feb 2014 23:00:00 -0500
sg3-utils (1.37-0.1) unstable; urgency=low
diff --git a/doc/sg3_utils.8 b/doc/sg3_utils.8
index b0aeb09c..b6b986c7 100644
--- a/doc/sg3_utils.8
+++ b/doc/sg3_utils.8
@@ -1,4 +1,4 @@
-.TH SG3_UTILS "8" "January 2014" "sg3_utils\-1.38" SG3_UTILS
+.TH SG3_UTILS "8" "February 2014" "sg3_utils\-1.38" SG3_UTILS
.SH NAME
sg3_utils \- a package of utilities for sending SCSI commands
.SH SYNOPSIS
diff --git a/doc/sg_inq.8 b/doc/sg_inq.8
index 86f76826..f5e1f25a 100644
--- a/doc/sg_inq.8
+++ b/doc/sg_inq.8
@@ -40,15 +40,15 @@ is mandatory. The \fI\-\-id\fR option decodes this page. New VPD page
information is no longer being added to this utility. To get information
on new VPD pages see the sg_vpd(8) or sdparm(8) utilities.
.PP
-If the \fIDEVICE\fR exists and the SCSI INQUIRY fails (because the SG_IO ioctl
-is not supported) then an ATA IDENTIFY (PACKET) DEVICE is tried. If it
-succeeds then device identification strings are output. The \fI\-\-raw\fR
-and \fI\-\-hex\fR options can be used to manipulate the output. If the
-\fI\-\-ata\fR option is given then the SCSI INQUIRY is not performed
+In Linux, if the \fIDEVICE\fR exists and the SCSI INQUIRY fails (e.g. because
+the SG_IO ioctl is not supported) then an ATA IDENTIFY (PACKET) DEVICE is
+tried. If it succeeds then device identification strings are output. The
+\fI\-\-raw\fR and \fI\-\-hex\fR options can be used to manipulate the output.
+If the \fI\-\-ata\fR option is given then the SCSI INQUIRY is not performed
and the \fIDEVICE\fR is assumed to be ATA (or ATAPI).
.PP
The reference document used for interpreting an INQUIRY is T10/1713\-D
-Revision 36e (SPC\-4, 24 August 2012) found at http://www.t10.org .
+Revision 36q (SPC\-4, 12 February 2014) found at http://www.t10.org .
Obsolete and reserved items in the standard INQUIRY response output are
displayed in brackets. The reference document for the ATA IDENTIFY (PACKET)
DEVICE command is ATA8\-ACS found at http://www.t13.org .
@@ -314,6 +314,9 @@ descriptors". If \fI\-h\fR is given then each descriptor header is decoded
and the identifier itself is output in hex. To see the whole VPD 0x83 page
response in hex use '\-p=83 \-h'.
.TP
+\fB\-I\fR=\fIFN\fR
+equivalent to \fI\-\-inhex=FN\fR in the OPTIONS section.
+.TP
\fB\-m\fR
decodes the Management network addresses VPD page [0x85]. Equivalent
to '\-\-page=mna' in the OPTIONS section.
diff --git a/sg3_utils.spec b/sg3_utils.spec
index 822730de..9945a854 100644
--- a/sg3_utils.spec
+++ b/sg3_utils.spec
@@ -79,7 +79,7 @@ fi
%{_libdir}/*.la
%changelog
-* Mon Feb 03 2014 - dgilbert at interlog dot com
+* Sat Feb 15 2014 - dgilbert at interlog dot com
- track t10 changes
* sg3_utils-1.38
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 1d11e3b3..9cbc7fce 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -68,7 +68,7 @@
* information [MAINTENANCE IN, service action = 0xc]; see sg_opcodes.
*/
-static const char * version_str = "1.27 20140213"; /* SPC-4 rev 36q */
+static const char * version_str = "1.28 20140214"; /* SPC-4 rev 36q */
/* Following VPD pages are in ascending page number order */
@@ -896,8 +896,8 @@ bad:
/* Local version of sg_ll_inquiry() [found in libsgutils] that additionally
* passes back resid. Same return values as sg_ll_inquiry() (0 is good). */
static int
-ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
- int mx_resp_len, int * residp, int noisy, int verbose)
+pt_inquiry(int sg_fd, int evpd, int pg_op, void * resp, int mx_resp_len,
+ int * residp, int noisy, int verbose)
{
int res, ret, k, sense_cat;
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY_CMD, 0, 0, 0, 0, 0};
@@ -905,8 +905,6 @@ ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
unsigned char * up;
struct sg_pt_base * ptvp;
- if (cmddt)
- inqCmdBlk[1] |= 2;
if (evpd)
inqCmdBlk[1] |= 1;
inqCmdBlk[2] = (unsigned char)pg_op;
@@ -1141,6 +1139,75 @@ get_vpd_page_str(int vpd_page_num, int scsi_ptype)
}
static void
+decode_supported_vpd(unsigned char * buff, int len, int do_hex)
+{
+ int vpd, k, rlen, pdt;
+ const char * cp;
+
+ if (do_hex) {
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
+ return;
+ }
+ if (len < 4) {
+ pr2serr("Supported VPD pages VPD page length too short=%d\n", len);
+ return;
+ }
+ pdt = 0x1f & buff[0];
+ rlen = buff[3] + 4;
+ if (rlen > len)
+ pr2serr("Supported VPD pages VPD page truncated, indicates %d, got "
+ "%d\n", rlen, len);
+ else
+ len = rlen;
+ printf(" Supported VPD pages:\n");
+ for (k = 0; k < len - 4; ++k) {
+ vpd = buff[4 + k];
+ cp = get_vpd_page_str(vpd, pdt);
+ if (cp)
+ printf(" 0x%x\t%s\n", vpd, cp);
+ else
+ printf(" 0x%x\n", vpd);
+ }
+}
+
+/* ASCII Information VPD pages (page numbers: 0x1 to 0x7f) */
+static void
+decode_ascii_inf(unsigned char * buff, int len, int do_hex)
+{
+ int al, k, bump;
+ unsigned char * ucp;
+ unsigned char * p;
+
+ if (do_hex) {
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
+ return;
+ }
+ if (len < 4) {
+ pr2serr("ASCII information VPD page length too short=%d\n", len);
+ return;
+ }
+ if (4 == len)
+ return;
+ al = buff[4];
+ if ((al + 5) > len)
+ al = len - 5;
+ for (k = 0, ucp = buff + 5; k < al; k += bump, ucp += bump) {
+ p = (unsigned char *)memchr(ucp, 0, al - k);
+ if (! p) {
+ printf(" %.*s\n", al - k, (const char *)ucp);
+ break;
+ }
+ printf(" %s\n", (const char *)ucp);
+ bump = (p - ucp) + 1;
+ }
+ ucp = buff + 5 + al;
+ if (ucp < (buff + len)) {
+ printf("Vendor specific information in hex:\n");
+ dStrHex((const char *)ucp, len - (al + 5), 0);
+ }
+}
+
+static void
decode_id_vpd(unsigned char * buff, int len, int do_hex)
{
if (len < 4) {
@@ -1187,6 +1254,10 @@ decode_net_man_vpd(unsigned char * buff, int len, int do_hex)
len);
return;
}
+ if (do_hex > 2) {
+ dStrHex((const char *)buff, len, -1);
+ return;
+ }
len -= 4;
ucp = buff + 4;
for (k = 0; k < len; k += bump, ucp += bump) {
@@ -1203,8 +1274,7 @@ decode_net_man_vpd(unsigned char * buff, int len, int do_hex)
if (na_len > 0) {
if (do_hex) {
printf(" Network address:\n");
- dStrHex((const char *)(ucp + 4), na_len,
- (1 == do_hex) ? 0 : -1);
+ dStrHex((const char *)(ucp + 4), na_len, 0);
} else
printf(" %s\n", ucp + 4);
}
@@ -1230,6 +1300,10 @@ decode_mode_policy_vpd(unsigned char * buff, int len, int do_hex)
pr2serr("Mode page policy VPD page length too short=%d\n", len);
return;
}
+ if (do_hex > 2) {
+ dStrHex((const char *)buff, len, -1);
+ return;
+ }
len -= 4;
ucp = buff + 4;
for (k = 0; k < len; k += bump, ucp += bump) {
@@ -1264,6 +1338,10 @@ decode_scsi_ports_vpd(unsigned char * buff, int len, int do_hex)
pr2serr("SCSI Ports VPD page length too short=%d\n", len);
return;
}
+ if (do_hex > 2) {
+ dStrHex((const char *)buff, len, -1);
+ return;
+ }
len -= 4;
ucp = buff + 4;
for (k = 0; k < len; k += bump, ucp += bump) {
@@ -2002,7 +2080,7 @@ decode_x_inq_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (do_hex) {
- dStrHex((const char *)buff, len, 0);
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
return;
}
printf(" SPT=%d GRD_CHK=%d APP_CHK=%d REF_CHK=%d\n",
@@ -2132,14 +2210,16 @@ decode_power_condition(unsigned char * buff, int len, int do_hex)
}
static void
-decode_b0_vpd(unsigned char * buff, int len, int do_hex, int pdt)
+decode_b0_vpd(unsigned char * buff, int len, int do_hex)
{
+ int pdt;
unsigned int u;
if (do_hex) {
dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
return;
}
+ pdt = 0x1f & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 16) {
@@ -2195,14 +2275,16 @@ decode_b0_vpd(unsigned char * buff, int len, int do_hex, int pdt)
/* VPD_BLOCK_DEV_CHARS sbc */
/* VPD_MAN_ASS_SN ssc */
static void
-decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
+decode_b1_vpd(unsigned char * buff, int len, int do_hex)
{
+ int pdt;
unsigned int u;
if (do_hex) {
dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
return;
}
+ pdt = 0x1f & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 64) {
@@ -2262,14 +2344,16 @@ decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
/* VPD_REFERRALS sbc */
static void
-decode_b3_vpd(unsigned char * buff, int len, int do_hex, int pdt)
+decode_b3_vpd(unsigned char * buff, int len, int do_hex)
{
+ int pdt;
unsigned int s, m;
if (do_hex) {
dStrHex((const char *)buff, len, (1 == do_hex) ? 0 : -1);
return;
}
+ pdt = 0x1f & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 0x10) {
@@ -2342,7 +2426,7 @@ static const char * failover_mode_arr[] =
};
static void
-decode_upr_vpd_c0_emc(unsigned char * buff, int len)
+decode_upr_vpd_c0_emc(unsigned char * buff, int len, int do_hex)
{
int k, ip_mgmt, vpp80, lun_z;
@@ -2350,6 +2434,10 @@ decode_upr_vpd_c0_emc(unsigned char * buff, int len)
pr2serr("EMC upr VPD page [0xc0]: length too short=%d\n", len);
return;
}
+ if (do_hex) {
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 1 : -1);
+ return;
+ }
if (buff[9] != 0x00) {
pr2serr("Unsupported page revision %d, decoding not possible.\n",
buff[9]);
@@ -2416,12 +2504,16 @@ decode_upr_vpd_c0_emc(unsigned char * buff, int len)
}
static void
-decode_rdac_vpd_c2(unsigned char * buff, int len)
+decode_rdac_vpd_c2(unsigned char * buff, int len, int do_hex)
{
if (len < 3) {
pr2serr("Software Version VPD page length too short=%d\n", len);
return;
}
+ if (do_hex) {
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 1 : -1);
+ return;
+ }
if (buff[4] != 's' && buff[5] != 'w' && buff[6] != 'r') {
pr2serr("Invalid page identifier %c%c%c%c, decoding "
"not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
@@ -2446,12 +2538,16 @@ decode_rdac_vpd_c2(unsigned char * buff, int len)
}
static void
-decode_rdac_vpd_c9(unsigned char * buff, int len)
+decode_rdac_vpd_c9(unsigned char * buff, int len, int do_hex)
{
if (len < 3) {
pr2serr("Volume Access Control VPD page length too short=%d\n", len);
return;
}
+ if (do_hex) {
+ dStrHex((const char *)buff, len, (1 == do_hex) ? 1 : -1);
+ return;
+ }
if (buff[4] != 'v' && buff[5] != 'a' && buff[6] != 'c') {
pr2serr("Invalid page identifier %c%c%c%c, decoding "
"not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
@@ -2496,32 +2592,27 @@ decode_rdac_vpd_c9(unsigned char * buff, int len)
static int
fetch_unit_serial_num(int sg_fd, char * obuff, int obuff_len, int verbose)
{
- int sz, len, k, res;
+ int len, k, res;
unsigned char b[DEF_ALLOC_LEN];
res = 0;
- sz = sizeof(b);
memset(b, 0xff, 4); /* guard against empty response */
/* first check if unit serial number VPD page is supported */
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_SUPPORTED_VPDS, b, sz, 0, verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, b, VPD_SUPPORTED_VPDS, 1, verbose,
+ &len);
if (0 == res) {
- if ((VPD_SUPPORTED_VPDS != b[1]) || (0x0 != b[2])) {
- if (verbose > 2)
- pr2serr("fetch_unit_serial_num: bad supported VPDs page\n");
- return SG_LIB_CAT_MALFORMED;
- }
- len = (b[2] << 8) + b[3]; /* spc4r25 */
+ len -= 4;
for (k = 0; k < len; ++k) {
if (VPD_UNIT_SERIAL_NUM == b[k + 4])
break;
}
if (k < len) {
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_UNIT_SERIAL_NUM,
- b, sz, 0, verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, b, VPD_UNIT_SERIAL_NUM, 1,
+ verbose, &len);
if (0 == res) {
- len = (b[2] << 8) + b[3]; /* spc4r25 */
+ len -= 4;
len = (len < (obuff_len - 1)) ? len : (obuff_len - 1);
- if ((VPD_UNIT_SERIAL_NUM == b[1]) && (len > 0)) {
+ if (len > 0) {
memcpy(obuff, b + 4, len);
obuff[len] = '\0';
return 0;
@@ -2743,14 +2834,14 @@ std_inq_process(int sg_fd, const struct opts_t * op)
rlen = (op->resp_len > 0) ? op->resp_len : SAFE_STD_INQ_RESP_LEN;
verb = op->do_verbose;
- res = ll_inquiry(sg_fd, 0, 0, 0, rsp_buff, rlen, &resid, 0, verb);
+ res = pt_inquiry(sg_fd, 0, 0, rsp_buff, rlen, &resid, 0, verb);
if (0 == res) {
len = rsp_buff[4] + 5;
if ((len > SAFE_STD_INQ_RESP_LEN) && (len < 256) &&
(0 == op->resp_len)) {
rlen = len;
memset(rsp_buff, 0, rlen);
- if (ll_inquiry(sg_fd, 0, 0, 0, rsp_buff, rlen, &resid, 1, verb)) {
+ if (pt_inquiry(sg_fd, 0, 0, rsp_buff, rlen, &resid, 1, verb)) {
pr2serr("second INQUIRY (%d byte) failed\n", len);
return SG_LIB_CAT_OTHER;
}
@@ -2941,58 +3032,82 @@ cmddt_process(int sg_fd, const struct opts_t * op)
#endif /* SG_SCSI_STRINGS */
+static int
+vpd_fetch_page_from_dev(int sg_fd, unsigned char * rp, int page,
+ int short_len, int vb, int * rlenp)
+{
+ int res, resid, rlen, len;
+
+ res = pt_inquiry(sg_fd, 1, page, rp, DEF_ALLOC_LEN, &resid, 1, vb);
+ if (res)
+ return res;
+ rlen = DEF_ALLOC_LEN - resid;
+ if (rlen < 4) {
+ pr2serr("VPD response too short (len=%d)\n", rlen);
+ return SG_LIB_CAT_MALFORMED;
+ }
+ if (page != rp[1]) {
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
+ return SG_LIB_CAT_MALFORMED;
+ }
+ if (short_len)
+ len = rp[3] + 4;
+ else
+ len = ((rp[2] << 8) + rp[3]) + 4;
+ if (len <= rlen) {
+ if (rlenp)
+ *rlenp = len;
+ return 0;
+ } else if ((len <= DEF_ALLOC_LEN) && short_len) {
+ if (rlenp)
+ *rlenp = rlen;
+ return 0;
+ }
+ if (len > MX_ALLOC_LEN) {
+ pr2serr("response length too long: %d > %d\n", len, MX_ALLOC_LEN);
+ return SG_LIB_CAT_MALFORMED;
+ } else {
+ res = pt_inquiry(sg_fd, 1, page, rp, len, &resid, 1, vb);
+ if (res)
+ return res;
+ rlen = len - resid;
+ /* assume it is well behaved: hence page and len still same */
+ if (rlenp)
+ *rlenp = rlen;
+ return 0;
+ }
+}
+
/* Returns 0 if successful */
static int
vpd_mainly_hex(int sg_fd, const struct opts_t * op)
{
- int res, len, num, k, peri_type, vpd;
+ int res, len;
+ char b[48];
const char * cp;
- char buff[48];
+ unsigned char * rp;
- memset(rsp_buff, 0, DEF_ALLOC_LEN);
- if (! op->do_raw)
+ rp = rsp_buff;
+ memset(rp, 0, DEF_ALLOC_LEN);
+ if ((! op->do_raw) && (op->do_hex < 2))
printf("VPD INQUIRY, page code=0x%.2x:\n", op->page_num);
- res = sg_ll_inquiry(sg_fd, 0, 1, op->page_num, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, op->page_num, 0, op->do_verbose,
+ &len);
if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (op->page_num != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, op->page_num, rsp_buff, len, 1,
- op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
+ dStrRaw((const char *)rp, len);
else {
- if (op->do_hex)
- dStrHex((const char *)rsp_buff, len,
- (1 == op->do_hex) ? 0 : -1);
- else if (0 == op->page_num) { /* decode this mandatory page */
- peri_type = rsp_buff[0] & 0x1f;
- printf(" [PQual=%d Peripheral device type: %s]\n",
- (rsp_buff[0] & 0xe0) >> 5,
- sg_get_pdt_str(peri_type, sizeof(buff), buff));
- printf(" Supported VPD pages:\n");
- num = rsp_buff[3];
- for (k = 0; k < num; ++k) {
- vpd = rsp_buff[4 + k];
- cp = get_vpd_page_str(vpd, peri_type);
- if (cp)
- printf(" 0x%x\t%s\n", vpd, cp);
- else
- printf(" 0x%x\n", vpd);
+ if (0 == op->page_num)
+ decode_supported_vpd(rp, len, op->do_hex);
+ else {
+ if (op->do_hex < 2) {
+ cp = sg_get_pdt_str(rp[0] & 0x1f, sizeof(b), b);
+ printf(" [PQual=%d Peripheral device type: %s]\n",
+ (rp[0] & 0xe0) >> 5, cp);
}
- } else
- dStrHex((const char *)rsp_buff, len, 0);
+ dStrHex((const char *)rp, len, ((1 == op->do_hex) ? 0 : -1));
+ }
}
} else {
if (SG_LIB_CAT_INVALID_OP == res)
@@ -3006,6 +3121,8 @@ vpd_mainly_hex(int sg_fd, const struct opts_t * op)
pr2serr(" inquiry: unit attention (?)\n");
else if (SG_LIB_CAT_ABORTED_COMMAND == res)
pr2serr(" inquiry: aborted command\n");
+ else if (SG_LIB_CAT_MALFORMED == res)
+ pr2serr(" inquiry: malformed response\n");
else
pr2serr(" inquiry: failed, res=%d\n", res);
}
@@ -3016,7 +3133,7 @@ vpd_mainly_hex(int sg_fd, const struct opts_t * op)
static int
vpd_response(const struct opts_t * op, int rlen)
{
- int len, pdt;
+ int len, pdt, pn;
unsigned char * rp;
const struct svpd_values_name_t * vnp;
@@ -3025,21 +3142,36 @@ vpd_response(const struct opts_t * op, int rlen)
pr2serr("INQUIRY VPD response too short\n");
return SG_LIB_CAT_MALFORMED;
}
- if (op->page_num != rp[1]) {
+ pn = op->page_num;
+ if (pn != rp[1]) {
if (op->page_arg) {
vnp = sdp_find_vpd_by_acron(op->page_arg);
if (vnp) {
- pr2serr("requested %s VPD page [0x%x]\n but FN is for page "
- "number 0x%x\n", vnp->name, vnp->value, rp[1]);
+ pr2serr("requested %s VPD page [0x%x]\n but --inhex is "
+ "for page number 0x%x\n", vnp->name, vnp->value,
+ rp[1]);
return SG_LIB_CAT_MALFORMED;
}
}
pr2serr("requested VPD page number [0x%x] differs from that in FN "
- "[0x%x]\n", op->page_num, rp[1]);
+ "[0x%x]\n", pn, rp[1]);
return SG_LIB_CAT_MALFORMED;
}
- switch (op->page_num) {
+ switch (pn) {
+ case VPD_SUPPORTED_VPDS:
+ if (! op->do_raw && ! op->do_export && (op->do_hex < 2))
+ printf("VPD INQUIRY: Supported VPD pages page\n");
+ len = ((rp[2] << 8) + rp[3]) + 4; /* spc4r25 */
+ if (len > rlen) {
+ pr2serr("truncated VPD page in inhex file (%s)\n", op->inhex_fn);
+ len = rlen;
+ }
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_supported_vpd(rp, len, op->do_hex);
+ break;
case VPD_UNIT_SERIAL_NUM:
if (! op->do_raw && ! op->do_export && (op->do_hex < 2))
printf("VPD INQUIRY: Unit serial number page\n");
@@ -3198,7 +3330,7 @@ vpd_response(const struct opts_t * op, int rlen)
if (op->do_raw)
dStrRaw((const char *)rp, len);
else
- decode_b0_vpd(rp, len, op->do_hex, pdt);
+ decode_b0_vpd(rp, len, op->do_hex);
break;
case 0xb1: /* VPD pages in B0h to BFh range depend on pdt */
pdt = rp[0] & 0x1f;
@@ -3232,7 +3364,7 @@ vpd_response(const struct opts_t * op, int rlen)
if (op->do_raw)
dStrRaw((const char *)rp, len);
else
- decode_b1_vpd(rp, len, op->do_hex, pdt);
+ decode_b1_vpd(rp, len, op->do_hex);
break;
case 0xb2: /* VPD pages in B0h to BFh range depend on pdt */
pr2serr(" Only hex output supported. sg_vpd decodes the B2h page.\n");
@@ -3257,7 +3389,7 @@ vpd_response(const struct opts_t * op, int rlen)
if (op->do_raw)
dStrRaw((const char *)rp, len);
else
- decode_b3_vpd(rp, len, op->do_hex, pdt);
+ decode_b3_vpd(rp, len, op->do_hex);
break;
case VPD_UPR_EMC: /* 0xc0 */
if (!op->do_raw && (op->do_hex < 2))
@@ -3269,10 +3401,8 @@ vpd_response(const struct opts_t * op, int rlen)
}
if (op->do_raw)
dStrRaw((const char *)rp, len);
- else if (op->do_hex)
- dStrHex((const char *)rp, len, (1 == op->do_hex) ? 1 : -1);
else
- decode_upr_vpd_c0_emc(rp, len);
+ decode_upr_vpd_c0_emc(rp, len, op->do_hex);
break;
case VPD_RDAC_VERS: /* 0xc2 */
if (!op->do_raw && (op->do_hex < 2))
@@ -3284,10 +3414,8 @@ vpd_response(const struct opts_t * op, int rlen)
}
if (op->do_raw)
dStrRaw((const char *)rp, len);
- else if (op->do_hex)
- dStrHex((const char *)rp, len, (1 == op->do_hex) ? 1 : -1);
else
- decode_rdac_vpd_c2(rp, len);
+ decode_rdac_vpd_c2(rp, len, op->do_hex);
break;
case VPD_RDAC_VAC: /* 0xc9 */
if (!op->do_raw && (op->do_hex < 2))
@@ -3299,10 +3427,8 @@ vpd_response(const struct opts_t * op, int rlen)
}
if (op->do_raw)
dStrRaw((const char *)rp, len);
- else if (op->do_hex)
- dStrHex((const char *)rp, len, (1 == op->do_hex) ? 1 : -1);
else
- decode_rdac_vpd_c9(rp, len);
+ decode_rdac_vpd_c9(rp, len, op->do_hex);
break;
case VPD_SCSI_PORTS:
if (!op->do_raw && (op->do_hex < 2))
@@ -3318,253 +3444,171 @@ vpd_response(const struct opts_t * op, int rlen)
decode_scsi_ports_vpd(rp, len, op->do_hex);
break;
default:
- printf(" Only hex output supported. sg_vpd and sdparm decode more "
- "VPD pages.\n");
- return SG_LIB_CAT_OTHER;
+ if ((pn > 0) && (pn < 0x80)) {
+ if (!op->do_raw && (op->do_hex < 2))
+ printf("VPD INQUIRY: ASCII information page, FRU code=0x%x\n",
+ pn);
+ len = ((rp[2] << 8) + rp[3]) + 4;
+ if (len > rlen) {
+ pr2serr("truncated VPD page in inhex file (%s)\n",
+ op->inhex_fn);
+ len = rlen;
+ }
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_ascii_inf(rp, len, op->do_hex);
+ } else {
+ pr2serr(" Only hex output supported. sg_vpd and sdparm decode "
+ "more VPD pages.\n");
+ return SG_LIB_CAT_OTHER;
+ }
}
return 0;
}
/* Returns 0 if successful */
static int
-decode_vpd(int sg_fd, const struct opts_t * op)
+vpd_get_and_decode(int sg_fd, const struct opts_t * op)
{
- int len, pdt;
+ int len, pdt, pn, vb;
int res = 0;
+ unsigned char * rp;
- switch (op->page_num) {
+ pn = op->page_num;
+ rp = rsp_buff;
+ vb = op->do_verbose;
+ switch (pn) {
+ case VPD_SUPPORTED_VPDS:
+ if (!op->do_raw && (op->do_hex < 2))
+ printf("VPD INQUIRY: Supported VPD pages page\n");
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else if (op->do_hex)
+ dStrHex((const char *)rp, len,
+ (1 == op->do_hex) ? 0 : -1);
+ else
+ decode_supported_vpd(rp, len, 0x1f & rp[0]);
+ break;
case VPD_UNIT_SERIAL_NUM:
if (! op->do_raw && ! op->do_export && (op->do_hex < 2))
printf("VPD INQUIRY: Unit serial number page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_UNIT_SERIAL_NUM, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
- if (VPD_UNIT_SERIAL_NUM != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else if (op->do_hex)
- dStrHex((const char *)rsp_buff, len,
- (1 == op->do_hex) ? 0 : -1);
- else {
- char obuff[DEF_ALLOC_LEN];
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else if (op->do_hex)
+ dStrHex((const char *)rp, len,
+ (1 == op->do_hex) ? 0 : -1);
+ else {
+ char obuff[DEF_ALLOC_LEN];
- memset(obuff, 0, sizeof(obuff));
- len -= 4;
- if (len >= (int)sizeof(obuff))
- len = sizeof(obuff) - 1;
- memcpy(obuff, rsp_buff + 4, len);
- if (op->do_export) {
- len = encode_whitespaces((unsigned char *)obuff, len);
- printf("SCSI_IDENT_SERIAL=%s\n", obuff);
- } else {
- printf(" Unit serial number: %s\n", obuff);
- }
+ memset(obuff, 0, sizeof(obuff));
+ len -= 4;
+ if (len >= (int)sizeof(obuff))
+ len = sizeof(obuff) - 1;
+ memcpy(obuff, rp + 4, len);
+ if (op->do_export) {
+ len = encode_whitespaces((unsigned char *)obuff, len);
+ printf("SCSI_IDENT_SERIAL=%s\n", obuff);
+ } else {
+ printf(" Unit serial number: %s\n", obuff);
}
}
break;
case VPD_DEVICE_ID:
if (! op->do_raw && ! op->do_export && (op->do_hex < 3))
printf("VPD INQUIRY: Device Identification page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_DEVICE_ID, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_DEVICE_ID != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_DEVICE_ID, rsp_buff, len,
- 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else if (op->do_hex > 2)
- dStrHex((const char *)rsp_buff, len, -1);
- else if (op->do_export) {
- if (len < 4) {
- pr2serr("Device identification page length too "
- "short=%d\n", len);
- } else {
- export_dev_ids(rsp_buff + 4, len - 4);
- }
- } else
- decode_id_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else if (op->do_hex > 2)
+ dStrHex((const char *)rp, len, -1);
+ else if (op->do_export)
+ export_dev_ids(rp + 4, len - 4);
+ else
+ decode_id_vpd(rp, len, op->do_hex);
break;
case VPD_SOFTW_INF_ID:
if (! op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Software interface identification page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_SOFTW_INF_ID, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
- if (VPD_SOFTW_INF_ID != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_softw_inf_id(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_softw_inf_id(rp, len, op->do_hex);
break;
case VPD_MAN_NET_ADDR:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Management network addresses page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_MAN_NET_ADDR, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_MAN_NET_ADDR != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_MAN_NET_ADDR, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_net_man_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_net_man_vpd(rp, len, op->do_hex);
break;
case VPD_MODE_PG_POLICY:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Mode page policy\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_MODE_PG_POLICY, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_MODE_PG_POLICY != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_MODE_PG_POLICY, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_mode_policy_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_mode_policy_vpd(rp, len, op->do_hex);
break;
case VPD_EXT_INQ:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: extended INQUIRY data page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_EXT_INQ, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_EXT_INQ != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_EXT_INQ, rsp_buff, len,
- 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_x_inq_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_x_inq_vpd(rp, len, op->do_hex);
break;
case VPD_ATA_INFO:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: ATA information page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_ATA_INFO, rsp_buff,
- VPD_ATA_INFO_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_ATA_INFO != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > VPD_ATA_INFO_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_ATA_INFO, rsp_buff, len,
- 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- /* format output for 'hdparm --Istdin' with '-rr' or '-HHH' */
- if ((2 == op->do_raw) || (3 == op->do_hex))
- dWordHex((const unsigned short *)(rsp_buff + 60),
- 256, -2, sg_is_big_endian());
- else if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_ata_info_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ /* format output for 'hdparm --Istdin' with '-rr' or '-HHH' */
+ if ((2 == op->do_raw) || (3 == op->do_hex))
+ dWordHex((const unsigned short *)(rp + 60), 256, -2,
+ sg_is_big_endian());
+ else if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_ata_info_vpd(rp, len, op->do_hex);
break;
case VPD_POWER_CONDITION:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Power condition page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_POWER_CONDITION, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_POWER_CONDITION != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_POWER_CONDITION, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_power_condition(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_power_condition(rp, len, op->do_hex);
break;
case 0xb0: /* VPD pages in B0h to BFh range depend on pdt */
- res = sg_ll_inquiry(sg_fd, 0, 1, 0xb0, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
if (0 == res) {
- pdt = rsp_buff[0] & 0x1f;
+ pdt = rp[0] & 0x1f;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -3582,33 +3626,17 @@ decode_vpd(int sg_fd, const struct opts_t * op)
break;
}
}
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (0xb0 != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, 0xb0, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
+ dStrRaw((const char *)rp, len);
else
- decode_b0_vpd(rsp_buff, len, op->do_hex, pdt);
+ decode_b0_vpd(rp, len, op->do_hex);
} else if (! op->do_raw)
- printf("VPD INQUIRY: page=0xb0\n");
+ pr2serr("VPD INQUIRY: page=0xb0\n");
break;
case 0xb1: /* VPD pages in B0h to BFh range depend on pdt */
- res = sg_ll_inquiry(sg_fd, 0, 1, 0xb1, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
if (0 == res) {
- pdt = rsp_buff[0] & 0x1f;
+ pdt = rp[0] & 0x1f;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -3631,36 +3659,22 @@ decode_vpd(int sg_fd, const struct opts_t * op)
break;
}
}
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (0xb1 != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, 0xb1, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
+ dStrRaw((const char *)rp, len);
else
- decode_b1_vpd(rsp_buff, len, op->do_hex, pdt);
+ decode_b1_vpd(rp, len, op->do_hex);
} else if (! op->do_raw)
- printf("VPD INQUIRY: page=0xb1\n");
+ pr2serr("VPD INQUIRY: page=0xb1\n");
break;
case 0xb2: /* VPD pages in B0h to BFh range depend on pdt */
- printf(" Only hex output supported. sg_vpd decodes the B2h page.\n");
+ if (!op->do_raw && (op->do_hex < 2))
+ pr2serr(" Only hex output supported. sg_vpd decodes the B2h "
+ "page.\n");
return vpd_mainly_hex(sg_fd, op);
case 0xb3: /* VPD pages in B0h to BFh range depend on pdt */
- res = sg_ll_inquiry(sg_fd, 0, 1, 0xb3, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
if (0 == res) {
- pdt = rsp_buff[0] & 0x1f;
+ pdt = rp[0] & 0x1f;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -3671,147 +3685,75 @@ decode_vpd(int sg_fd, const struct opts_t * op)
break;
}
}
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (0xb3 != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, 0xb3, rsp_buff,
- len, 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
+ dStrRaw((const char *)rp, len);
else
- decode_b3_vpd(rsp_buff, len, op->do_hex, pdt);
+ decode_b3_vpd(rp, len, op->do_hex);
} else if (! op->do_raw)
- printf("VPD INQUIRY: page=0xb3\n");
+ pr2serr("VPD INQUIRY: page=0xb3\n");
break;
case VPD_UPR_EMC: /* 0xc0 */
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Unit Path Report Page (EMC)\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_UPR_EMC, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = rsp_buff[3] + 4;
- if (VPD_UPR_EMC != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably not "
- "supported\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_UPR_EMC, rsp_buff, len, 1,
- op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else if (op->do_hex)
- dStrHex((const char *)rsp_buff, len,
- (1 == op->do_hex) ? 1 : -1);
- else
- decode_upr_vpd_c0_emc(rsp_buff, len);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 1, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_upr_vpd_c0_emc(rp, len, op->do_hex);
break;
case VPD_RDAC_VERS: /* 0xc2 */
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Software Version (RDAC)\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_RDAC_VERS, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = rsp_buff[3] + 4;
- if (VPD_RDAC_VERS != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably not supported\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_RDAC_VERS, rsp_buff, len, 1,
- op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else if (op->do_hex)
- dStrHex((const char *)rsp_buff, len,
- (1 == op->do_hex) ? 1 : -1);
- else
- decode_rdac_vpd_c2(rsp_buff, len);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 1, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_rdac_vpd_c2(rp, len, op->do_hex);
break;
case VPD_RDAC_VAC: /* 0xc9 */
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Volume Access Control (RDAC)\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_RDAC_VAC, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = rsp_buff[3] + 4;
- if (VPD_RDAC_VAC != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably not supported\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_RDAC_VAC, rsp_buff, len, 1,
- op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else if (op->do_hex)
- dStrHex((const char *)rsp_buff, len,
- (1 == op->do_hex) ? 1 : -1);
- else
- decode_rdac_vpd_c9(rsp_buff, len);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 1, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_rdac_vpd_c9(rp, len, op->do_hex);
break;
case VPD_SCSI_PORTS:
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: SCSI Ports page\n");
- res = sg_ll_inquiry(sg_fd, 0, 1, VPD_SCSI_PORTS, rsp_buff,
- DEF_ALLOC_LEN, 1, op->do_verbose);
- if (0 == res) {
- len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
- if (VPD_SCSI_PORTS != rsp_buff[1]) {
- pr2serr("invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
- return SG_LIB_CAT_MALFORMED;
- }
- if (len > MX_ALLOC_LEN) {
- pr2serr("response length too long: %d > %d\n", len,
- MX_ALLOC_LEN);
- return SG_LIB_CAT_MALFORMED;
- } else if (len > DEF_ALLOC_LEN) {
- if (sg_ll_inquiry(sg_fd, 0, 1, VPD_SCSI_PORTS, rsp_buff, len,
- 1, op->do_verbose))
- return SG_LIB_CAT_OTHER;
- }
- if (op->do_raw)
- dStrRaw((const char *)rsp_buff, len);
- else
- decode_scsi_ports_vpd(rsp_buff, len, op->do_hex);
- }
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_scsi_ports_vpd(rp, len, op->do_hex);
break;
default:
- printf(" Only hex output supported. sg_vpd and sdparm decode more "
- "VPD pages.\n");
- return vpd_mainly_hex(sg_fd, op);
+ if ((pn > 0) && (pn < 0x80)) {
+ if (!op->do_raw && (op->do_hex < 2))
+ printf("VPD INQUIRY: ASCII information page, FRU code=0x%x\n",
+ pn);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, 0, vb, &len);
+ if (0 == res) {
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else
+ decode_ascii_inf(rp, len, op->do_hex);
+ }
+ } else {
+ if (op->do_hex < 2)
+ pr2serr(" Only hex output supported. sg_vpd and sdparm "
+ "decode more VPD pages.\n");
+ return vpd_mainly_hex(sg_fd, op);
+ }
}
if (res) {
if (SG_LIB_CAT_INVALID_OP == res)
@@ -3825,6 +3767,8 @@ decode_vpd(int sg_fd, const struct opts_t * op)
pr2serr(" inquiry: unit attention (?)\n");
else if (SG_LIB_CAT_ABORTED_COMMAND == res)
pr2serr(" inquiry: aborted command\n");
+ else if (SG_LIB_CAT_MALFORMED == res)
+ pr2serr(" inquiry: malformed response\n");
else
pr2serr(" inquiry: failed, res=%d\n", res);
}
@@ -3837,6 +3781,7 @@ main(int argc, char * argv[])
{
int sg_fd, res, n;
int ret = 0;
+ int inhex_len = 0;
const struct svpd_values_name_t * vnp;
struct opts_t opts;
struct opts_t * op;
@@ -3928,6 +3873,45 @@ main(int argc, char * argv[])
op->page_num = n;
}
}
+ if (op->inhex_fn) {
+ if (op->device_name) {
+ pr2serr("Cannot have both a DEVICE and --inhex= option\n");
+ return SG_LIB_SYNTAX_ERROR;
+ }
+ if (op->do_cmddt) {
+ pr2serr("Don't support --cmddt with --inhex= option\n");
+ return SG_LIB_SYNTAX_ERROR;
+ }
+ if (f2hex_arr(op->inhex_fn, 0, rsp_buff, &inhex_len,
+ sizeof(rsp_buff)))
+ return SG_LIB_FILE_ERROR;
+ if (-1 == op->page_num) { /* may be able to deduce VPD page */
+ if ((0x2 == (0xf & rsp_buff[3])) && (rsp_buff[2] > 2)) {
+ if (op->do_verbose)
+ pr2serr("Guessing from --inhex= this is a standard "
+ "INQUIRY\n");
+ if (op->page_pdt < 0)
+ op->page_pdt = 0x1f & rsp_buff[0];
+ } else if (rsp_buff[2] < 2) {
+ if (op->do_verbose)
+ pr2serr("Guessing from --inhex this is VPD page 0x%x\n",
+ rsp_buff[1]);
+ op->page_num = rsp_buff[1];
+ if (op->page_pdt < 0)
+ op->page_pdt = 0x1f & rsp_buff[0];
+ ++op->do_decode;
+ ++op->do_vpd;
+ } else {
+ if (op->do_verbose)
+ pr2serr("page number unclear from --inhex, hope it's a "
+ "standard INQUIRY\n");
+ }
+ }
+ } else if (0 == op->device_name) {
+ pr2serr("No DEVICE argument given\n");
+ usage_for(op);
+ return SG_LIB_SYNTAX_ERROR;
+ }
if (op->do_export) {
if (op->page_num != -1) {
if (op->page_num != VPD_DEVICE_ID &&
@@ -3985,32 +3969,18 @@ main(int argc, char * argv[])
return SG_LIB_SYNTAX_ERROR;
}
- if (op->inhex_fn) {
- if (op->device_name) {
- pr2serr("Cannot have both a DEVICE and --inhex= option\n");
- return SG_LIB_SYNTAX_ERROR;
- }
- if (op->do_cmddt) {
- pr2serr("Don't support --cmddt with --inhex= option\n");
- return SG_LIB_SYNTAX_ERROR;
- }
- if (f2hex_arr(op->inhex_fn, 0, rsp_buff, &n, sizeof(rsp_buff)))
- return SG_LIB_FILE_ERROR;
- if (op->do_vpd)
- return vpd_response(op, n);
- else
- return std_inq_response(op, n);
- } else if (0 == op->device_name) {
- pr2serr("No DEVICE argument given\n");
- usage_for(op);
- return SG_LIB_SYNTAX_ERROR;
- }
if (op->do_raw) {
if (sg_set_binary_mode(STDOUT_FILENO) < 0) {
perror("sg_set_binary_mode");
return SG_LIB_FILE_ERROR;
}
}
+ if (op->inhex_fn) {
+ if (op->do_vpd)
+ return vpd_response(op, inhex_len);
+ else
+ return std_inq_response(op, inhex_len);
+ }
#if defined(O_NONBLOCK) && defined(O_RDONLY)
if (op->do_block >= 0) {
@@ -4067,7 +4037,7 @@ main(int argc, char * argv[])
goto err_out;
} else if (op->do_vpd) {
if (op->do_decode) {
- ret = decode_vpd(sg_fd, op);
+ ret = vpd_get_and_decode(sg_fd, op);
if (ret)
goto err_out;
} else {
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index cee9a669..943adca5 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -9,6 +9,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -30,7 +31,7 @@
*/
-static const char * version_str = "0.78 20140213"; /* spc4r36 + sbc3r35 */
+static const char * version_str = "0.79 20140215"; /* spc4r36 + sbc3r35 */
/* And with sbc3r35, vale Mark Evans */
void svpd_enumerate_vendor(void);
@@ -180,17 +181,36 @@ static struct svpd_values_name_t standard_vpd_pg[] = {
{0, 0, 0, NULL, NULL},
};
+
+#ifdef __GNUC__
+static int pr2serr(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2serr(const char * fmt, ...);
+#endif
+
+
+static int
+pr2serr(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
static void
usage()
{
- fprintf(stderr,
- "Usage: sg_vpd [--enumerate] [--help] [--hex] [--ident] "
+ pr2serr("Usage: sg_vpd [--enumerate] [--help] [--hex] [--ident] "
"[--long]\n"
" [--maxlen=LEN] [--page=PG] [--quiet] [--raw] "
"[--verbose]\n"
" [--version] DEVICE\n");
- fprintf(stderr,
- " where:\n"
+ pr2serr(" where:\n"
" --enumerate|-e enumerate known VPD pages names (ignore "
"DEVICE),\n"
" can be used with --page=num to search\n"
@@ -352,8 +372,7 @@ decode_std_inq(unsigned char * b, int len, int verbose)
return;
n = b[4] + 5;
if (verbose)
- fprintf(stderr, ">> requested %d bytes, %d bytes available\n",
- len, n);
+ pr2serr(">> requested %d bytes, %d bytes available\n", len, n);
printf(" SCCS=%d ACC=%d TPGS=%d 3PC=%d Protect=%d ",
!!(b[5] & 0x80), !!(b[5] & 0x40), ((b[5] & 0x30) >> 4),
!!(b[5] & 0x08), !!(b[5] & 0x01));
@@ -391,8 +410,7 @@ decode_id_vpd(unsigned char * buff, int len, int subvalue, int do_long,
int m_a, m_d, m_cs;
if (len < 4) {
- fprintf(stderr, "Device identification VPD page length too "
- "short=%d\n", len);
+ pr2serr("Device identification VPD page length too short=%d\n", len);
return;
}
m_a = -1;
@@ -452,8 +470,8 @@ decode_net_man_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (len < 4) {
- fprintf(stderr, "Management network addresses VPD page length too "
- "short=%d\n", len);
+ pr2serr("Management network addresses VPD page length too short=%d\n",
+ len);
return;
}
len -= 4;
@@ -465,7 +483,7 @@ decode_net_man_vpd(unsigned char * buff, int len, int do_hex)
na_len = (ucp[2] << 8) + ucp[3];
bump = 4 + na_len;
if ((k + bump) > len) {
- fprintf(stderr, "Management network addresses VPD page, short "
+ pr2serr("Management network addresses VPD page, short "
"descriptor length=%d, left=%d\n", bump, (len - k));
return;
}
@@ -499,8 +517,7 @@ decode_mode_policy_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (len < 4) {
- fprintf(stderr, "Mode page policy VPD page length too short=%d\n",
- len);
+ pr2serr("Mode page policy VPD page length too short=%d\n", len);
return;
}
len -= 4;
@@ -508,7 +525,7 @@ decode_mode_policy_vpd(unsigned char * buff, int len, int do_hex)
for (k = 0; k < len; k += bump, ucp += bump) {
bump = 4;
if ((k + bump) > len) {
- fprintf(stderr, "Mode page policy VPD page, short "
+ pr2serr("Mode page policy VPD page, short "
"descriptor length=%d, left=%d\n", bump, (len - k));
return;
}
@@ -539,7 +556,7 @@ decode_scsi_ports_vpd(unsigned char * buff, int len, int do_hex, int do_long,
return;
}
if (len < 4) {
- fprintf(stderr, "SCSI Ports VPD page length too short=%d\n", len);
+ pr2serr("SCSI Ports VPD page length too short=%d\n", len);
return;
}
len -= 4;
@@ -550,7 +567,7 @@ decode_scsi_ports_vpd(unsigned char * buff, int len, int do_hex, int do_long,
ip_tid_len = (ucp[6] << 8) + ucp[7];
bump = 8 + ip_tid_len;
if ((k + bump) > len) {
- fprintf(stderr, "SCSI Ports VPD page, short descriptor "
+ pr2serr("SCSI Ports VPD page, short descriptor "
"length=%d, left=%d\n", bump, (len - k));
return;
}
@@ -563,7 +580,7 @@ decode_scsi_ports_vpd(unsigned char * buff, int len, int do_hex, int do_long,
}
tpd_len = (ucp[bump + 2] << 8) + ucp[bump + 3];
if ((k + bump + tpd_len + 4) > len) {
- fprintf(stderr, "SCSI Ports VPD page, short descriptor(tgt) "
+ pr2serr("SCSI Ports VPD page, short descriptor(tgt) "
"length=%d, left=%d\n", bump, (len - k));
return;
}
@@ -644,8 +661,8 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
ucp = buff + off;
i_len = ucp[3];
if ((off + i_len + 4) > len) {
- fprintf(stderr, " VPD page error: designator length longer "
- "than\n remaining response length=%d\n", (len - off));
+ pr2serr(" VPD page error: designator length longer than\n"
+ " remaining response length=%d\n", (len - off));
return SG_LIB_CAT_MALFORMED;
}
ip = ucp + 4;
@@ -663,7 +680,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
break;
case 2: /* EUI-64 based */
if ((8 != i_len) && (12 != i_len) && (16 != i_len))
- fprintf(stderr, " << expect 8, 12 and 16 byte "
+ pr2serr(" << expect 8, 12 and 16 byte "
"EUI, got %d>>\n", i_len);
printf("0x");
for (m = 0; m < i_len; ++m)
@@ -672,20 +689,19 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
break;
case 3: /* NAA */
if (1 != c_set) {
- fprintf(stderr, " << unexpected code set %d for "
- "NAA>>\n", c_set);
+ pr2serr(" << unexpected code set %d for NAA>>\n", c_set);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
naa = (ip[0] >> 4) & 0xff;
if ((naa < 2) || (naa > 6) || (4 == naa)) {
- fprintf(stderr, " << unexpected NAA [0x%x]>>\n", naa);
+ pr2serr(" << unexpected NAA [0x%x]>>\n", naa);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
if (2 == naa) { /* NAA IEEE extended */
if (8 != i_len) {
- fprintf(stderr, " << unexpected NAA 2 identifier "
+ pr2serr(" << unexpected NAA 2 identifier "
"length: 0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
@@ -697,7 +713,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
} else if ((3 == naa) || (5 == naa)) {
/* NAA=3 Locally assigned; NAA=5 IEEE Registered */
if (8 != i_len) {
- fprintf(stderr, " << unexpected NAA 3 or 5 "
+ pr2serr(" << unexpected NAA 3 or 5 "
"identifier length: 0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
@@ -724,8 +740,8 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
}
} else if (6 == naa) { /* NAA IEEE registered extended */
if (16 != i_len) {
- fprintf(stderr, " << unexpected NAA 6 identifier "
- "length: 0x%x>>\n", i_len);
+ pr2serr(" << unexpected NAA 6 identifier length: "
+ "0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -756,7 +772,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
break;
case 8: /* SCSI name string */
if (3 != c_set) {
- fprintf(stderr, " << expected UTF-8 code_set>>\n");
+ pr2serr(" << expected UTF-8 code_set>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -779,8 +795,7 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc,
printf("\n");
}
if (-2 == u) {
- fprintf(stderr, "VPD page error: short designator around "
- "offset %d\n", off);
+ pr2serr("VPD page error: short designator around offset %d\n", off);
return SG_LIB_CAT_MALFORMED;
}
return 0;
@@ -817,7 +832,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
if (k)
printf(" vendor specific: %.*s\n", i_len, ip);
else {
- fprintf(stderr, " vendor specific:\n");
+ pr2serr(" vendor specific:\n");
dStrHexErr((const char *)ip, i_len, 0);
}
break;
@@ -837,8 +852,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
case 2: /* EUI-64 based */
if (! long_out) {
if ((8 != i_len) && (12 != i_len) && (16 != i_len)) {
- fprintf(stderr, " << expect 8, 12 and 16 byte "
- "EUI, got %d>>\n", i_len);
+ pr2serr(" << expect 8, 12 and 16 byte EUI, got %d>>\n",
+ i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -850,7 +865,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");
+ pr2serr(" << expected binary code_set (1)>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -865,8 +880,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
}
printf(" Identifier extension: 0x%" PRIx64 "\n", id_ext);
} else if ((8 != i_len) && (12 != i_len)) {
- fprintf(stderr, " << can only decode 8, 12 and 16 "
- "byte ids>>\n");
+ pr2serr(" << can only decode 8, 12 and 16 byte ids>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -889,8 +903,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 3: /* NAA <n> */
if (1 != c_set) {
- fprintf(stderr, " << unexpected code set %d for "
- "NAA>>\n", c_set);
+ pr2serr(" << unexpected code set %d for NAA>>\n", c_set);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -898,8 +911,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
switch (naa) {
case 2: /* NAA 2: IEEE Extended */
if (8 != i_len) {
- fprintf(stderr, " << unexpected NAA 2 identifier "
- "length: 0x%x>>\n", i_len);
+ pr2serr(" << unexpected NAA 2 identifier length: "
+ "0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -923,8 +936,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 3: /* NAA 3: Locally assigned */
if (8 != i_len) {
- fprintf(stderr, " << unexpected NAA 3 identifier "
- "length: 0x%x>>\n", i_len);
+ pr2serr(" << unexpected NAA 3 identifier length: "
+ "0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -937,8 +950,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 5: /* NAA 5: IEEE Registered */
if (8 != i_len) {
- fprintf(stderr, " << unexpected NAA 5 identifier "
- "length: 0x%x>>\n", i_len);
+ pr2serr(" << unexpected NAA 5 identifier length: "
+ "0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -966,8 +979,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 6: /* NAA 6: IEEE Registered extended */
if (16 != i_len) {
- fprintf(stderr, " << unexpected NAA 6 identifier "
- "length: 0x%x>>\n", i_len);
+ pr2serr(" << unexpected NAA 6 identifier length: "
+ "0x%x>>\n", i_len);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1002,15 +1015,15 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
}
break;
default:
- fprintf(stderr, " << unexpected NAA [0x%x]>>\n", naa);
+ pr2serr(" << unexpected NAA [0x%x]>>\n", naa);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
break;
case 4: /* Relative target port */
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
- fprintf(stderr, " << expected binary code_set, target "
- "port association, length 4>>\n");
+ pr2serr(" << expected binary code_set, target port "
+ "association, length 4>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1019,8 +1032,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 5: /* (primary) Target port group */
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
- fprintf(stderr, " << expected binary code_set, target "
- "port association, length 4>>\n");
+ pr2serr(" << expected binary code_set, target port "
+ "association, length 4>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1029,8 +1042,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 6: /* Logical unit group */
if ((1 != c_set) || (0 != assoc) || (4 != i_len)) {
- fprintf(stderr, " << expected binary code_set, logical "
- "unit association, length 4>>\n");
+ pr2serr(" << expected binary code_set, logical unit "
+ "association, length 4>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1039,8 +1052,8 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 7: /* MD5 logical unit identifier */
if ((1 != c_set) || (0 != assoc)) {
- fprintf(stderr, " << expected binary code_set, logical "
- "unit association>>\n");
+ pr2serr(" << expected binary code_set, logical unit "
+ "association>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1049,7 +1062,7 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 8: /* SCSI name string */
if (3 != c_set) {
- fprintf(stderr, " << expected UTF-8 code_set>>\n");
+ pr2serr(" << expected UTF-8 code_set>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1076,13 +1089,13 @@ 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
- fprintf(stderr, " >>>> unexpected protocol indentifier: %s\n"
- " with Protocol specific port "
- "identifier\n",
- sg_get_trans_proto_str(p_id, sizeof(b), b));
+ pr2serr(" >>>> unexpected protocol indentifier: %s\n"
+ " with Protocol specific port "
+ "identifier\n",
+ sg_get_trans_proto_str(p_id, sizeof(b), b));
break;
default: /* reserved */
- fprintf(stderr, " reserved designator=0x%x\n", desig_type);
+ pr2serr(" reserved designator=0x%x\n", desig_type);
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -1115,8 +1128,8 @@ decode_dev_ids(const char * print_if_found, unsigned char * buff, int len,
ucp = buff + off;
i_len = ucp[3];
if ((off + i_len + 4) > len) {
- fprintf(stderr, " VPD page error: designator length longer "
- "than\n remaining response length=%d\n", (len - off));
+ pr2serr(" VPD page error: designator length longer than\n"
+ " remaining response length=%d\n", (len - off));
return SG_LIB_CAT_MALFORMED;
}
assoc = ((ucp[1] >> 4) & 0x3);
@@ -1134,8 +1147,7 @@ decode_dev_ids(const char * print_if_found, unsigned char * buff, int len,
desig_type, long_out, 0);
}
if (-2 == u) {
- fprintf(stderr, "VPD page error: short designator around "
- "offset %d\n", off);
+ pr2serr("VPD page error: short designator around offset %d\n", off);
return SG_LIB_CAT_MALFORMED;
}
return 0;
@@ -1207,8 +1219,7 @@ 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 {
- fprintf(stderr, " [Unexpected format code: %d]\n",
- format_code);
+ pr2serr(" [Unexpected format code: %d]\n", format_code);
dStrHexErr((const char *)ucp, num + 4, 0);
}
bump = (((num + 4) < 24) ? 24 : num + 4);
@@ -1250,20 +1261,19 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len)
if (0 == format_code)
printf("Routing ID: 0x%x\n", num);
else {
- fprintf(stderr, " [Unexpected format code: %d]\n",
- format_code);
+ pr2serr(" [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);
+ pr2serr("%s No specified protocol\n", leadin);
/* 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);
+ pr2serr("%s unknown protocol id=0x%x format_code=%d\n", leadin,
+ proto_id, format_code);
dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), 0);
bump = 24;
break;
@@ -1279,8 +1289,7 @@ decode_x_inq_vpd(unsigned char * b, int len, int do_hex, int do_long,
int n;
if (len < 7) {
- fprintf(stderr, "Extended INQUIRY data VPD page length too "
- "short=%d\n", len);
+ pr2serr("Extended INQUIRY data VPD page length too short=%d\n", len);
return;
}
if (do_hex) {
@@ -1399,8 +1408,7 @@ decode_ata_info_vpd(unsigned char * buff, int len, int do_long, int do_hex)
const char * cp;
if (len < 36) {
- fprintf(stderr, "ATA information VPD page length too "
- "short=%d\n", len);
+ pr2serr("ATA information VPD page length too short=%d\n", len);
return;
}
if (do_hex && (2 != do_hex)) {
@@ -1458,8 +1466,7 @@ static void
decode_power_condition(unsigned char * buff, int len, int do_hex)
{
if (len < 18) {
- fprintf(stderr, "Power condition VPD page length too short=%d\n",
- len);
+ pr2serr("Power condition VPD page length too short=%d\n", len);
return;
}
if (do_hex) {
@@ -1508,8 +1515,7 @@ decode_power_consumption_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (len < 4) {
- fprintf(stderr, "Power consumption VPD page length too short=%d\n",
- len);
+ pr2serr("Power consumption VPD page length too short=%d\n", len);
return;
}
len -= 4;
@@ -1517,8 +1523,8 @@ decode_power_consumption_vpd(unsigned char * buff, int len, int do_hex)
for (k = 0; k < len; k += bump, ucp += bump) {
bump = 4;
if ((k + bump) > len) {
- fprintf(stderr, "Power consumption VPD page, short "
- "descriptor length=%d, left=%d\n", bump, (len - k));
+ pr2serr("Power consumption VPD page, short descriptor "
+ "length=%d, left=%d\n", bump, (len - k));
return;
}
if (do_hex > 1)
@@ -1641,8 +1647,7 @@ decode_3party_copy_vpd(unsigned char * buff, int len, int do_hex, int verbose)
char b[80];
if (len < 4) {
- fprintf(stderr, "Third-party Copy VPD page length too short=%d\n",
- len);
+ pr2serr("Third-party Copy VPD page length too short=%d\n", len);
return;
}
len -= 4;
@@ -1654,9 +1659,8 @@ decode_3party_copy_vpd(unsigned char * buff, int len, int do_hex, int verbose)
printf("Descriptor type=%d, len %d\n", desc_type, desc_len);
bump = 4 + desc_len;
if ((k + bump) > len) {
- fprintf(stderr, "Third-party Copy VPD "
- "page, short descriptor length=%d, left=%d\n", bump,
- (len - k));
+ pr2serr("Third-party Copy VPD page, short descriptor length=%d, "
+ "left=%d\n", bump, (len - k));
return;
}
if (0 == desc_len)
@@ -1792,7 +1796,7 @@ decode_3party_copy_vpd(unsigned char * buff, int len, int do_hex, int verbose)
printf(" Held Data Granularity: %" PRIu64 "\n", ull);
break;
default:
- fprintf(stderr, "Unexpected type=%d\n", desc_type);
+ pr2serr("Unexpected type=%d\n", desc_type);
dStrHexErr((const char *)ucp, bump, 1);
break;
}
@@ -1812,8 +1816,8 @@ decode_proto_lu_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (len < 4) {
- fprintf(stderr, "Protocol-specific logical unit information VPD "
- "page length too short=%d\n", len);
+ pr2serr("Protocol-specific logical unit information VPD page length "
+ "too short=%d\n", len);
return;
}
len -= 4;
@@ -1825,9 +1829,8 @@ decode_proto_lu_vpd(unsigned char * buff, int len, int do_hex)
desc_len = (ucp[6] << 8) + ucp[7];
bump = 8 + desc_len;
if ((k + bump) > len) {
- fprintf(stderr, "Protocol-specific logical unit information VPD "
- "page, short descriptor length=%d, left=%d\n", bump,
- (len - k));
+ pr2serr("Protocol-specific logical unit information VPD page, "
+ "short descriptor length=%d, left=%d\n", bump, (len - k));
return;
}
if (0 == desc_len)
@@ -1843,7 +1846,7 @@ decode_proto_lu_vpd(unsigned char * buff, int len, int do_hex)
printf(" TLR control supported: %d\n", !!(ucp[8] & 0x1));
break;
default:
- fprintf(stderr, "Unexpected proto=%d\n", proto);
+ pr2serr("Unexpected proto=%d\n", proto);
dStrHexErr((const char *)ucp, bump, 1);
break;
}
@@ -1864,8 +1867,8 @@ decode_proto_port_vpd(unsigned char * buff, int len, int do_hex)
return;
}
if (len < 4) {
- fprintf(stderr, "Protocol-specific port information VPD "
- "page length too short=%d\n", len);
+ pr2serr("Protocol-specific port information VPD page length too "
+ "short=%d\n", len);
return;
}
len -= 4;
@@ -1877,9 +1880,8 @@ decode_proto_port_vpd(unsigned char * buff, int len, int do_hex)
desc_len = (ucp[6] << 8) + ucp[7];
bump = 8 + desc_len;
if ((k + bump) > len) {
- fprintf(stderr, "Protocol-specific port VPD "
- "page, short descriptor length=%d, left=%d\n", bump,
- (len - k));
+ pr2serr("Protocol-specific port VPD page, short descriptor "
+ "length=%d, left=%d\n", bump, (len - k));
return;
}
if (0 == desc_len)
@@ -1898,7 +1900,7 @@ decode_proto_port_vpd(unsigned char * buff, int len, int do_hex)
pidp[1], (0x1 & pidp[2]));
break;
default:
- fprintf(stderr, "Unexpected proto=%d\n", proto);
+ pr2serr("Unexpected proto=%d\n", proto);
dStrHexErr((const char *)ucp, bump, 1);
break;
}
@@ -1919,10 +1921,9 @@ decode_b0_vpd(unsigned char * buff, int len, int do_hex, int pdt)
return;
}
switch (pdt) {
- case 0: case 4: case 7: /* Block limits */
+ case PDT_DISK: case PDT_WO: case PDT_OPTICAL: /* Block limits */
if (len < 16) {
- fprintf(stderr, "Block limits VPD page length too "
- "short=%d\n", len);
+ pr2serr("Block limits VPD page length too short=%d\n", len);
return;
}
printf(" Write same no zero (WSNZ): %d\n", !!(buff[4] & 0x1));
@@ -1973,12 +1974,12 @@ decode_b0_vpd(unsigned char * buff, int len, int do_hex, int pdt)
mwsl);
}
break;
- case 1: case 8:
+ case PDT_TAPE: case PDT_MCHANGER:
printf(" WORM=%d\n", !!(buff[4] & 0x1));
break;
- case 0x11:
+ case PDT_OSD:
default:
- fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ pr2serr(" Unable to decode pdt=0x%x, in hex:\n", pdt);
dStrHexErr((const char *)buff, len, 0);
break;
}
@@ -2011,8 +2012,8 @@ decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 64) {
- fprintf(stderr, "Block device characteristics VPD page length "
- "too short=%d\n", len);
+ pr2serr("Block device characteristics VPD page length too "
+ "short=%d\n", len);
return;
}
u = (buff[4] << 8) | buff[5];
@@ -2067,7 +2068,7 @@ decode_b1_vpd(unsigned char * buff, int len, int do_hex, int pdt)
len - 4, buff + 4);
break;
default:
- fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ pr2serr(" Unable to decode pdt=0x%x, in hex:\n", pdt);
dStrHexErr((const char *)buff, len, 0);
break;
}
@@ -2080,8 +2081,7 @@ decode_block_lb_prov_vpd(unsigned char * b, int len)
int dp;
if (len < 4) {
- fprintf(stderr, "Logical block provisioning page too short=%d\n",
- len);
+ pr2serr("Logical block provisioning page too short=%d\n", len);
return SG_LIB_CAT_MALFORMED;
}
printf(" Unmap command supported (LBPU): %d\n", !!(0x80 & b[5]));
@@ -2103,8 +2103,8 @@ decode_block_lb_prov_vpd(unsigned char * b, int len)
ucp = b + 8;
i_len = ucp[3];
if (0 == i_len) {
- fprintf(stderr, "Logical block provisioning page provisioning "
- "group descriptor too short=%d\n", i_len);
+ pr2serr("Logical block provisioning page provisioning group "
+ "descriptor too short=%d\n", i_len);
return 0;
}
printf(" Provisioning group descriptor\n");
@@ -2124,8 +2124,7 @@ static int
decode_tapealert_supported_vpd(unsigned char * b, int len)
{
if (len < 12) {
- fprintf(stderr, "TapeAlert supported flags length too short=%d\n",
- len);
+ pr2serr("TapeAlert supported flags length too short=%d\n", len);
return SG_LIB_CAT_MALFORMED;
}
printf(" Flag01h: %d 02h: %d 03h: %d 04h: %d 05h: %d 06h: %d "
@@ -2180,7 +2179,7 @@ decode_b2_vpd(unsigned char * buff, int len, int do_hex, int pdt)
decode_tapealert_supported_vpd(buff, len);
break;
default:
- fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ pr2serr(" Unable to decode pdt=0x%x, in hex:\n", pdt);
dStrHexErr((const char *)buff, len, 0);
break;
}
@@ -2201,7 +2200,7 @@ decode_b3_vpd(unsigned char * b, int len, int do_hex, int pdt)
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 16) {
- fprintf(stderr, "Referrals VPD page length too short=%d\n", len);
+ pr2serr("Referrals VPD page length too short=%d\n", len);
break;
}
u = ((unsigned int)b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11];
@@ -2219,7 +2218,7 @@ decode_b3_vpd(unsigned char * b, int len, int do_hex, int pdt)
printf(" Automation device serial number: %s\n", obuff);
break;
default:
- fprintf(stderr, " Unable to decode pdt=0x%x, in hex:\n", pdt);
+ pr2serr(" Unable to decode pdt=0x%x, in hex:\n", pdt);
dStrHexErr((const char *)b, len, 0);
break;
}
@@ -2253,10 +2252,10 @@ svpd_unable_to_decode(int sg_fd, int num_vpd, int subvalue, int maxlen,
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2266,12 +2265,12 @@ svpd_unable_to_decode(int sg_fd, int num_vpd, int subvalue, int maxlen,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len, 1,
verbose);
if (res) {
- fprintf(stderr, "fetching VPD page (2) code=0x%.2x "
+ pr2serr("fetching VPD page (2) code=0x%.2x "
" (alloc_len=%d) failed\n", num_vpd, len);
return res;
}
} else {
- fprintf(stderr, "warning: response length (%d) longer than "
+ pr2serr("warning: response length (%d) longer than "
"requested (%d)\n", len, maxlen);
len = alloc_len;
}
@@ -2287,10 +2286,9 @@ svpd_unable_to_decode(int sg_fd, int num_vpd, int subvalue, int maxlen,
return 0;
} else {
if (num_vpd >= 0)
- fprintf(stderr, "fetching VPD page code=0x%.2x: failed\n",
- num_vpd);
+ pr2serr("fetching VPD page code=0x%.2x: failed\n", num_vpd);
else
- fprintf(stderr, "fetching VPD page code=%d: failed\n", num_vpd);
+ pr2serr("fetching VPD page code=%d: failed\n", num_vpd);
return res;
}
}
@@ -2323,7 +2321,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
if (do_raw)
dStrRaw((const char *)rsp_buff, alloc_len);
else if (do_hex) {
- if (! do_quiet)
+ if (! do_quiet && (do_hex < 3))
printf("Standard Inquiry reponse:\n");
dStrHex((const char *)rsp_buff, alloc_len,
(1 == do_hex) ? 0 : -1);
@@ -2333,17 +2331,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_SUPPORTED_VPDS: /* 0x0 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Supported VPD pages VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2353,13 +2351,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Supported VPD pages "
+ pr2serr("fetching Supported VPD pages "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2393,17 +2391,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_UNIT_SERIAL_NUM: /* 0x80 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Unit serial number VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2413,13 +2411,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Unit serial number page "
+ pr2serr("fetching Unit serial number page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2444,17 +2442,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_DEVICE_ID: /* 0x83 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Device Identification VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2464,13 +2462,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Device Identification page "
+ pr2serr("fetching Device Identification page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2490,17 +2488,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_SOFTW_INF_ID: /* 0x84 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Software interface identification VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2510,13 +2508,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Software interface id page "
+ pr2serr("fetching Software interface id page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2534,17 +2532,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_MAN_NET_ADDR: /* 0x85 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Management network addresses VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2554,14 +2552,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Management network "
- "addresses page (alloc_len=%d) failed\n",
- len);
+ pr2serr("fetching Management network addresses page "
+ "(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2573,17 +2570,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_EXT_INQ: /* 0x86 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("extended INQUIRY data VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2593,13 +2590,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Extended INQUIRY data page "
+ pr2serr("fetching Extended INQUIRY data page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2626,17 +2623,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_MODE_PG_POLICY: /* 0x87 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Mode page policy VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2646,13 +2643,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Mode page policy page "
+ pr2serr("fetching Mode page policy page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2670,17 +2667,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_SCSI_PORTS: /* 0x88 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("SCSI Ports VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2690,12 +2687,12 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching SCSI ports page "
+ pr2serr("fetching SCSI ports page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
+ pr2serr(">>> warning: response length (%d) "
"longer than requested (%d)\n", len, alloc_len);
len = alloc_len;
}
@@ -2715,17 +2712,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_ATA_INFO: /* 0x89 */
- if ((! do_raw) && (3 != do_hex) && (! do_quiet))
+ if ((! do_raw) && (do_hex < 3) && (! do_quiet))
printf("ATA information VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2735,13 +2732,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching ATA info page "
+ pr2serr("fetching ATA info page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2762,17 +2759,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_POWER_CONDITION: /* 0x8a */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Power condition VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2782,13 +2779,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching ATA info page "
+ pr2serr("fetching ATA info page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2806,17 +2803,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_POWER_CONSUMPTION: /* 0x8d */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Power consumption VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2826,13 +2823,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Power consumption page "
+ pr2serr("fetching Power consumption page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2850,17 +2847,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_3PARTY_COPY: /* 0x8f */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Third party copy VPD page:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2870,13 +2867,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Third party copy page "
+ pr2serr("fetching Third party copy page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2896,17 +2893,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_PROTO_LU: /* 0x90 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Protocol-specific logical unit information:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2916,13 +2913,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Protocol-specific LU page "
+ pr2serr("fetching Protocol-specific LU page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2940,17 +2937,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
break;
case VPD_PROTO_PORT: /* 0x91 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Protocol-specific port information:\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -2960,13 +2957,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Protocol-specific port page "
+ pr2serr("fetching Protocol-specific port page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -2988,16 +2985,16 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
verbose);
if (0 == res) {
pdt = rsp_buff[0] & 0x1f;
- if ((! do_raw) && (! do_quiet)) {
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3)) {
switch (pdt) {
- case 0: case 4: case 7:
+ case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
printf("Block limits VPD page (SBC):\n");
break;
- case 1: case 8:
+ case PDT_TAPE: case PDT_MCHANGER:
printf("Sequential access device capabilities VPD page "
"(SSC):\n");
break;
- case 0x11:
+ case PDT_OSD:
printf("OSD information VPD page (OSD):\n");
break;
default:
@@ -3007,10 +3004,10 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -3020,13 +3017,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching 0xb0 page "
+ pr2serr("fetching 0xb0 page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -3049,7 +3046,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
verbose);
if (0 == res) {
pdt = rsp_buff[0] & 0x1f;
- if ((! do_raw) && (! do_quiet)) {
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
printf("Block device characteristics VPD page (SBC):\n");
@@ -3072,10 +3069,10 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -3085,13 +3082,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching 0xb1 page "
+ pr2serr("fetching 0xb1 page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -3114,7 +3111,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
verbose);
if (0 == res) {
pdt = rsp_buff[0] & 0x1f;
- if ((! do_raw) && (! do_quiet)) {
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
printf("Logical block provisioning VPD page (SBC):\n");
@@ -3129,10 +3126,10 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -3142,13 +3139,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching 0xb2 page "
+ pr2serr("fetching 0xb2 page "
"(alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -3171,7 +3168,7 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
verbose);
if (0 == res) {
pdt = rsp_buff[0] & 0x1f;
- if ((! do_raw) && (! do_quiet)) {
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
printf("Referrals VPD page (SBC):\n");
@@ -3187,10 +3184,10 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
}
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -3200,13 +3197,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching VPD page 0x%x "
+ pr2serr("fetching VPD page 0x%x "
"(alloc_len=%d) failed\n", num_vpd, len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -3225,17 +3222,17 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
printf("VPD page=0xb3\n");
break;
case VPD_DTDE_ADDRESS: /* 0xb4 */
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 3))
printf("Data transfer device element address (SSC):\n");
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
@@ -3245,14 +3242,13 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching Data transfer device "
- "element address page (alloc_len=%d) "
- "failed\n", len);
+ pr2serr("fetching Data transfer device element "
+ "address page (alloc_len=%d) failed\n", len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}
@@ -3327,14 +3323,14 @@ main(int argc, char * argv[])
case 'm':
maxlen = sg_get_num(optarg);
if ((maxlen < 0) || (maxlen > MX_ALLOC_LEN)) {
- fprintf(stderr, "argument to '--maxlen' should be %d or "
- "less\n", MX_ALLOC_LEN);
+ pr2serr("argument to '--maxlen' should be %d or less\n",
+ MX_ALLOC_LEN);
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'p':
if (page_str) {
- fprintf(stderr, "only one '--page=' option permitted\n");
+ pr2serr("only one '--page=' option permitted\n");
usage();
return SG_LIB_SYNTAX_ERROR;
} else
@@ -3350,10 +3346,10 @@ main(int argc, char * argv[])
++do_verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -3365,16 +3361,15 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (do_enum) {
if (device_name)
- fprintf(stderr, "Device name %s ignored when --enumerate "
- "given\n", device_name);
+ pr2serr("Device name %s ignored when --enumerate given\n",
+ device_name);
if (page_str) {
if ((0 == strcmp("-1", page_str)) ||
(0 == strcmp("-2", page_str)))
@@ -3382,12 +3377,11 @@ main(int argc, char * argv[])
else if (isdigit(page_str[0])) {
num_vpd = sg_get_num_nomult(page_str);
if ((num_vpd < 0) || (num_vpd > 255)) {
- fprintf(stderr, "Bad page code value after '-p' "
- "option\n");
+ pr2serr("Bad page code value after '-p' option\n");
return SG_LIB_SYNTAX_ERROR;
}
} else {
- fprintf(stderr, "with --enumerate only search using VPD page "
+ pr2serr("with --enumerate only search using VPD page "
"numbers\n");
return SG_LIB_SYNTAX_ERROR;
}
@@ -3411,8 +3405,7 @@ main(int argc, char * argv[])
if (NULL == vnp) {
vnp = svpd_find_vendor_by_acron(page_str);
if (NULL == vnp) {
- fprintf(stderr, "abbreviation doesn't match a VPD "
- "page\n");
+ pr2serr("abbreviation doesn't match a VPD page\n");
printf("available VPD pages:\n");
enumerate_vpds(1, 1);
return SG_LIB_SYNTAX_ERROR;
@@ -3424,8 +3417,7 @@ main(int argc, char * argv[])
cp = strchr(page_str, ',');
num_vpd = sg_get_num_nomult(page_str);
if ((num_vpd < 0) || (num_vpd > 255)) {
- fprintf(stderr, "Bad page code value after '-p' "
- "option\n");
+ pr2serr("Bad page code value after '-p' option\n");
printf("available VPD pages:\n");
enumerate_vpds(1, 1);
return SG_LIB_SYNTAX_ERROR;
@@ -3433,8 +3425,7 @@ main(int argc, char * argv[])
if (cp) {
subvalue = sg_get_num_nomult(cp + 1);
if ((subvalue < 0) || (subvalue > 255)) {
- fprintf(stderr, "Bad subvalue code value after "
- "'-p' option\n");
+ pr2serr("Bad subvalue code value after '-p' option\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -3442,7 +3433,7 @@ main(int argc, char * argv[])
}
if (do_raw && do_hex) {
- fprintf(stderr, "Can't do hex and raw at the same time\n");
+ pr2serr("Can't do hex and raw at the same time\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -3455,7 +3446,7 @@ main(int argc, char * argv[])
}
}
if (NULL == device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -3468,8 +3459,8 @@ main(int argc, char * argv[])
if ((sg_fd = sg_cmds_open_device(device_name, 1 /* ro */,
do_verbose)) < 0) {
- fprintf(stderr, "error opening file: %s: %s\n",
- device_name, safe_strerror(-sg_fd));
+ pr2serr("error opening file: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
memset(rsp_buff, 0, sizeof(rsp_buff));
@@ -3485,13 +3476,13 @@ main(int argc, char * argv[])
do_verbose);
}
if (SG_LIB_CAT_ABORTED_COMMAND == res)
- fprintf(stderr, "fetching VPD page failed, aborted command\n");
+ pr2serr("fetching VPD page failed, aborted command\n");
else if (res)
- fprintf(stderr, "fetching VPD page failed\n");
+ pr2serr("fetching VPD page failed\n");
ret = res;
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_vpd_vendor.c b/src/sg_vpd_vendor.c
index 330ffdec..40bb3f57 100644
--- a/src/sg_vpd_vendor.c
+++ b/src/sg_vpd_vendor.c
@@ -9,6 +9,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
@@ -119,6 +120,27 @@ static struct svpd_values_name_t vendor_vpd_pg[] = {
{0, 0, 0, NULL, NULL},
};
+
+#ifdef __GNUC__
+static int pr2serr(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2serr(const char * fmt, ...);
+#endif
+
+
+static int
+pr2serr(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
static const struct svpd_values_name_t *
svpd_get_v_detail(int page_num, int subvalue, int pdt)
{
@@ -204,8 +226,8 @@ decode_vpd_c0_hp3par(unsigned char * buff, int len)
long offset;
if (len < 24) {
- fprintf(stderr, "HP/3PAR vendor specific VPD page length too "
- "short=%d\n", len);
+ pr2serr("HP/3PAR vendor specific VPD page length too short=%d\n",
+ len);
return;
}
@@ -277,8 +299,8 @@ static void
decode_firm_vpd_c0_sea(unsigned char * buff, int len)
{
if (len < 28) {
- fprintf(stderr, "Seagate firmware numbers VPD page length too "
- "short=%d\n", len);
+ pr2serr("Seagate firmware numbers VPD page length too short=%d\n",
+ len);
return;
}
if (28 == len) {
@@ -360,13 +382,12 @@ decode_upr_vpd_c0_emc(unsigned char * buff, int len)
int k, ip_mgmt, vpp80, lun_z;
if (len < 3) {
- fprintf(stderr, "EMC upr VPD page [0xc0]: length too short=%d\n",
- len);
+ pr2serr("EMC upr VPD page [0xc0]: length too short=%d\n", len);
return;
}
if (buff[9] != 0x00) {
- fprintf(stderr, "Unsupported page revision %d, decoding not "
- "possible.\n" , buff[9]);
+ pr2serr("Unsupported page revision %d, decoding not possible.\n",
+ buff[9]);
return;
}
printf(" LUN WWN: ");
@@ -436,13 +457,12 @@ decode_rdac_vpd_c0(unsigned char * buff, int len)
char name[65];
if (len < 3) {
- fprintf(stderr, "Hardware Version VPD page length too "
- "short=%d\n", len);
+ pr2serr("Hardware Version VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 'h' && buff[5] != 'w' && buff[6] != 'r') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
printf(" Number of channels: %x\n", buff[8]);
@@ -483,13 +503,12 @@ decode_rdac_vpd_c1(unsigned char * buff, int len)
char part[5];
if (len < 3) {
- fprintf(stderr, "Firmware Version VPD page length too "
- "short=%d\n", len);
+ pr2serr("Firmware Version VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 'f' && buff[5] != 'w' && buff[6] != 'r') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
printf(" Firmware Version: %x.%x.%x\n", buff[8], buff[9], buff[10]);
@@ -526,13 +545,12 @@ decode_rdac_vpd_c2(unsigned char * buff, int len)
char part[5];
if (len < 3) {
- fprintf(stderr, "Software Version VPD page length too "
- "short=%d\n", len);
+ pr2serr("Software Version VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 's' && buff[5] != 'w' && buff[6] != 'r') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
printf(" Software Version: %x.%x.%x\n", buff[8], buff[9], buff[10]);
@@ -579,13 +597,12 @@ static void
decode_rdac_vpd_c3(unsigned char * buff, int len)
{
if (len < 0x2c) {
- fprintf(stderr, "Feature parameters VPD page length too "
- "short=%d\n", len);
+ pr2serr("Feature parameters VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 'p' && buff[5] != 'r' && buff[6] != 'm') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
printf(" Maximum number of drives per LUN: %d\n", buff[8]);
@@ -605,13 +622,12 @@ decode_rdac_vpd_c4(unsigned char * buff, int len)
char slot_id[3];
if (len < 0x1c) {
- fprintf(stderr, "Subsystem identifier VPD page length too "
- "short=%d\n", len);
+ pr2serr("Subsystem identifier VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 's' && buff[5] != 'u' && buff[6] != 'b') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
memset(subsystem_id, 0, 17);
@@ -656,13 +672,13 @@ decode_rdac_vpd_c8(unsigned char * buff, int len)
int uuid_len;
if (len < 0xab) {
- fprintf(stderr, "Extended Device Identification VPD page length too "
+ pr2serr("Extended Device Identification VPD page length too "
"short=%d\n", len);
return;
}
if (buff[4] != 'e' && buff[5] != 'd' && buff[6] != 'i') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
@@ -717,18 +733,16 @@ static void
decode_rdac_vpd_c9(unsigned char * buff, int len)
{
if (len < 3) {
- fprintf(stderr, "Volume Access Control VPD page length too "
- "short=%d\n", len);
+ pr2serr("Volume Access Control VPD page length too short=%d\n", len);
return;
}
if (buff[4] != 'v' && buff[5] != 'a' && buff[6] != 'c') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
if (buff[7] != '1') {
- fprintf(stderr, "Invalid page version '%c' (should be 1)\n",
- buff[7]);
+ pr2serr("Invalid page version '%c' (should be 1)\n", buff[7]);
}
printf(" AVT:");
if (buff[8] & 0x80) {
@@ -767,13 +781,13 @@ decode_rdac_vpd_ca(unsigned char * buff, int len)
int i;
if (len < 16) {
- fprintf(stderr, "Replicated Volume Source Identifier "
- "VPD page length too short=%d\n", len);
+ pr2serr("Replicated Volume Source Identifier VPD page length too "
+ "short=%d\n", len);
return;
}
if (buff[4] != 'r' && buff[5] != 'v' && buff[6] != 's') {
- fprintf(stderr, "Invalid page identifier %c%c%c%c, decoding "
- "not possible.\n" , buff[4], buff[5], buff[6], buff[7]);
+ pr2serr("Invalid page identifier %c%c%c%c, decoding not possible.\n",
+ buff[4], buff[5], buff[6], buff[7]);
return;
}
if (buff[8] & 0x01) {
@@ -800,8 +814,8 @@ decode_rdac_vpd_d0(unsigned char * buff, int len)
int i;
if (len < 20) {
- fprintf(stderr, "Storage Array World Wide Name "
- "VPD page length too short=%d\n", len);
+ pr2serr("Storage Array World Wide Name VPD page length too "
+ "short=%d\n", len);
return;
}
printf(" Storage Array WWN: ");
@@ -822,8 +836,8 @@ decode_dds_vpd_c0(unsigned char * buff, int len)
char fw_conf[21];
if (len < 0xb3) {
- fprintf(stderr, "Vendor-Unique Firmware revision page "
- "invalid length=%d\n", len);
+ pr2serr("Vendor-Unique Firmware revision page invalid length=%d\n",
+ len);
return;
}
memset(firmware_rev, 0x0, 25);
@@ -853,8 +867,8 @@ decode_lto_vpd_cx(unsigned char * buff, int len, int page)
const char *comp = NULL;
if (len < 0x5c) {
- fprintf(stderr, "Driver Component Revision Levels page "
- "invalid length=%d\n", len);
+ pr2serr("Driver Component Revision Levels page invalid length=%d\n",
+ len);
return;
}
switch (page) {
@@ -878,8 +892,8 @@ decode_lto_vpd_cx(unsigned char * buff, int len, int page)
break;
}
if (!comp) {
- fprintf(stderr, "Driver Component Revision Level invalid "
- "page=0x%02x\n", page);
+ pr2serr("Driver Component Revision Level invalid page=0x%02x\n",
+ page);
return;
}
@@ -921,15 +935,14 @@ svpd_decode_vendor(int sg_fd, int num_vpd, int subvalue, int maxlen,
snprintf(name, sizeof(name) - 1, "Vendor VPD page=0x%x", num_vpd);
if (0 == alloc_len)
alloc_len = DEF_ALLOC_LEN;
- if ((! do_raw) && (! do_quiet))
+ if ((! do_raw) && (! do_quiet) && (do_hex < 2))
printf("%s VPD Page:\n", name);
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1,
verbose);
if (0 == res) {
len = rsp_buff[3] + 4;
if (num_vpd != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably not "
- "supported\n");
+ pr2serr("invalid VPD response; probably not supported\n");
return SG_LIB_CAT_MALFORMED;
}
if (len > alloc_len) {
@@ -937,13 +950,13 @@ svpd_decode_vendor(int sg_fd, int num_vpd, int subvalue, int maxlen,
res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len,
1, verbose);
if (res) {
- fprintf(stderr, "fetching 0x%x page "
- "(alloc_len=%d) failed\n", num_vpd, len);
+ pr2serr("fetching 0x%x page (alloc_len=%d) failed\n",
+ num_vpd, len);
return res;
}
} else {
- fprintf(stderr, ">>> warning: response length (%d) "
- "longer than requested (%d)\n", len, alloc_len);
+ pr2serr(">>> warning: response length (%d) longer than "
+ "requested (%d)\n", len, alloc_len);
len = alloc_len;
}
}