sg3_utils/sg3_utils-Fixup-T10-Vendor-designator-display.patch
Robert Milasan 71bca36620 Accepting request 196310 from home:olh:branches:Base:System
- Fixup T10 Vendor designator display (bnc#805059)
- In rescan-scsi-bus.sh, check if the HBA driver exports issue_lip
  in sysfs before using it (bnc#780946)

OBS-URL: https://build.opensuse.org/request/show/196310
OBS-URL: https://build.opensuse.org/package/show/Base:System/sg3_utils?expand=0&rev=28
2013-08-26 09:57:56 +00:00

78 lines
3.0 KiB
Diff

From 5a20c030863cc14647651586ab07554d73a062a8 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Thu, 23 May 2013 09:26:40 +0200
Subject: [PATCH] Fixup T10 Vendor designator display
The T10 Vendor designator might have a code set of 'binary', in
which case the T10 Vendor ID is an 8 byte ASCII field, and the
vendor specific identifier is in binary.
References: bnc#805059
Signed-off-by: Hannes Reinecke <hare@suse.de>
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 4848574..408ecdd 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -1115,8 +1115,16 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
break;
case 1: /* T10 vendor identification */
printf(" vendor id: %.8s\n", ip);
- if (i_len > 8)
- printf(" vendor specific: %.*s\n", i_len - 8, ip + 8);
+ if (i_len > 8) {
+ if ((2 == c_set) || (3 == c_set)) { /* ASCII or UTF-8 */
+ printf(" vendor specific: %.*s\n", i_len - 8, ip + 8);
+ } else {
+ printf(" vendor specific: 0x");
+ for (m = 8; m < i_len; ++m)
+ printf("%02x", (unsigned int)ip[m]);
+ printf("\n");
+ }
+ }
break;
case 2: /* EUI-64 based */
printf(" EUI-64 based %d byte identifier\n", i_len);
@@ -1405,8 +1413,15 @@ export_dev_ids(unsigned char * buff, int len)
printf("SCSI_IDENT_%s_VENDOR=%.*s\n", assoc_str, k, ip);
break;
case 1: /* T10 vendor identification */
- k = encode_whitespaces(ip, i_len);
- printf("SCSI_IDENT_%s_T10=%.*s\n", assoc_str, k, ip);
+ printf("SCSI_IDENT_%s_T10=", assoc_str);
+ if ((2 == c_set) || (3 == c_set)) {
+ k = encode_whitespaces(ip, i_len);
+ printf("%.*s\n", k, ip);
+ } else {
+ for (m = 0; m < i_len; ++m)
+ printf("%02x", (unsigned int)ip[m]);
+ printf("\n");
+ }
break;
case 2: /* EUI-64 based */
if (1 != c_set) {
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index f991623..f7345db 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -796,8 +796,16 @@ decode_designation_descriptor(const unsigned char * ip, int i_len,
break;
case 1: /* T10 vendor identification */
printf(" vendor id: %.8s\n", ip);
- if (i_len > 8)
- printf(" vendor specific: %.*s\n", i_len - 8, ip + 8);
+ if (i_len > 8) {
+ if ((2 == c_set) || (3 == c_set)) { /* ASCII or UTF-8 */
+ printf(" vendor specific: %.*s\n", i_len - 8, ip + 8);
+ } else {
+ printf(" vendor specific: 0x");
+ for (m = 8; m < i_len; ++m)
+ printf("%02x", (unsigned int)ip[m]);
+ printf("\n");
+ }
+ }
break;
case 2: /* EUI-64 based */
if (! long_out) {