aboutsummaryrefslogtreecommitdiff
path: root/src/sg_compare_and_write.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2015-12-20 16:23:44 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2015-12-20 16:23:44 +0000
commit9fbc884d5e7900d4edab95d18dc16d5ca8caa5b5 (patch)
treebeedd798f77493980f389ccc4ef58a3489cfbbaf /src/sg_compare_and_write.c
parente359da1369caf436878cd05386b83b54359ecce1 (diff)
downloadsg3_utils-9fbc884d5e7900d4edab95d18dc16d5ca8caa5b5.tar.gz
rescan-scsi-bus.sh: updates from Suse; sg_lib: add 'sense' categories for SCSI statuses; pr2serr() rework; drop SUGGEST_*
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@654 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_compare_and_write.c')
-rw-r--r--src/sg_compare_and_write.c115
1 files changed, 53 insertions, 62 deletions
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c
index 5e0b052d..e36a18ba 100644
--- a/src/sg_compare_and_write.c
+++ b/src/sg_compare_and_write.c
@@ -51,8 +51,9 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.11 20151207";
+static const char * version_str = "1.13 20151219";
#define DEF_BLOCK_SIZE 512
#define DEF_NUM_BLOCKS (1)
@@ -112,8 +113,7 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_compare_and_write [--dpo] [--fua] [--fua_nv] "
+ pr2serr("Usage: sg_compare_and_write [--dpo] [--fua] [--fua_nv] "
"[--group=GN] [--help]\n"
" --in=IF [--inw=WF] --lba=LBA "
"[--num=NUM]\n"
@@ -204,8 +204,8 @@ parse_args(int argc, char* argv[], struct opts_t * op)
op->flags.group = sg_get_num(optarg);
if ((op->flags.group < 0) ||
(op->flags.group > 31)) {
- fprintf(stderr, "argument to '--group' "
- "expected to be 0 to 31\n");
+ pr2serr("argument to '--group' expected to "
+ "be 0 to 31\n");
goto out_err_no_usage;
}
break;
@@ -216,7 +216,7 @@ parse_args(int argc, char* argv[], struct opts_t * op)
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
goto out_err_no_usage;
}
op->lba = (uint64_t)ll;
@@ -225,8 +225,8 @@ parse_args(int argc, char* argv[], struct opts_t * op)
case 'n':
op->numblocks = sg_get_num(optarg);
if ((op->numblocks < 0) || (op->numblocks > 255)) {
- fprintf(stderr, "bad argument to '--num', "
- "expect 0 to 255\n");
+ pr2serr("bad argument to '--num', expect 0 "
+ "to 255\n");
goto out_err_no_usage;
}
break;
@@ -236,8 +236,7 @@ parse_args(int argc, char* argv[], struct opts_t * op)
case 't':
op->timeout = sg_get_num(optarg);
if (op->timeout < 0) {
- fprintf(stderr, "bad argument to "
- "'--timeout'\n");
+ pr2serr("bad argument to '--timeout'\n");
goto out_err_no_usage;
}
break;
@@ -245,27 +244,25 @@ parse_args(int argc, char* argv[], struct opts_t * op)
++op->verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
exit(0);
case 'w':
op->flags.wrprotect = sg_get_num(optarg);
if (op->flags.wrprotect >> 3) {
- fprintf(stderr, "bad argument to "
- "'--wrprotect' not in range 0-7\n");
+ pr2serr("bad argument to '--wrprotect' not "
+ "in range 0-7\n");
goto out_err_no_usage;
}
break;
case 'x':
op->xfer_len = sg_get_num(optarg);
if (op->xfer_len < 0) {
- fprintf(stderr, "bad argument to "
- "'--xferlen'\n");
+ pr2serr("bad argument to '--xferlen'\n");
goto out_err_no_usage;
}
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n",
- c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
goto out_err;
}
}
@@ -276,21 +273,21 @@ parse_args(int argc, char* argv[], struct opts_t * op)
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: "
- "%s\n", argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n",
+ argv[optind]);
goto out_err;
}
}
if (NULL == op->device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
goto out_err;
}
if (!if_given) {
- fprintf(stderr, "missing input file\n");
+ pr2serr("missing input file\n");
goto out_err;
}
if (!lba_given) {
- fprintf(stderr, "missing lba\n");
+ pr2serr("missing lba\n");
goto out_err;
}
if (0 == op->xfer_len)
@@ -344,14 +341,13 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
uint64_t ull = 0;
if (sg_build_scsi_cdb(cawCmd, blocks, lba, flags)) {
- fprintf(stderr, ME "bad cdb build, lba=0x%" PRIx64 ", "
- "blocks=%d\n", lba, blocks);
+ pr2serr(ME "bad cdb build, lba=0x%" PRIx64 ", blocks=%d\n",
+ lba, blocks);
return -1;
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Could not construct scsit_pt_obj, out of "
- "memory\n");
+ pr2serr("Could not construct scsit_pt_obj, out of memory\n");
return -1;
}
@@ -359,13 +355,13 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
set_scsi_pt_data_out(ptvp, buff, xfer_len);
if (verbose > 1) {
- fprintf(stderr, " Compare and write cdb: ");
+ pr2serr(" Compare and write cdb: ");
for (k = 0; k < COMPARE_AND_WRITE_CDB_SIZE; ++k)
- fprintf(stderr, "%02x ", cawCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", cawCmd[k]);
+ pr2serr("\n");
}
if ((verbose > 2) && (xfer_len > 0)) {
- fprintf(stderr, " Data-out buffer contents:\n");
+ pr2serr(" Data-out buffer contents:\n");
dStrHexErr((const char *)buff, xfer_len, 1);
}
res = do_scsi_pt(ptvp, sg_fd, DEF_TIMEOUT_SECS, verbose);
@@ -385,13 +381,11 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
valid = sg_get_sense_info_fld(sense_b, slen,
&ull);
if (valid)
- fprintf(stderr, "Medium or hardware "
- "error starting at lba=%"
- PRIu64 " [0x%" PRIx64 "]\n",
- ull, ull);
+ pr2serr("Medium or hardware error starting "
+ "at lba=%" PRIu64 " [0x%" PRIx64
+ "]\n", ull, ull);
else
- fprintf(stderr, "Medium or hardware "
- "error\n");
+ pr2serr("Medium or hardware error\n");
ret = sense_cat;
break;
case SG_LIB_CAT_MISCOMPARE:
@@ -401,11 +395,10 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
slen = get_scsi_pt_sense_len(ptvp);
valid = sg_get_sense_info_fld(sense_b, slen, &ull);
if (valid)
- fprintf(stderr, "Miscompare at byte offset: %"
- PRIu64 " [0x%" PRIx64 "]\n", ull,
- ull);
+ pr2serr("Miscompare at byte offset: %" PRIu64
+ " [0x%" PRIx64 "]\n", ull, ull);
else
- fprintf(stderr, "Miscompare reported\n");
+ pr2serr("Miscompare reported\n");
break;
default:
ret = sense_cat;
@@ -428,7 +421,7 @@ open_if(const char * fn, int got_stdin)
else {
fd = open(fn, O_RDONLY);
if (fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", fn,
+ pr2serr(ME "open error: %s: %s\n", fn,
safe_strerror(errno));
return -SG_LIB_FILE_ERROR;
}
@@ -445,7 +438,7 @@ open_dev(const char * outf, int verbose)
{
int sg_fd = sg_cmds_open_device(outf, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", outf,
+ pr2serr(ME "open error: %s: %s\n", outf,
safe_strerror(-sg_fd));
return -SG_LIB_FILE_ERROR;
}
@@ -469,19 +462,18 @@ main(int argc, char * argv[])
memset(op, 0, sizeof(opts));
res = parse_args(argc, argv, op);
if (res != 0) {
- fprintf(stderr, "Failed parsing args\n");
+ pr2serr("Failed parsing args\n");
goto out;
}
if (op->verbose) {
- fprintf(stderr, "Running COMPARE AND WRITE command with the "
+ pr2serr("Running COMPARE AND WRITE command with the "
"following options:\n in=%s ", op->ifn);
if (op->wfn_given)
- fprintf(stderr, "inw=%s ", op->wfn);
- fprintf(stderr, "device=%s\n lba=0x%" PRIx64
- " num_blocks=%d xfer_len=%d timeout=%d\n",
- op->device_name, op->lba, op->numblocks,
- op->xfer_len, op->timeout);
+ pr2serr("inw=%s ", op->wfn);
+ pr2serr("device=%s\n lba=0x%" PRIx64 " num_blocks=%d "
+ "xfer_len=%d timeout=%d\n", op->device_name,
+ op->lba, op->numblocks, op->xfer_len, op->timeout);
}
ifn_stdin = ((1 == strlen(op->ifn)) && ('-' == op->ifn[0]));
infd = open_if(op->ifn, ifn_stdin);
@@ -491,8 +483,7 @@ main(int argc, char * argv[])
}
if (op->wfn_given) {
if ((1 == strlen(op->wfn)) && ('-' == op->wfn[0])) {
- fprintf(stderr, ME "don't allow stdin for write "
- "file\n");
+ pr2serr(ME "don't allow stdin for write file\n");
res = SG_LIB_FILE_ERROR;
goto out;
}
@@ -511,7 +502,7 @@ main(int argc, char * argv[])
wrkBuff = (unsigned char *)malloc(op->xfer_len);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory\n");
+ pr2serr("Not enough user memory\n");
res = SG_LIB_CAT_OTHER;
goto out;
}
@@ -520,30 +511,30 @@ main(int argc, char * argv[])
half_xlen = op->xfer_len / 2;
res = read(infd, wrkBuff, half_xlen);
if (res < 0) {
- fprintf(stderr, "Could not read from %s", op->ifn);
+ pr2serr("Could not read from %s", op->ifn);
goto out;
} else if (res < half_xlen) {
- fprintf(stderr, "Read only %d bytes (expected %d) "
- "from %s\n", res, half_xlen, op->ifn);
+ pr2serr("Read only %d bytes (expected %d) from %s\n",
+ res, half_xlen, op->ifn);
goto out;
}
res = read(wfd, wrkBuff + half_xlen, half_xlen);
if (res < 0) {
- fprintf(stderr, "Could not read from %s", op->wfn);
+ pr2serr("Could not read from %s", op->wfn);
goto out;
} else if (res < half_xlen) {
- fprintf(stderr, "Read only %d bytes (expected %d) "
- "from %s\n", res, half_xlen, op->wfn);
+ pr2serr("Read only %d bytes (expected %d) from %s\n",
+ res, half_xlen, op->wfn);
goto out;
}
} else {
res = read(infd, wrkBuff, op->xfer_len);
if (res < 0) {
- fprintf(stderr, "Could not read from %s", op->ifn);
+ pr2serr("Could not read from %s", op->ifn);
goto out;
} else if (res < op->xfer_len) {
- fprintf(stderr, "Read only %d bytes (expected %d) "
- "from %s\n", res, op->xfer_len, op->ifn);
+ pr2serr("Read only %d bytes (expected %d) from %s\n",
+ res, op->xfer_len, op->ifn);
goto out;
}
}
@@ -562,7 +553,7 @@ out:
default:
sg_get_category_sense_str(res, sizeof(b), b,
op->verbose);
- fprintf(stderr, ME "SCSI COMPARE AND WRITE: %s\n", b);
+ pr2serr(ME "SCSI COMPARE AND WRITE: %s\n", b);
break;
}
}