aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sg_dd.c8
-rw-r--r--src/sg_decode_sense.c5
-rw-r--r--src/sg_get_elem_status.c6
-rw-r--r--src/sg_get_lba_status.c20
-rw-r--r--src/sg_inq.c50
-rw-r--r--src/sg_logs.c22
-rw-r--r--src/sg_vpd.c60
-rw-r--r--src/sg_vpd_common.c94
-rw-r--r--src/sg_vpd_common.h2
-rw-r--r--src/sg_z_act_query.c6
-rw-r--r--src/sgp_dd.c4
11 files changed, 161 insertions, 116 deletions
diff --git a/src/sg_dd.c b/src/sg_dd.c
index 10ede6fd..9e0b6931 100644
--- a/src/sg_dd.c
+++ b/src/sg_dd.c
@@ -70,7 +70,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "6.33 20220418";
+static const char * version_str = "6.34 20220729";
#define ME "sg_dd: "
@@ -2420,21 +2420,21 @@ main(int argc, char * argv[])
else if (iflag.ff)
memset(wrkPos, 0xff, res);
else {
- int kk, j;
+ int kk, jj;
const int jbump = sizeof(uint32_t);
long rn;
uint8_t * bp;
bp = wrkPos;
for (kk = 0; kk < blocks; ++kk, bp += blk_sz) {
- for (j = 0; j < blk_sz; j += jbump) {
+ for (jj = 0; jj < blk_sz; jj += jbump) {
/* mrand48 takes uniformly from [-2^31, 2^31) */
#ifdef HAVE_SRAND48_R
mrand48_r(&drand, &rn);
#else
rn = mrand48();
#endif
- *((uint32_t *)(bp + j)) = (uint32_t)rn;
+ *((uint32_t *)(bp + jj)) = (uint32_t)rn;
}
}
}
diff --git a/src/sg_decode_sense.c b/src/sg_decode_sense.c
index 63e2ab26..e902d0a6 100644
--- a/src/sg_decode_sense.c
+++ b/src/sg_decode_sense.c
@@ -30,7 +30,7 @@
#include "sg_unaligned.h"
-static const char * version_str = "1.30 20220717";
+static const char * version_str = "1.31 20220729";
#define MY_NAME "sg_decode_sense"
@@ -478,8 +478,7 @@ main(int argc, char *argv[])
else if (op->hex_count)
dStrHexFp((const char *)op->sense, op->sense_len, 0, fp);
else {
- size_t s = fwrite(op->sense, 1, op->sense_len, fp);
-
+ s = fwrite(op->sense, 1, op->sense_len, fp);
if ((int)s != op->sense_len)
pr2serr("only able to write %d of %d bytes to %s\n",
(int)s, op->sense_len, op->wfname);
diff --git a/src/sg_get_elem_status.c b/src/sg_get_elem_status.c
index f7f06a1f..1aab2244 100644
--- a/src/sg_get_elem_status.c
+++ b/src/sg_get_elem_status.c
@@ -37,7 +37,7 @@
* given SCSI device.
*/
-static const char * version_str = "1.13 20220717"; /* sbc5r02 */
+static const char * version_str = "1.14 20220729"; /* sbc5r03 */
#define MY_NAME "sg_get_elem_status"
@@ -302,7 +302,7 @@ main(int argc, char * argv[])
struct gpes_desc_t a_ped;
sgj_state json_st = {0};
sgj_state * jsp = &json_st;
- char b[64];
+ char b[80];
static const int blen = sizeof(b);
while (1) {
@@ -629,8 +629,6 @@ error:
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
pr2serr("Get LBA Status command: bad field in cdb\n");
else {
- char b[80];
-
sg_get_category_sense_str(res, sizeof(b), b, verbose);
pr2serr("Get LBA Status command: %s\n", b);
}
diff --git a/src/sg_get_lba_status.c b/src/sg_get_lba_status.c
index 4ed45c81..3acf07b0 100644
--- a/src/sg_get_lba_status.c
+++ b/src/sg_get_lba_status.c
@@ -35,7 +35,7 @@
* device.
*/
-static const char * version_str = "1.29 20220717"; /* sbc5r01 */
+static const char * version_str = "1.30 20220729"; /* sbc5r01 */
#define MY_NAME "sg_get_lba_status"
@@ -629,7 +629,7 @@ start_response:
sgj_js_nv_istr(jsp, jo2p, add_stat_s, add_status, NULL,
get_pr_status_str(add_status, b, blen));
} else {
- char c[64];
+ char d[64];
n = 0;
n += sg_scnpr(b + n, blen - n, "[%d] LBA: 0x", k + 1);
@@ -637,16 +637,16 @@ start_response:
n += sg_scnpr(b + n, blen - n, "%02x", bp[j]);
if (1 == (blockhex % 2)) {
- snprintf(c, sizeof(c), "0x%x", d_blocks);
- n += sg_scnpr(b + n, blen - n, " blocks: %10s", c);
+ snprintf(d, sizeof(d), "0x%x", d_blocks);
+ n += sg_scnpr(b + n, blen - n, " blocks: %10s", d);
} else
n += sg_scnpr(b + n, blen - n, " blocks: %10u",
(unsigned int)d_blocks);
- get_prov_status_str(res, c, sizeof(c));
- n += sg_scnpr(b + n, blen - n, " %s", c);
- get_pr_status_str(add_status, c, sizeof(c));
- if (strlen(c) > 0)
- n += sg_scnpr(b + n, blen - n, " [%s]", c);
+ get_prov_status_str(res, d, sizeof(d));
+ n += sg_scnpr(b + n, blen - n, " %s", d);
+ get_pr_status_str(add_status, d, sizeof(d));
+ if (strlen(d) > 0)
+ n += sg_scnpr(b + n, blen - n, " [%s]", d);
sgj_pr_hr(jsp, "%s\n", b);
}
}
@@ -663,8 +663,6 @@ error:
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
pr2serr("Get LBA Status command: bad field in cdb\n");
else {
- char b[80];
-
sg_get_category_sense_str(res, sizeof(b), b, verbose);
pr2serr("Get LBA Status command: %s\n", b);
}
diff --git a/src/sg_inq.c b/src/sg_inq.c
index c35e9343..001970f2 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -53,7 +53,7 @@
#include "sg_vpd_common.h" /* for shared VPD page processing with sg_vpd */
-static const char * version_str = "2.24 20220727"; /* spc6r06 */
+static const char * version_str = "2.26 20220729"; /* spc6r06 */
#define MY_NAME "sg_inq"
@@ -2390,7 +2390,7 @@ std_inq_decode(struct opts_t * op, sgj_opaque_p jop, int off)
}
pqual = (rp[0] & 0xe0) >> 5;
if (! op->do_raw && ! op->do_export) {
- snprintf(b, blen, "standard INQUIRY:");
+ strcpy(b, "standard INQUIRY:");
if (0 == pqual)
sgj_pr_hr(jsp, "%s\n", b);
else if (1 == pqual)
@@ -2997,9 +2997,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
sgj_opaque_p jap = NULL;
const char * np;
const char * ep = "";
- // const char * pdt_str;
uint8_t * rp;
- // char d[80];
rp = rsp_buff + off;
vb = op->verbose;
@@ -3297,8 +3295,8 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
bool bl = false;
bool sad = false;
bool oi = false;
- const char * ep = "";
+ ep = "";
if (op->do_raw) {
dStrRaw((const char *)rp, len);
break;
@@ -3658,11 +3656,45 @@ xxxxx
pr2serr("VPD INQUIRY: page=0xb8\n");
break;
case 0xb9:
-// yyyyyyyy
- bad = true;
- pr2serr("Please try the sg_vpd utility which decodes more VPD "
- "pages\n\n");
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, op->maxlen, vb, &len);
+ if (0 == res) {
+ bool cpr = false;
+
+ if (op->do_raw) {
+ dStrRaw((const char *)rp, len);
+ break;
+ }
+ pdt = rp[0] & PDT_MASK;
+ switch (pdt) {
+ case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
+ np = "Concurrent positioning LBAs VPD page";
+ ep = "(SBC)";
+ cpr = true;
+ break;
+ default:
+ np = NULL;
+ break;
+ }
+ if (op->do_hex < 2) {
+ if (NULL == np)
+ sgj_pr_hr(jsp, "VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
+ else
+ sgj_pr_hr(jsp, "VPD INQUIRY: %s %s\n", np, ep);
+ }
+ if (as_json) {
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ jap = sgj_named_subarray_r(jsp, jo2p, "lba_range_"
+ "descriptor_list");
+ }
+ if (cpr)
+ decode_con_pos_range_vpd(rp, len, op, jap);
+ else
+ return vpd_mainly_hex(sg_fd, op, NULL, off);
+ return 0;
+ } else if (! op->do_raw)
+ pr2serr("VPD INQUIRY: page=0xb8\n");
break;
+// yyyyyyyy
case VPD_UPR_EMC: /* 0xc0 */
if (!op->do_raw && (op->do_hex < 2))
printf("VPD INQUIRY: Unit Path Report Page (EMC)\n");
diff --git a/src/sg_logs.c b/src/sg_logs.c
index 358b7222..66665b4a 100644
--- a/src/sg_logs.c
+++ b/src/sg_logs.c
@@ -37,7 +37,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.98 20220310"; /* spc6r06 + sbc5r01 */
+static const char * version_str = "1.99 20220729"; /* spc6r06 + sbc5r01 */
#define MX_ALLOC_LEN (0xfffc)
#define MX_INLEN_ALLOC_LEN (0x800000)
@@ -2804,16 +2804,16 @@ show_last_n_inq_data_ch_page(const uint8_t * resp, int len,
int vpd = *(bp + 5);
printf("VPD page 0x%x changed\n", vpd);
if (0 == op->do_brief) {
- int k;
- const int num = sg_lib_names_mode_len;
+ int m;
+ const int nn = sg_lib_names_mode_len;
struct sg_lib_simple_value_name_t * nvp =
sg_lib_names_vpd_arr;
- for (k = 0; k < num; ++k, ++nvp) {
+ for (m = 0; m < nn; ++m, ++nvp) {
if (nvp->value == vpd)
break;
}
- if (k < num)
+ if (m < nn)
printf(" name: %s\n", nvp->name);
}
} else
@@ -2877,16 +2877,16 @@ show_last_n_mode_pg_data_ch_page(const uint8_t * resp, int len,
printf("mode page 0x%x changed\n", pg_code);
if (0 == op->do_brief) {
int k;
- const int num = sg_lib_names_mode_len;
int val = (pg_code << 8) | spg_code;
+ const int nn = sg_lib_names_mode_len;
struct sg_lib_simple_value_name_t * nmp =
sg_lib_names_mode_arr;
- for (k = 0; k < num; ++k, ++nmp) {
+ for (k = 0; k < nn; ++k, ++nmp) {
if (nmp->value == val)
break;
}
- if (k < num)
+ if (k < nn)
printf(" name: %s\n", nmp->name);
}
}
@@ -3220,10 +3220,8 @@ show_app_client_page(const uint8_t * resp, int len, const struct opts_t * op)
if (op->do_raw) {
dStrRaw(bp, extra);
break;
- } else if (0 == op->do_hex)
- hex2stdout(bp, extra, op->dstrhex_no_ascii);
- else
- hex2stdout(bp, extra, op->dstrhex_no_ascii);
+ }
+ hex2stdout(bp, extra, op->dstrhex_no_ascii);
printf("\n");
if (op->do_pcb)
printf(" <%s>\n", get_pcb_str(bp[2], str, sizeof(str)));
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index 74a2bd95..a0bf5036 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -42,7 +42,7 @@
*/
-static const char * version_str = "1.78 20220727"; /* spc6r06 + sbc5r01 */
+static const char * version_str = "1.78 20220729"; /* spc6r06 + sbc5r01 */
#define MY_NAME "sg_vpd"
@@ -1838,35 +1838,6 @@ decode_format_presets_vpd(uint8_t * buff, int len, int do_hex)
}
#endif
-/* VPD_CON_POS_RANGE 0xb9 (added sbc5r01) */
-static void
-decode_con_pos_range_vpd(uint8_t * buff, int len, int do_hex)
-{
- int k;
- uint64_t u;
- uint8_t * bp;
-
- if (do_hex) {
- hex2stdout(buff, len, (1 == do_hex) ? 0 : -1);
- return;
- }
- if (len < 64) {
- pr2serr("Concurrent position ranges VPD page length too short=%d\n",
- len);
- return;
- }
- len -= 64;
- bp = buff + 64;
- for (k = 0; k < len; k += 32, bp += 32) {
- printf(" LBA range number: %u\n", bp[0]);
- printf(" number of storage elements: %u\n", bp[1]);
- printf(" starting LBA: 0x%" PRIx64 "\n",
- sg_get_unaligned_be64(bp + 8));
- u = sg_get_unaligned_be64(bp + 16);
- printf(" number of LBAs: 0x%" PRIx64 " [%" PRIu64 "]\n", u, u);
- }
-}
-
/* Returns 0 if successful */
static int
svpd_unable_to_decode(int sg_fd, struct opts_t * op, int subvalue, int off)
@@ -2836,7 +2807,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
jap = sgj_named_subarray_r(jsp, jo2p, "format_preset_"
"descriptor_list");
}
- if (fp)
+ if (fp)
decode_format_presets_vpd(rp, len, op, jap);
else
return SG_LIB_CAT_OTHER;
@@ -2849,30 +2820,43 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
case 0xb9: /* VPD_CON_POS_RANGE */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
+ bool cpr = false; /* ["cpr"] */
+
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
- np = "Concurrent positioning ranges VPD page (SBC):";
+ np = "Concurrent positioning ranges VPD page";
+ ep = "(SBC)";
+ cpr = true;
break;
default:
np = NULL;
break;
}
if (NULL == np)
- printf("VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
+ sgj_pr_hr(jsp, "VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
else if (allow_name || allow_if_found)
- printf("%s%s\n", pre, np);
+ sgj_pr_hr(jsp, "%s%s %s:\n", pre, np, ep ? ep : "");
if (op->do_raw)
dStrRaw(rp, len);
else {
if (vb || long_notquiet)
- printf(" [PQual=%d Peripheral device type: %s]\n",
- pqual, pdt_str);
- decode_con_pos_range_vpd(rp, len, op->do_hex);
+ sgj_pr_hr(jsp, " [PQual=%d Peripheral device type: "
+ "%s]\n", pqual, pdt_str);
+ if (as_json) {
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ jap = sgj_named_subarray_r(jsp, jo2p, "lba_range_"
+ "descriptor_list");
+ }
+ if (cpr)
+ decode_con_pos_range_vpd(rp, len, op, jap);
+ else
+ return SG_LIB_CAT_OTHER;
}
return 0;
} else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) &&
(0 == op->examine))
- printf("%sVPD page=0xb7\n", pre);
+ printf("%sVPD page=0xb8\n", pre);
break;
default:
return SG_LIB_CAT_OTHER;
diff --git a/src/sg_vpd_common.c b/src/sg_vpd_common.c
index c7943f45..9497de3d 100644
--- a/src/sg_vpd_common.c
+++ b/src/sg_vpd_common.c
@@ -15,6 +15,7 @@
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
+#include <assert.h>
#include <getopt.h>
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
@@ -1291,7 +1292,6 @@ decode_block_dev_ch_vpd(const uint8_t * buff, int len, struct opts_t * op,
sgj_state * jsp = &op->json_st;
const char * cp;
char b[144];
- static const int blen = sizeof(b);
static const char * mrr_j = "medium_rotation_rate";
static const char * mrr_h = "Medium rotation rate";
static const char * nrm = "Non-rotating medium (e.g. solid state)";
@@ -1334,32 +1334,31 @@ decode_block_dev_ch_vpd(const uint8_t * buff, int len, struct opts_t * op,
u = buff[7] & 0xf;
switch (u) {
case 0:
- snprintf(b, blen, nr_s);
+ strcpy(b, nr_s);
break;
case 1:
- snprintf(b, blen, "5.25 inch");
+ strcpy(b, "5.25 inch");
break;
case 2:
- snprintf(b, blen, "3.5 inch");
+ strcpy(b, "3.5 inch");
break;
case 3:
- snprintf(b, blen, "2.5 inch");
+ strcpy(b, "2.5 inch");
break;
case 4:
- snprintf(b, blen, "1.8 inch");
+ strcpy(b, "1.8 inch");
break;
case 5:
- snprintf(b, blen, "less then 1.8 inch");
+ strcpy(b, "less then 1.8 inch");
break;
default:
- snprintf(b, blen, rsv_s);
+ strcpy(b, rsv_s);
break;
}
sgj_pr_hr(jsp, " Nominal form factor: %s\n", b);
sgj_js_nv_ihexstr(jsp, jop, "nominal_forn_factor", u, NULL, b);
sgj_hr_js_vi_nex(jsp, jop, 2, "MACT", SGJ_SEP_EQUAL_NO_SPACE,
!!(buff[8] & 0x40), false, "Multiple ACTuator");
- printf(" MACT=%d\n", !!(buff[8] & 0x40)); /* added sbc5r01 */
zoned = (buff[8] >> 4) & 0x3; /* added sbc4r04, obsolete sbc5r01 */
cp = bdc_zoned_strs[zoned];
sgj_pr_hr(jsp, " ZONED=%d [%s]\n", zoned, cp);
@@ -1440,13 +1439,13 @@ decode_block_lb_prov_vpd(uint8_t * buff, int len, struct opts_t * op,
pt = buff[6] & 0x7;
cp = prov_type_arr[pt];
if (pt > 2)
- snprintf(b, blen, " [%u]]", u);
+ snprintf(b, blen, " [%u]", u);
else
b[0] = '\0';
sgj_pr_hr(jsp, " Provisioning type: %s%s\n", cp, b);
sgj_js_nv_ihexstr(jsp, jop, "provisioning_type", pt, NULL, cp);
u = buff[7]; /* threshold percentage */
- snprintf(b, blen, "%s ", tp);
+ strcpy(b, tp);
if (0 == u)
sgj_pr_hr(jsp, " %s: 0 [percentages %s]\n", b, ns_s);
else
@@ -1493,7 +1492,7 @@ decode_referrals_vpd(uint8_t * buff, int len, struct opts_t * op,
return;
}
u = sg_get_unaligned_be32(buff + 8);
- snprintf(b, sizeof(b), " User data segment size: ");
+ strcpy(b, " User data segment size: ");
if (0 == u)
sgj_pr_hr(jsp, "%s0 [per sense descriptor]\n", b);
else
@@ -1669,23 +1668,23 @@ decode_zbdch_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_pr_hr(jsp, " Peripheral device type: %s\n",
sg_get_pdt_str(pdt, blen, b));
- printf(" Zoned block device extension: ");
+ sgj_pr_hr(jsp, " Zoned block device extension: ");
u = (buff[4] >> 4) & 0xf;
switch (u) {
case 0:
if (PDT_ZBC == (PDT_MASK & buff[0]))
- snprintf(b, blen, "host managed zoned block device");
+ strcpy(b, "host managed zoned block device");
else
- snprintf(b, blen, "%s", nr_s);
+ strcpy(b, nr_s);
break;
case 1:
- snprintf(b, blen, "host aware zoned block device model");
+ strcpy(b, "host aware zoned block device model");
break;
case 2:
- snprintf(b, blen, "Domains and realms zoned block device model");
+ strcpy(b, "Domains and realms zoned block device model");
break;
default:
- snprintf(b, blen, "%s", rsv_s);
+ strcpy(b, rsv_s);
break;
}
sgj_hr_js_vistr(jsp, jop, 2, "Zoned block device extension",
@@ -1712,18 +1711,17 @@ decode_zbdch_vpd(uint8_t * buff, int len, struct opts_t * op,
u = buff[23] & 0xf;
switch (u) {
case 0:
- snprintf(b, blen, "not reported\n");
+ strcpy(b, nr_s);
break;
case 1:
- snprintf(b, blen, "Zoned starting LBAs aligned using constant zone "
- "lengths");
+ strcpy(b, "Zoned starting LBAs aligned using constant zone lengths");
break;
case 0x8:
- snprintf(b, blen, "Zoned starting LBAs potentially non-constant (as "
+ strcpy(b, "Zoned starting LBAs potentially non-constant (as "
"reported by REPORT ZONES)");
break;
default:
- snprintf(b, blen, "%s", rsv_s);
+ strcpy(b, rsv_s);
break;
}
sgj_hr_js_vistr(jsp, jop, 2, "Zoned alignment method",
@@ -1792,18 +1790,19 @@ static const char * sch_type_arr[8] = {
static char *
get_zone_align_method(uint8_t val, char * b, int blen)
{
+ assert(blen > 32);
switch (val) {
case 0:
- snprintf(b, blen, "%s", nr_s);
+ strcpy(b, nr_s);
break;
case 1:
- snprintf(b, blen, "%s", "using constant zone lengths");
+ strcpy(b, "using constant zone lengths");
break;
case 8:
- snprintf(b, blen, "%s", "taking gap zones into account");
+ strcpy(b, "taking gap zones into account");
break;
default:
- snprintf(b, blen, "%s", rsv_s);
+ strcpy(b, rsv_s);
break;
}
return b;
@@ -1852,7 +1851,7 @@ decode_format_presets_vpd(uint8_t * buff, int len, struct opts_t * op,
else
snprintf(b, blen, "%s", cp);
} else
- snprintf(b, blen, "%s", rsv_s);
+ strcpy(b, rsv_s);
sgj_hr_js_vistr(jsp, jo2p, 4, "Schema type", SGJ_SEP_COLON_1_SPACE,
sch_type, true, b);
sgj_hr_js_vi(jsp, jo2p, 4, "Logical blocks per physical block "
@@ -1906,7 +1905,7 @@ decode_format_presets_vpd(uint8_t * buff, int len, struct opts_t * op,
u = bp[40 + 3] & 0x7;
sgj_hr_js_vistr(jsp, jo3p, 6, "Designed zone alignment method",
SGJ_SEP_COLON_1_SPACE, u, true,
- get_zone_align_method(u, b, blen));
+ get_zone_align_method(u, d, dlen));
ul = sg_get_unaligned_be64(bp + 40 + 4);
sgj_hr_js_vi_nex(jsp, jo3p, 6, "Designed zone starting LBA "
"granularity", SGJ_SEP_COLON_1_SPACE, ul, true,
@@ -1961,3 +1960,40 @@ decode_format_presets_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
}
+
+/* VPD_CON_POS_RANGE 0xb9 (added sbc5r01) */
+void
+decode_con_pos_range_vpd(uint8_t * buff, int len, struct opts_t * op,
+ sgj_opaque_p jap)
+{
+ int k;
+ uint32_t u;
+ sgj_state * jsp = &op->json_st;
+ uint8_t * bp;
+ sgj_opaque_p jo2p;
+
+ if (op->do_hex) {
+ hex2stdout(buff, len, (1 == op->do_hex) ? 0 : -1);
+ return;
+ }
+ if (len < 64) {
+ pr2serr("VPD page length too short=%d\n", len);
+ return;
+ }
+ len -= 64;
+ bp = buff + 64;
+ for (k = 0; k < len; k += 32, bp += 32) {
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_hr_js_vi(jsp, jo2p, 2, "LBA range number",
+ SGJ_SEP_COLON_1_SPACE, bp[0], true);
+ u = bp[1];
+ sgj_hr_js_vistr(jsp, jo2p, 4, "Number of storage elements",
+ SGJ_SEP_COLON_1_SPACE, u, true,
+ (0 == u ? nr_s : NULL));
+ sgj_hr_js_vi(jsp, jo2p, 4, "Starting LBA", SGJ_SEP_COLON_1_SPACE,
+ sg_get_unaligned_be64(bp + 8), true);
+ sgj_hr_js_vi(jsp, jo2p, 4, "Number of LBAs", SGJ_SEP_COLON_1_SPACE,
+ sg_get_unaligned_be64(bp + 16), true);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
+ }
+}
diff --git a/src/sg_vpd_common.h b/src/sg_vpd_common.h
index 0571ece1..73233524 100644
--- a/src/sg_vpd_common.h
+++ b/src/sg_vpd_common.h
@@ -172,6 +172,8 @@ void decode_block_limits_ext_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_opaque_p jop);
void decode_format_presets_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_opaque_p jap);
+void decode_con_pos_range_vpd(uint8_t * buff, int len, struct opts_t * op,
+ sgj_opaque_p jap);
const char * pqual_str(int pqual);
void svpd_enumerate_vendor(int vend_prod_num);
diff --git a/src/sg_z_act_query.c b/src/sg_z_act_query.c
index cd347820..f0e0688f 100644
--- a/src/sg_z_act_query.c
+++ b/src/sg_z_act_query.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2021 Douglas Gilbert.
+ * Copyright (c) 2014-2022 Douglas Gilbert.
* All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the BSD_LICENSE file.
@@ -38,7 +38,7 @@
* command to the given SCSI device. Based on zbc2r12.pdf .
*/
-static const char * version_str = "1.03 20211217";
+static const char * version_str = "1.04 20220729";
#define SG_ZBC_IN_CMDLEN 16
#define Z_ACTIVATE_SA 0x8
@@ -556,8 +556,6 @@ main(int argc, char * argv[])
if (SG_LIB_CAT_INVALID_OP == res)
pr2serr("%s command not supported\n", sa_name);
else {
- char b[80];
-
sg_get_category_sense_str(res, sizeof(b), b, verbose);
pr2serr("%s command: %s\n", sa_name, b);
}
diff --git a/src/sgp_dd.c b/src/sgp_dd.c
index a36d9d03..e88f3330 100644
--- a/src/sgp_dd.c
+++ b/src/sgp_dd.c
@@ -390,9 +390,9 @@ tsafe_strerror(int code, char * ebp)
* ISBN 0-201-63392-2 . [Highly recommended book.] Changed __FILE__
* to __func__ */
#define err_exit(code,text) do { \
- char strerr_buff[STRERR_BUFF_LEN + 1]; \
+ char _strerr_buff[STRERR_BUFF_LEN + 1]; \
pr2serr("%s at \"%s\":%d: %s\n", \
- text, __func__, __LINE__, tsafe_strerror(code, strerr_buff)); \
+ text, __func__, __LINE__, tsafe_strerror(code, _strerr_buff)); \
exit(1); \
} while (0)