File sg3_utils-Fixup-T10-Vendor-designator-display.patch of Package sg3_utils

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) {
openSUSE Build Service is sponsored by