aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2022-01-28 20:51:37 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2022-01-28 20:51:37 +0000
commitd5890d56b6bcb6d1aa277f0bab78abb1ef66a88e (patch)
tree7040a74064a5c63a64b95e577e402fb65aacb15e /src
parentbff5298804af11eab5072217d362f55707849a5a (diff)
downloadsg3_utils-d5890d56b6bcb6d1aa277f0bab78abb1ef66a88e.tar.gz
cleanup masks for PDT [0x1f] and group_number [0x3f]
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@934 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src')
-rw-r--r--src/sg_compare_and_write.c6
-rw-r--r--src/sg_format.c8
-rw-r--r--src/sg_inq.c26
-rw-r--r--src/sg_logs.c168
-rw-r--r--src/sg_opcodes.c8
-rw-r--r--src/sg_rep_zones.c56
-rw-r--r--src/sg_sanitize.c6
-rw-r--r--src/sg_scan_linux.c2
-rw-r--r--src/sg_scan_win32.c6
-rw-r--r--src/sg_ses.c6
-rw-r--r--src/sg_sync.c2
-rw-r--r--src/sg_vpd.c66
-rw-r--r--src/sg_wr_mode.c2
-rw-r--r--src/sg_write_same.c10
-rw-r--r--src/sg_write_verify.c8
-rw-r--r--src/sg_write_x.c10
16 files changed, 196 insertions, 194 deletions
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c
index 0a307003..89bb18b8 100644
--- a/src/sg_compare_and_write.c
+++ b/src/sg_compare_and_write.c
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2012-2021, Kaminario Technologies LTD
+* Copyright (c) 2012-2022, Kaminario Technologies LTD
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -56,7 +56,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.31 20211114";
+static const char * version_str = "1.32 20220127";
#define DEF_BLOCK_SIZE 512
#define DEF_NUM_BLOCKS (1)
@@ -339,7 +339,7 @@ sg_build_scsi_cdb(uint8_t * cdbp, unsigned int blocks,
sg_put_unaligned_be64((uint64_t)start_block, cdbp + 2);
/* cdbp[10-12] are reserved */
cdbp[13] = (uint8_t)(blocks & 0xff);
- cdbp[14] = (uint8_t)(flags.group & 0x1f);
+ cdbp[14] = (uint8_t)(flags.group & GRPNUM_MASK);
return 0;
}
diff --git a/src/sg_format.c b/src/sg_format.c
index b6620ab2..19d1203a 100644
--- a/src/sg_format.c
+++ b/src/sg_format.c
@@ -6,7 +6,7 @@
*
* Copyright (C) 2003 Grant Grundler grundler at parisc-linux dot org
* Copyright (C) 2003 James Bottomley jejb at parisc-linux dot org
- * Copyright (C) 2005-2021 Douglas Gilbert dgilbert at interlog dot com
+ * Copyright (C) 2005-2022 Douglas Gilbert dgilbert at interlog dot com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@
#include "sg_pr2serr.h"
#include "sg_pt.h"
-static const char * version_str = "1.64 20211114";
+static const char * version_str = "1.65 20220127";
#define RW_ERROR_RECOVERY_PAGE 1 /* can give alternate with --mode=MP */
@@ -909,7 +909,7 @@ print_dev_id(int fd, uint8_t * sinq_resp, int max_rlen,
n = SAFE_STD_INQ_RESP_LEN;
memcpy(sinq_resp, b, (n < max_rlen) ? n : max_rlen);
if (n == SAFE_STD_INQ_RESP_LEN) {
- pdt = b[0] & 0x1f;
+ pdt = b[0] & PDT_MASK;
printf(" %.8s %.16s %.4s peripheral_type: %s [0x%x]\n",
(const char *)(b + 8), (const char *)(b + 16),
(const char *)(b + 32),
@@ -1586,7 +1586,7 @@ main(int argc, char **argv)
} else
goto out;
} else
- pdt = 0x1f & inq_resp[0];
+ pdt = PDT_MASK & inq_resp[0];
if (op->format) {
if ((PDT_DISK != pdt) && (PDT_OPTICAL != pdt) &&
(PDT_RBC != pdt)) {
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 7540797e..38b033b6 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -1067,7 +1067,7 @@ decode_supported_vpd(uint8_t * buff, int len, int do_hex)
pr2serr("Supported VPD pages VPD page length too short=%d\n", len);
return;
}
- pdt = 0x1f & buff[0];
+ pdt = PDT_MASK & buff[0];
rlen = buff[3] + 4;
if (rlen > len)
pr2serr("Supported VPD pages VPD page truncated, indicates %d, got "
@@ -2187,7 +2187,7 @@ decode_b0_vpd(uint8_t * buff, int len, int do_hex)
hex2stdout(buff, len, (1 == do_hex) ? 0 : -1);
return;
}
- pdt = 0x1f & buff[0];
+ pdt = PDT_MASK & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 16) {
@@ -2333,7 +2333,7 @@ decode_b1_vpd(uint8_t * buff, int len, int do_hex)
hex2stdout(buff, len, (1 == do_hex) ? 0 : -1);
return;
}
- pdt = 0x1f & buff[0];
+ pdt = PDT_MASK & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 64) {
@@ -2408,7 +2408,7 @@ decode_b3_vpd(uint8_t * buff, int len, int do_hex)
hex2stdout(buff, len, (1 == do_hex) ? 0 : -1);
return;
}
- pdt = 0x1f & buff[0];
+ pdt = PDT_MASK & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
if (len < 0x10) {
@@ -2811,7 +2811,7 @@ std_inq_decode(const struct opts_t * op, int act_len)
* [spc-r11a (1997)] bits 6,7: ISO/IEC version; bits 3-5: ECMA
* version; bits 0-2: SCSI version */
ansi_version = rp[2] & 0x7; /* Only take SCSI version */
- peri_type = rp[0] & 0x1f;
+ peri_type = rp[0] & PDT_MASK;
if (op->do_export) {
printf("SCSI_TPGS=%d\n", (rp[5] & 0x30) >> 4);
cp = sg_get_pdt_str(peri_type, sizeof(buff), buff);
@@ -3194,7 +3194,7 @@ cmddt_process(int sg_fd, const struct opts_t * op)
res = sg_ll_inquiry(sg_fd, true /* cmddt */, false, k, rsp_buff,
DEF_ALLOC_LEN, true, op->verbose);
if (0 == res) {
- peri_type = rsp_buff[0] & 0x1f;
+ peri_type = rsp_buff[0] & PDT_MASK;
support_num = rsp_buff[1] & 7;
reserved_cmddt = rsp_buff[4];
if ((3 == support_num) || (5 == support_num)) {
@@ -3227,7 +3227,7 @@ cmddt_process(int sg_fd, const struct opts_t * op)
res = sg_ll_inquiry(sg_fd, true /* cmddt */, false, op->page_num,
rsp_buff, DEF_ALLOC_LEN, true, op->verbose);
if (0 == res) {
- peri_type = rsp_buff[0] & 0x1f;
+ peri_type = rsp_buff[0] & PDT_MASK;
if (! op->do_raw) {
printf("CmdDt INQUIRY, opcode=0x%.2x: [", op->page_num);
sg_get_opcode_name((uint8_t)op->page_num, peri_type,
@@ -3335,7 +3335,7 @@ vpd_mainly_hex(int sg_fd, const struct opts_t * op, int inhex_len)
decode_supported_vpd(rp, len, op->do_hex);
else {
if (op->verbose) {
- cp = sg_get_pdt_str(rp[0] & 0x1f, sizeof(b), b);
+ cp = sg_get_pdt_str(rp[0] & PDT_MASK, sizeof(b), b);
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5, cp);
}
@@ -3395,7 +3395,7 @@ vpd_decode(int sg_fd, const struct opts_t * op, int inhex_len)
else if (op->do_hex)
hex2stdout(rp, len, (1 == op->do_hex) ? 0 : -1);
else
- decode_supported_vpd(rp, len, 0x1f & rp[0]);
+ decode_supported_vpd(rp, len, PDT_MASK & rp[0]);
break;
case VPD_UNIT_SERIAL_NUM:
if (! op->do_raw && ! op->do_export && (op->do_hex < 2))
@@ -3538,7 +3538,7 @@ vpd_decode(int sg_fd, const struct opts_t * op, int inhex_len)
case 0xb0: /* VPD pages in B0h to BFh range depend on pdt */
res = vpd_fetch_page_from_dev(sg_fd, rp, pn, mxlen, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -3566,7 +3566,7 @@ vpd_decode(int sg_fd, const struct opts_t * op, int inhex_len)
case 0xb1: /* VPD pages in B0h to BFh range depend on pdt */
res = vpd_fetch_page_from_dev(sg_fd, rp, pn, mxlen, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -3604,7 +3604,7 @@ vpd_decode(int sg_fd, const struct opts_t * op, int inhex_len)
case 0xb3: /* VPD pages in B0h to BFh range depend on pdt */
res = vpd_fetch_page_from_dev(sg_fd, rp, pn, mxlen, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (! op->do_raw && (op->do_hex < 2)) {
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL:
@@ -4230,7 +4230,7 @@ main(int argc, char * argv[])
op->do_raw = 0; /* don't want raw on output with --inhex= */
if (-1 == op->page_num) { /* may be able to deduce VPD page */
if (op->page_pdt < 0)
- op->page_pdt = 0x1f & rsp_buff[0];
+ op->page_pdt = PDT_MASK & rsp_buff[0];
if ((0x2 == (0xf & rsp_buff[3])) && (rsp_buff[2] > 2)) {
if (op->verbose)
pr2serr("Guessing from --inhex= this is a standard "
diff --git a/src/sg_logs.c b/src/sg_logs.c
index de5d339e..26e1b477 100644
--- a/src/sg_logs.c
+++ b/src/sg_logs.c
@@ -36,7 +36,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.92 20220114"; /* spc6r06 + sbc5r01 */
+static const char * version_str = "1.93 20220127"; /* spc6r06 + sbc5r01 */
#define MX_ALLOC_LEN (0xfffc)
#define SHORT_RESP_LEN 128
@@ -5046,6 +5046,7 @@ static bool
show_zoned_block_dev_stats(const uint8_t * resp, int len,
const struct opts_t * op)
{
+ bool trunc, bad_pl;
int num, pl, pc;
const uint8_t * bp;
char str[PCB_STR_LEN];
@@ -5055,8 +5056,12 @@ show_zoned_block_dev_stats(const uint8_t * resp, int len,
num = len - 4;
bp = &resp[0] + 4;
while (num > 3) {
+ trunc = false;
+ bad_pl = false;
pc = sg_get_unaligned_be16(bp + 0);
pl = bp[3] + 4;
+ if (4 == pl) /* DC HC560 has empty descriptors */
+ goto skip;
if (op->filter_given) {
if (pc != op->filter)
goto skip;
@@ -5070,166 +5075,135 @@ show_zoned_block_dev_stats(const uint8_t * resp, int len,
}
switch (pc) {
case 0x0:
- printf(" Maximum open zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Maximum open zones: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x1:
- printf(" Maximum explicitly open zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Maximum explicitly open zones: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x2:
- printf(" Maximum implicitly open zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Maximum implicitly open zones: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x3:
- printf(" Minimum empty zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Minimum empty zones: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x4:
- printf(" Maximum non-sequential zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Maximum non-sequential zones: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x5:
- printf(" Zones emptied:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Zones emptied: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x6:
- printf(" Suboptimal write commands:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Suboptimal write commands: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x7:
- printf(" Commands exceeding optimal limit:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Commands exceeding optimal limit: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x8:
- printf(" Failed explicit opens:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Failed explicit opens: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0x9:
- printf(" Read rule violations:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Read rule violations: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0xa:
- printf(" Write rule violations:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Write rule violations: %" PRIu32 "\n",
+ sg_get_unaligned_be32(bp + 8));
break;
case 0xb: /* added zbc2r04 */
- printf(" Maximum implicitly open or before required zones:");
if ((pl < 8) || (num < 8)) {
if (num < 8)
- pr2serr("\n truncated by response length, expected "
- "at least 8 bytes\n");
+ trunc = true;
else
- pr2serr("\n parameter length >= 8 expected, got %d\n",
- pl);
- break;
- }
- printf(" %" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
+ bad_pl = true;
+ } else
+ printf(" Maximum implicitly open or before required zones: "
+ "%" PRIu32 "\n", sg_get_unaligned_be32(bp + 8));
break;
default:
printf(" Reserved [parameter_code=0x%x]:\n", pc);
hex2stdout(bp, ((pl < num) ? pl : num), 0);
break;
}
+ if (trunc)
+ pr2serr(" truncated by response length, expected at least "
+ "8 bytes\n");
+ if (bad_pl)
+ pr2serr(" parameter length >= 8 expected, got %d\n", pl);
if (op->do_pcb)
printf(" <%s>\n", get_pcb_str(bp[2], str, sizeof(str)));
if (op->filter_given)
diff --git a/src/sg_opcodes.c b/src/sg_opcodes.c
index 54b90723..944a3e76 100644
--- a/src/sg_opcodes.c
+++ b/src/sg_opcodes.c
@@ -1,5 +1,5 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 2004-2021 D. Gilbert
+ * Copyright (C) 2004-2022 D. Gilbert
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -33,7 +33,7 @@
#include "sg_pt.h"
-static const char * version_str = "0.72 20211221"; /* spc6r05 */
+static const char * version_str = "0.73 20220127"; /* spc6r06 */
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -393,7 +393,7 @@ new_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
n = sg_get_num(optarg);
else if ((2 == strlen(optarg)) && (0 == strcmp("-1", optarg)))
n = -1;
- if ((n < -1) || (n > 0x1f)) {
+ if ((n < -1) || (n > PDT_MAX)) {
pr2serr("bad argument to '--pdt=DT', expect -1 to 31\n");
return SG_LIB_SYNTAX_ERROR;
}
@@ -539,7 +539,7 @@ old_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
op->opcode = n;
} else if (0 == strncmp("p=", cp, 2)) {
num = sscanf(cp + 2, "%d", &n);
- if ((1 != num) || (n > 0x1f) || (n < -1)) {
+ if ((1 != num) || (n > PDT_MAX) || (n < -1)) {
pr2serr("Bad number after 'p=' option, expect -1 to "
"31\n");
return SG_LIB_SYNTAX_ERROR;
diff --git a/src/sg_rep_zones.c b/src/sg_rep_zones.c
index 2e719e75..02c8953c 100644
--- a/src/sg_rep_zones.c
+++ b/src/sg_rep_zones.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.
@@ -39,8 +39,9 @@
* Based on zbc2r10.pdf
*/
-static const char * version_str = "1.29 20211117";
+static const char * version_str = "1.30 20220128";
+#define WILD_RZONES_BUFF_LEN (1 << 28)
#define MAX_RZONES_BUFF_LEN (1024 * 1024)
#define DEF_RZONES_BUFF_LEN (1024 * 8)
@@ -54,6 +55,7 @@ static const char * version_str = "1.29 20211117";
#define DEF_PT_TIMEOUT 60 /* 60 seconds */
struct opts_t {
+ bool do_brief;
bool do_force;
bool do_partial;
bool do_raw;
@@ -76,6 +78,7 @@ struct opts_t {
static struct option long_options[] = {
+ {"brief", no_argument, 0, 'b'}, /* only header and last descriptor */
{"domain", no_argument, 0, 'd'},
{"domains", no_argument, 0, 'd'},
{"force", no_argument, 0, 'f'},
@@ -108,10 +111,11 @@ usage(int h)
"sg_rep_zones [--domain] [--force] [--help] [--hex] "
"[--inhex=FN]\n"
" [--locator=LBA] [--maxlen=LEN] "
- "[--partial] [--raw]\n"
- " [--readonly] [--realm] [--report=OPT] "
- "[--start=LBA]\n"
- " [--verbose] [--version] DEVICE\n");
+ "[--partial] [--only]\n"
+ " [--raw] [--readonly] [--realm] "
+ "[--report=OPT]\n"
+ " [--start=LBA] [--verbose] [--version] "
+ "DEVICE\n");
pr2serr(" where:\n"
" --domain|-d sends a REPORT ZONE DOMAINS command\n"
" --force|-f bypass some sanity checks when decoding "
@@ -128,6 +132,8 @@ usage(int h)
" (def: 0 -> 8192 bytes)\n"
" --num=NUM|-n NUM number of zones to output (def: 0 -> "
"all)\n"
+ " --only|-o output header and starting LBA of "
+ "next\n"
" --partial|-p sets PARTIAL bit in cdb (def: 0 -> "
"zone list\n"
" length not altered by allocation length "
@@ -317,7 +323,7 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
{
uint8_t zt;
int k, same, zc, num_zd;
- uint64_t wp;
+ uint64_t wp, ul, ul2, mx_lba;
const uint8_t * bp;
char b[80];
@@ -334,10 +340,10 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
} else
num_zd = (decod_len - 64) / 64;
same = rzBuff[4] & 0xf;
+ mx_lba = sg_get_unaligned_be64(rzBuff + 8);
if (! op->wp_only) {
printf(" Same=%d: %s\n", same, same_desc_arr[same]);
- printf(" Maximum LBA: 0x%" PRIx64 "\n\n",
- sg_get_unaligned_be64(rzBuff + 8));
+ printf(" Maximum LBA: 0x%" PRIx64 "\n\n", mx_lba);
printf(" Reported zone starting LBA granularity: 0x%" PRIx64 "\n\n",
sg_get_unaligned_be64(rzBuff + 16)); /* zbc2r12 */
}
@@ -348,6 +354,20 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
"value less than %d\n", num_zd);
return SG_LIB_CAT_MALFORMED;
}
+ if (op->do_brief && (num_zd > 0)) {
+ bp = rzBuff + 64 + ((num_zd - 1) * 64);
+ printf("From last descriptor in this response:\n");
+ ul = sg_get_unaligned_be64(bp + 16);
+ printf(" Zone start LBA: 0x%" PRIx64 "\n", ul);
+ ul2 = sg_get_unaligned_be64(bp + 8);
+ printf(" Zone Length: 0x%" PRIx64 "\n", ul2);
+ ul = ul + ul2;
+ if (ul > mx_lba)
+ printf(" This zone seems to be the last one\n");
+ else
+ printf(" Probable next Zone start LBA: 0x%" PRIx64 "\n", ul);
+ return 0;
+ }
for (k = 0, bp = rzBuff + 64; k < num_zd; ++k, bp += 64) {
if (! op->wp_only)
printf(" Zone descriptor: %d\n", k);
@@ -356,7 +376,11 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
continue;
}
if (op->wp_only) {
- printf("0x%" PRIx64 "\n", sg_get_unaligned_be64(bp + 24));
+ wp = sg_get_unaligned_be64(bp + 24);
+ if (sg_all_ffs((const uint8_t *)&wp, sizeof(wp)))
+ printf("-1\n");
+ else
+ printf("0x%" PRIx64 "\n", wp);
continue;
}
zt = bp[0] & 0xf;
@@ -531,12 +555,15 @@ main(int argc, char * argv[])
while (1) {
int option_index = 0;
- c = getopt_long(argc, argv, "defhHi:l:m:n:o:prRs:vVw", long_options,
+ c = getopt_long(argc, argv, "bdefhHi:l:m:n:o:prRs:vVw", long_options,
&option_index);
if (c == -1)
break;
switch (c) {
+ case 'b':
+ op->do_brief = true;
+ break;
case 'd':
op->do_zdomains = true;
serv_act = REPORT_ZONE_DOMAINS_SA;
@@ -744,7 +771,7 @@ start_response:
goto the_end;
}
decod_len = sg_get_unaligned_be32(rzBuff + 0) + 64;
- if (decod_len > MAX_RZONES_BUFF_LEN) {
+ if (decod_len > WILD_RZONES_BUFF_LEN) {
if (! op->do_force) {
pr2serr("decode length [%u bytes] seems wild, use --force "
"override\n", decod_len);
@@ -753,8 +780,9 @@ start_response:
}
if (decod_len > (uint32_t)rlen) {
if ((REPORT_ZONES_SA == serv_act) && (! op->do_partial)) {
- printf("%u zones available but only %d zones returned\n",
- (decod_len - 64) / 64, (rlen - 64) / 64);
+ printf("%u zones starting from LBA 0x%" PRIx64 " available "
+ "but only %d zones returned\n",
+ (decod_len - 64) / 64, op->st_lba, (rlen - 64) / 64);
decod_len = rlen;
act_len = rlen;
} else {
diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c
index ade9be71..147898fe 100644
--- a/src/sg_sanitize.c
+++ b/src/sg_sanitize.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2021 Douglas Gilbert.
+ * Copyright (c) 2011-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.
@@ -33,7 +33,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.17 20211114";
+static const char * version_str = "1.18 20220127";
/* Not all environments support the Unix sleep() */
#if defined(MSC_VER) || defined(__MINGW32__)
@@ -368,7 +368,7 @@ print_dev_id(int fd, uint8_t * sinq_resp, int max_rlen, int verbose)
n = SAFE_STD_INQ_RESP_LEN;
memcpy(sinq_resp, b, (n < max_rlen) ? n : max_rlen);
if (n == SAFE_STD_INQ_RESP_LEN) {
- pdt = b[0] & 0x1f;
+ pdt = b[0] & PDT_MASK;
printf(" %.8s %.16s %.4s peripheral_type: %s [0x%x]\n",
(const char *)(b + 8), (const char *)(b + 16),
(const char *)(b + 32),
diff --git a/src/sg_scan_linux.c b/src/sg_scan_linux.c
index c04206a1..9fa3374a 100644
--- a/src/sg_scan_linux.c
+++ b/src/sg_scan_linux.c
@@ -452,7 +452,7 @@ int sg3_inq(int sg_fd, uint8_t * inqBuff, bool do_extra)
printf(" %.8s %.16s %.4s ", p + 8, p + 16, p + 32);
printf("[rmb=%d cmdq=%d pqual=%d pdev=0x%x] ",
!!(p[1] & 0x80), !!(p[7] & 2), (p[0] & 0xe0) >> 5,
- (p[0] & 0x1f));
+ (p[0] & PDT_MASK));
if (do_extra && sg_io)
printf("dur=%ums\n", io_hdr.duration);
else
diff --git a/src/sg_scan_win32.c b/src/sg_scan_win32.c
index 4ba59836..06851497 100644
--- a/src/sg_scan_win32.c
+++ b/src/sg_scan_win32.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018 Douglas Gilbert.
+ * Copyright (c) 2006-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.
@@ -43,7 +43,7 @@
#include "sg_pt_win32.h"
-static const char * version_str = "1.22 (win32) 20181110";
+static const char * version_str = "1.23 (win32) 20220127";
#define MAX_SCSI_ELEMS 4096
#define MAX_ADAPTER_NUM 256
@@ -366,7 +366,7 @@ enum_scsi_adapters(void)
printf("%-15s", b);
snprintf(b, sizeof(b) - 1, "claimed=%d pdt=%xh %s ",
pid->DeviceClaimed,
- pid->InquiryData[0] % 0x3f,
+ pid->InquiryData[0] % PDT_MASK,
((0 == pid->InquiryData[4]) ? "dubious" :
""));
printf("%-26s", b);
diff --git a/src/sg_ses.c b/src/sg_ses.c
index 9b16134b..aa545a87 100644
--- a/src/sg_ses.c
+++ b/src/sg_ses.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2021 Douglas Gilbert.
+ * Copyright (c) 2004-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 @@
* commands tailored for SES (enclosure) devices.
*/
-static const char * version_str = "2.54 20211028"; /* ses4r04 */
+static const char * version_str = "2.55 20220127"; /* ses4r04 */
#define MX_ALLOC_LEN ((64 * 1024) - 4) /* max allowable for big enclosures */
#define MX_ELEM_HDR 1024
@@ -5750,7 +5750,7 @@ main(int argc, char * argv[])
pr2serr("Short INQUIRY response, not looking good\n");
printf(" %.8s %.16s %.4s\n", inq_rsp + 8, inq_rsp + 16,
inq_rsp + 32);
- pd_type = 0x1f & inq_rsp[0];
+ pd_type = PDT_MASK & inq_rsp[0];
cp = sg_get_pdt_str(pd_type, sizeof(buff), buff);
if (0xd == pd_type) {
if (vb)
diff --git a/src/sg_sync.c b/src/sg_sync.c
index 1a8eebfb..a5d6ce8d 100644
--- a/src/sg_sync.c
+++ b/src/sg_sync.c
@@ -109,7 +109,7 @@ sg_ll_sync_cache_16(int sg_fd, bool sync_nv, bool immed, int group,
if (immed)
sc_cdb[1] |= 2;
sg_put_unaligned_be64(lba, sc_cdb + 2);
- sc_cdb[14] = group & 0x1f;
+ sc_cdb[14] = group & GRPNUM_MASK;
sg_put_unaligned_be32((uint32_t)num_lb, sc_cdb + 10);
if (verbose) {
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index 1a74af52..46b7e603 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -504,7 +504,7 @@ std_inq_decode(uint8_t * b, int len, int verbose)
else
printf(" [reserved or vendor specific qualifier [%d]]\n", pqual);
printf(" PQual=%d PDT=%d RMB=%d LU_CONG=%d hot_pluggable=%d "
- "version=0x%02x ", pqual, b[0] & 0x1f, !!(b[1] & 0x80),
+ "version=0x%02x ", pqual, b[0] & PDT_MASK, !!(b[1] & 0x80),
!!(b[1] & 0x40), (b[1] >> 4) & 0x3, (unsigned int)b[2]);
printf(" [%s]\n", sg_ansi_version_arr[b[2] & 0xf]);
printf(" [AERC=%d] [TrmTsk=%d] NormACA=%d HiSUP=%d "
@@ -1308,8 +1308,8 @@ decode_dev_constit_vpd(const uint8_t * buff, int len, struct opts_t * op)
else if (bp[2] >= 0x20)
printf("Reserved [0x%x]\n", bp[2]);
else
- printf("%s [0x%x]\n", sg_get_pdt_str(0x1f & bp[2], sizeof(b), b),
- bp[2]);
+ printf("%s [0x%x]\n",
+ sg_get_pdt_str(PDT_MASK & bp[2], sizeof(b), b), bp[2]);
printf(" Vendor_identification: %.8s\n", bp + 4);
printf(" Product_identification: %.16s\n", bp + 12);
printf(" Product_revision_level: %.4s\n", bp + 28);
@@ -2562,11 +2562,11 @@ decode_zbdch_vpd(uint8_t * b, int len, int do_hex)
return;
}
printf(" Peripheral device type: %s\n",
- sg_get_pdt_str(0x1f & b[0], sizeof(d), d));
+ sg_get_pdt_str(PDT_MASK & b[0], sizeof(d), d));
printf(" Zoned block device extension: ");
switch ((b[4] >> 4) & 0xf) {
case 0:
- if (PDT_ZBC == (0x1f & b[0]))
+ if (PDT_ZBC == (PDT_MASK & b[0]))
printf("host managed zoned block device [0, pdt=0x14]\n");
else
printf("not reported [0]\n");
@@ -2920,7 +2920,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
else if (op->do_hex)
hex2stdout(rp, len, (1 == op->do_hex) ? 0 : -1);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -2967,7 +2967,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
else if (op->do_hex)
hex2stdout(rp, len, (1 == op->do_hex) ? 0 : -1);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -2995,7 +2995,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
else if (op->do_hex)
hex2stdout(rp, len, (1 == op->do_hex) ? 0 : -1);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3016,7 +3016,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3064,7 +3064,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
} else
protect = !!(sir.byte_5 & 0x1); /* SPC-3 and later */
}
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3085,7 +3085,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3106,7 +3106,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3136,7 +3136,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
else if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3157,7 +3157,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3193,7 +3193,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3216,7 +3216,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
else if (1 == op->do_hex)
hex2stdout(rp, len, 0);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3237,7 +3237,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rsp_buff[0] & 0x1f;
+ pdt = rsp_buff[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3258,7 +3258,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3279,7 +3279,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3292,7 +3292,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb0: /* depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Block limits VPD page (SBC):";
@@ -3314,7 +3314,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3329,7 +3329,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb1: /* depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Block device characteristics VPD page (SBC):";
@@ -3368,7 +3368,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb2: /* VPD page depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Logical block provisioning VPD page (SBC):";
@@ -3401,7 +3401,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb3: /* VPD page depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Referrals VPD page (SBC):";
@@ -3434,7 +3434,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb4: /* VPD page depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Supported block lengths and protection types VPD page "
@@ -3468,7 +3468,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb5: /* VPD page depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Block device characteristics extension VPD page (SBC):";
@@ -3501,7 +3501,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case VPD_ZBC_DEV_CHARS: /* 0xb6 for both pdt=0 and pdt=0x14 */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Zoned block device characteristics VPD page (SBC, "
@@ -3532,7 +3532,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb7:
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Block limits extension VPD page (SBC):";
@@ -3548,7 +3548,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3563,7 +3563,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb8: /* VPD_FORMAT_PRESETS */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
np = "Format presets VPD page (SBC):";
@@ -3579,7 +3579,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
@@ -3594,7 +3594,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
case 0xb9: /* VPD_CON_POS_RANGE */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
- pdt = rp[0] & 0x1f;
+ 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):";
@@ -3610,7 +3610,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, int subvalue, int off,
if (op->do_raw)
dStrRaw(rp, len);
else {
- pdt = rp[0] & 0x1f;
+ pdt = rp[0] & PDT_MASK;
if (vb || long_notquiet)
printf(" [PQual=%d Peripheral device type: %s]\n",
(rp[0] & 0xe0) >> 5,
diff --git a/src/sg_wr_mode.c b/src/sg_wr_mode.c
index 2a10fb7c..b2dff407 100644
--- a/src/sg_wr_mode.c
+++ b/src/sg_wr_mode.c
@@ -502,7 +502,7 @@ main(int argc, char * argv[])
if (0 == sg_simple_inquiry(sg_fd, &inq_data, false, verbose))
pdt = inq_data.peripheral_type;
else
- pdt = 0x1f;
+ pdt = PDT_UNKNOWN;
/* do MODE SENSE to fetch current values */
memset(ref_md, 0, MX_ALLOC_LEN);
diff --git a/src/sg_write_same.c b/src/sg_write_same.c
index e2213fba..011deb99 100644
--- a/src/sg_write_same.c
+++ b/src/sg_write_same.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2021 Douglas Gilbert.
+ * Copyright (c) 2009-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.
@@ -33,7 +33,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.33 20211114";
+static const char * version_str = "1.34 20220127";
#define ME "sg_write_same: "
@@ -209,7 +209,7 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
if (op->lbdata)
ws_cdb[1] |= 0x2;
sg_put_unaligned_be32((uint32_t)op->lba, ws_cdb + 2);
- ws_cdb[6] = (op->grpnum & 0x1f);
+ ws_cdb[6] = (op->grpnum & GRPNUM_MASK);
sg_put_unaligned_be16((uint16_t)op->numblocks, ws_cdb + 7);
break;
case WRITE_SAME16_LEN:
@@ -227,11 +227,11 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
ws_cdb[1] |= 0x1;
sg_put_unaligned_be64(op->lba, ws_cdb + 2);
sg_put_unaligned_be32((uint32_t)op->numblocks, ws_cdb + 10);
- ws_cdb[14] = (op->grpnum & 0x1f);
+ ws_cdb[14] = (op->grpnum & GRPNUM_MASK);
break;
case WRITE_SAME32_LEN:
ws_cdb[0] = VARIABLE_LEN_OP;
- ws_cdb[6] = (op->grpnum & 0x1f);
+ ws_cdb[6] = (op->grpnum & GRPNUM_MASK);
ws_cdb[7] = WRITE_SAME32_ADD;
sg_put_unaligned_be16((uint16_t)WRITE_SAME32_SA, ws_cdb + 8);
ws_cdb[10] = ((op->wrprotect & 0x7) << 5);
diff --git a/src/sg_write_verify.c b/src/sg_write_verify.c
index 384899b2..e2af4019 100644
--- a/src/sg_write_verify.c
+++ b/src/sg_write_verify.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.
@@ -40,7 +40,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.20 20211114";
+static const char * version_str = "1.21 20220127";
#define ME "sg_write_verify: "
@@ -215,7 +215,7 @@ sg_ll_write_verify10(int sg_fd, int wrprotect, bool dpo, int bytchk,
wv_cdb[1] |= ((bytchk & 0x3) << 1);
sg_put_unaligned_be32((uint32_t)lba, wv_cdb + 2);
- wv_cdb[6] = group & 0x1f;
+ wv_cdb[6] = group & GRPNUM_MASK;
sg_put_unaligned_be16((uint16_t)num_lb, wv_cdb + 7);
ret = run_scsi_transaction(sg_fd, wv_cdb, sizeof(wv_cdb), dop, do_len,
timeout, noisy, verbose);
@@ -243,7 +243,7 @@ sg_ll_write_verify16(int sg_fd, int wrprotect, bool dpo, int bytchk,
sg_put_unaligned_be64(llba, wv_cdb + 2);
sg_put_unaligned_be32((uint32_t)num_lb, wv_cdb + 10);
- wv_cdb[14] = group & 0x1f;
+ wv_cdb[14] = group & GRPNUM_MASK;
ret = run_scsi_transaction(sg_fd, wv_cdb, sizeof(wv_cdb), dop, do_len,
timeout, noisy, verbose);
return ret;
diff --git a/src/sg_write_x.c b/src/sg_write_x.c
index 18d1e7ec..81ee1a67 100644
--- a/src/sg_write_x.c
+++ b/src/sg_write_x.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2021 Douglas Gilbert.
+ * Copyright (c) 2017-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 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.29 20211114";
+static const char * version_str = "1.30 20220127";
/* Protection Information refers to 8 bytes of extra information usually
* associated with each logical block and is often abbreviated to PI while
@@ -160,7 +160,7 @@ struct opts_t {
* DLD0, bit 1 --> DLD1, bit 2 --> DLD2
* only WRITE(16) and WRITE SCATTERED(16) */
int dry_run; /* temporary write when used more than once */
- int grpnum; /* "Group Number", 0 to 0x3f */
+ int grpnum; /* "Group Number", 0 to 0x3f (GRPNUM_MASK) */
int help;
int pi_type; /* -1: unknown: 0: type 0 (none): 1: type 1 */
int strict; /* > 0, report then exit on questionable meta data */
@@ -1062,10 +1062,10 @@ do_write_x(int sg_fd, const void * dataoutp, int dout_len,
if (16 == cdb_len) {
if (! op->do_scattered)
sg_put_unaligned_be64(op->lba, x_cdb + 2);
- x_cdb[14] = (op->grpnum & 0x1f);
+ x_cdb[14] = (op->grpnum & GRPNUM_MASK);
} else {
x_cdb[0] = VARIABLE_LEN_OP;
- x_cdb[6] = (op->grpnum & 0x1f);
+ x_cdb[6] = (op->grpnum & GRPNUM_MASK);
x_cdb[7] = WRITE_X_32_ADD;
if (! op->do_scattered)
sg_put_unaligned_be64(op->lba, x_cdb + 12);