diff options
Diffstat (limited to 'src/sg_inq.c')
-rw-r--r-- | src/sg_inq.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/sg_inq.c b/src/sg_inq.c index 897be758..60c8adeb 100644 --- a/src/sg_inq.c +++ b/src/sg_inq.c @@ -1882,6 +1882,11 @@ export_dev_ids(unsigned char * buff, int len, int verbose) } break; } + /* + * Unfortunately, there are some (broken) implementations + * which return _several_ NAA descriptors. + * So add a suffix to differentiate between them. + */ naa = (ip[0] >> 4) & 0xff; if ((naa < 2) || (naa > 6) || (4 == naa)) { if (verbose) { @@ -1891,15 +1896,36 @@ export_dev_ids(unsigned char * buff, int len, int verbose) break; } if (6 != naa) { + const char *suffix; + if (8 != i_len) { if (verbose) { - pr2serr(" << unexpected NAA 2 identifier " - "length: 0x%x>>\n", i_len); + pr2serr(" << unexpected NAA %d identifier " + "length: 0x%x>>\n", naa, i_len); + dStrHexErr((const char *)ip, i_len, 0); + } + break; + } + if (naa != 2 && naa != 3 && naa != 5) { + if (verbose) { + pr2serr(" << unexpected NAA format %d>>\n", naa); dStrHexErr((const char *)ip, i_len, 0); } break; } - printf("SCSI_IDENT_%s_NAA=", assoc_str); + switch (naa) { + case 5: + suffix="REG"; + break; + case 2: + suffix="EXT"; + break; + case 3: + default: + suffix="LOCAL"; + break; + } + printf("SCSI_IDENT_%s_NAA_%s=", assoc_str, suffix); for (m = 0; m < 8; ++m) printf("%02x", (unsigned int)ip[m]); printf("\n"); @@ -1912,7 +1938,7 @@ export_dev_ids(unsigned char * buff, int len, int verbose) } break; } - printf("SCSI_IDENT_%s_NAA=", assoc_str); + printf("SCSI_IDENT_%s_NAA_REGEXT=", assoc_str); for (m = 0; m < 16; ++m) printf("%02x", (unsigned int)ip[m]); printf("\n"); |