aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/sg_compare_and_write.c115
-rw-r--r--src/sg_copy_results.c22
-rw-r--r--src/sg_dd.c634
-rw-r--r--src/sg_decode_sense.c85
-rw-r--r--src/sg_emc_trespass.c48
-rw-r--r--src/sg_format.c146
-rw-r--r--src/sg_get_config.c46
-rw-r--r--src/sg_get_lba_status.c96
-rw-r--r--src/sg_ident.c100
-rw-r--r--src/sg_inq.c24
-rw-r--r--src/sg_logs.c28
-rw-r--r--src/sg_luns.c29
-rw-r--r--src/sg_map26.c231
-rw-r--r--src/sg_modes.c36
-rw-r--r--src/sg_opcodes.c84
-rw-r--r--src/sg_persist.c23
-rw-r--r--src/sg_prevent.c55
-rw-r--r--src/sg_raw.c24
-rw-r--r--src/sg_rbuf.c68
-rw-r--r--src/sg_rdac.c39
-rw-r--r--src/sg_read.c257
-rw-r--r--src/sg_read_block_limits.c51
-rw-r--r--src/sg_read_buffer.c79
-rw-r--r--src/sg_read_long.c90
-rw-r--r--src/sg_readcap.c45
-rw-r--r--src/sg_reassign.c130
-rw-r--r--src/sg_referrals.c57
-rw-r--r--src/sg_rep_zones.c26
-rw-r--r--src/sg_requests.c54
-rw-r--r--src/sg_reset.c74
-rw-r--r--src/sg_reset_wp.c26
-rw-r--r--src/sg_rmsn.c64
-rw-r--r--src/sg_rtpg.c70
-rw-r--r--src/sg_safte.c62
-rw-r--r--src/sg_sanitize.c110
-rw-r--r--src/sg_sat_identify.c142
-rw-r--r--src/sg_sat_phy_event.c121
-rw-r--r--src/sg_sat_read_gplog.c22
-rw-r--r--src/sg_sat_set_features.c156
-rw-r--r--src/sg_scan_linux.c13
-rw-r--r--src/sg_scan_win32.c112
-rw-r--r--src/sg_senddiag.c84
-rw-r--r--src/sg_ses.c24
-rw-r--r--src/sg_ses_microcode.c30
-rw-r--r--src/sg_start.c57
-rw-r--r--src/sg_stpg.c145
-rw-r--r--src/sg_sync.c94
-rw-r--r--src/sg_test_rwbuf.c52
-rw-r--r--src/sg_timestamp.c24
-rw-r--r--src/sg_turs.c26
-rw-r--r--src/sg_unmap.c23
-rw-r--r--src/sg_verify.c199
-rw-r--r--src/sg_vpd.c22
-rw-r--r--src/sg_vpd_vendor.c69
-rw-r--r--src/sg_wr_mode.c183
-rw-r--r--src/sg_write_buffer.c24
-rw-r--r--src/sg_write_long.c52
-rw-r--r--src/sg_write_same.c118
-rw-r--r--src/sg_write_verify.c131
-rw-r--r--src/sg_xcopy.c25
-rw-r--r--src/sg_zone.c26
-rw-r--r--src/sgm_dd.c336
-rw-r--r--src/sgp_dd.c321
63 files changed, 2575 insertions, 3184 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;
}
}
diff --git a/src/sg_copy_results.c b/src/sg_copy_results.c
index b8708d46..38d7f9ab 100644
--- a/src/sg_copy_results.c
+++ b/src/sg_copy_results.c
@@ -8,7 +8,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <getopt.h>
@@ -22,6 +21,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
* Copyright (C) 2004-2010 D. Gilbert
@@ -100,26 +100,6 @@ struct descriptor_type segment_descriptor_codes [] = {
{ -1, "" }
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
scsi_failed_segment_details(unsigned char *rcBuff, unsigned int rcBuffLen)
diff --git a/src/sg_dd.c b/src/sg_dd.c
index 0bead3df..d1880048 100644
--- a/src/sg_dd.c
+++ b/src/sg_dd.c
@@ -58,8 +58,9 @@
#include "sg_cmds_extra.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "5.84 20151201";
+static const char * version_str = "5.86 20151219";
#define ME "sg_dd: "
@@ -191,25 +192,23 @@ static void
print_stats(const char * str)
{
if (0 != dd_count)
- fprintf(stderr, " remaining block count=%" PRId64 "\n", dd_count);
- fprintf(stderr, "%s%" PRId64 "+%d records in\n", str,
- in_full - in_partial, in_partial);
- fprintf(stderr, "%s%" PRId64 "+%d records out\n", str,
- out_full - out_partial, out_partial);
+ pr2serr(" remaining block count=%" PRId64 "\n", dd_count);
+ pr2serr("%s%" PRId64 "+%d records in\n", str, in_full - in_partial,
+ in_partial);
+ pr2serr("%s%" PRId64 "+%d records out\n", str, out_full - out_partial,
+ out_partial);
if (oflag.sparse)
- fprintf(stderr, "%s%" PRId64 " bypassed records out\n", str,
- out_sparse);
+ pr2serr("%s%" PRId64 " bypassed records out\n", str, out_sparse);
if (recovered_errs > 0)
- fprintf(stderr, "%s%d recovered errors\n", str, recovered_errs);
+ pr2serr("%s%d recovered errors\n", str, recovered_errs);
if (num_retries > 0)
- fprintf(stderr, "%s%d retries attempted\n", str, num_retries);
+ pr2serr("%s%d retries attempted\n", str, num_retries);
if (iflag.coe || oflag.coe) {
- fprintf(stderr, "%s%d unrecovered errors\n", str, unrecovered_errs);
- fprintf(stderr, "%s%d read_longs fetched part of unrecovered "
- "read errors\n", str, read_longs);
+ pr2serr("%s%d unrecovered errors\n", str, unrecovered_errs);
+ pr2serr("%s%d read_longs fetched part of unrecovered read errors\n",
+ str, read_longs);
} else if (unrecovered_errs)
- fprintf(stderr, "%s%d unrecovered error(s)\n", str,
- unrecovered_errs);
+ pr2serr("%s%d unrecovered error(s)\n", str, unrecovered_errs);
}
@@ -222,7 +221,7 @@ interrupt_handler(int sig)
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction(sig, &sigact, NULL);
- fprintf(stderr, "Interrupted by signal,");
+ pr2serr("Interrupted by signal,");
if (do_time)
calc_duration_throughput(0);
print_stats("");
@@ -234,7 +233,7 @@ static void
siginfo_handler(int sig)
{
if (sig) { ; } /* unused, dummy to suppress warning */
- fprintf(stderr, "Progress report, continuing ...\n");
+ pr2serr("Progress report, continuing ...\n");
if (do_time)
calc_duration_throughput(1);
print_stats(" ");
@@ -255,8 +254,7 @@ find_bsg_major(void)
if (NULL == (fp = fopen(proc_devices, "r"))) {
if (verbose)
- fprintf(stderr, "fopen %s failed: %s\n", proc_devices,
- strerror(errno));
+ pr2serr("fopen %s failed: %s\n", proc_devices, strerror(errno));
return;
}
while ((cp = fgets(b, sizeof(b), fp))) {
@@ -275,9 +273,9 @@ find_bsg_major(void)
}
if (verbose > 5) {
if (cp)
- fprintf(stderr, "found bsg_major=%d\n", bsg_major);
+ pr2serr("found bsg_major=%d\n", bsg_major);
else
- fprintf(stderr, "found no bsg char device in %s\n", proc_devices);
+ pr2serr("found no bsg char device in %s\n", proc_devices);
}
fclose(fp);
}
@@ -346,70 +344,67 @@ dd_filetype_str(int ft, char * buff)
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE]"
- " [iflag=FLAGS]\n"
- " [obs=BS] [of=OFILE] [oflag=FLAGS] "
- "[seek=SEEK] [skip=SKIP]\n"
- " [--help] [--version]\n\n"
- " [blk_sgio=0|1] [bpt=BPT] [cdbsz=6|10|12|16] "
- "[coe=0|1|2|3]\n"
- " [coe_limit=CL] [dio=0|1] [odir=0|1] "
- "[of2=OFILE2] [retries=RETR]\n"
- " [sync=0|1] [time=0|1] [verbose=VERB]\n"
- " where:\n"
- " blk_sgio 0->block device use normal I/O(def), 1->use "
- "SG_IO\n"
- " bpt is blocks_per_transfer (default is 128 or 32 "
- "when BS>=2048)\n"
- " bs block size (default is 512)\n");
- fprintf(stderr,
- " cdbsz size of SCSI READ or WRITE cdb (default is "
- "10)\n"
- " coe 0->exit on error (def), 1->continue on sg "
- "error (zero\n"
- " fill), 2->also try read_long on unrecovered "
- "reads,\n"
- " 3->and set the CORRCT bit on the read long\n"
- " coe_limit limit consecutive 'bad' blocks on reads to CL "
- "times\n"
- " when COE>1 (default: 0 which is no limit)\n"
- " count number of blocks to copy (def: device size)\n"
- " dio for direct IO, 1->attempt, 0->indirect IO (def)\n"
- " ibs input block size (if given must be same as "
- "'bs=')\n"
- " if file or device to read from (def: stdin)\n"
- " iflag comma separated list from: [coe,dio,direct,"
- "dpo,dsync,excl,\n"
- " flock,fua,nocache,null,sgio]\n"
- " obs output block size (if given must be same as "
- "'bs=')\n"
- " odir 1->use O_DIRECT when opening block dev, "
- "0->don't(def)\n"
- " of file or device to write to (def: stdout), "
- "OFILE of '.'\n");
- fprintf(stderr,
- " treated as /dev/null\n"
- " of2 additional output file (def: /dev/null), "
- "OFILE2 should be\n"
- " normal file or pipe\n"
- " oflag comma separated list from: [append,coe,dio,"
- "direct,dpo,\n"
- " dsync,excl,flock,fua,nocache,null,sgio,"
- "sparse]\n"
- " retries retry sgio errors RETR times (def: 0)\n"
- " seek block position to start writing to OFILE\n"
- " skip block position to start reading from IFILE\n"
- " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on "
- "OFILE after copy\n"
- " time 0->no timing(def), 1->time plus calculate "
- "throughput\n"
- " verbose 0->quiet(def), 1->some noise, 2->more noise, "
- "etc\n"
- " --help print out this usage message then exit\n"
- " --version print version information then exit\n\n"
- "copy from IFILE to OFILE, similar to dd command; "
- "specialized for SCSI devices\n");
+ pr2serr("Usage: sg_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE] "
+ "[iflag=FLAGS]\n"
+ " [obs=BS] [of=OFILE] [oflag=FLAGS] "
+ "[seek=SEEK] [skip=SKIP]\n"
+ " [--help] [--version]\n\n"
+ " [blk_sgio=0|1] [bpt=BPT] [cdbsz=6|10|12|16] "
+ "[coe=0|1|2|3]\n"
+ " [coe_limit=CL] [dio=0|1] [odir=0|1] "
+ "[of2=OFILE2] [retries=RETR]\n"
+ " [sync=0|1] [time=0|1] [verbose=VERB]\n"
+ " where:\n"
+ " blk_sgio 0->block device use normal I/O(def), 1->use "
+ "SG_IO\n"
+ " bpt is blocks_per_transfer (default is 128 or 32 "
+ "when BS>=2048)\n"
+ " bs block size (default is 512)\n");
+ pr2serr(" cdbsz size of SCSI READ or WRITE cdb (default is "
+ "10)\n"
+ " coe 0->exit on error (def), 1->continue on sg "
+ "error (zero\n"
+ " fill), 2->also try read_long on unrecovered "
+ "reads,\n"
+ " 3->and set the CORRCT bit on the read long\n"
+ " coe_limit limit consecutive 'bad' blocks on reads to CL "
+ "times\n"
+ " when COE>1 (default: 0 which is no limit)\n"
+ " count number of blocks to copy (def: device size)\n"
+ " dio for direct IO, 1->attempt, 0->indirect IO (def)\n"
+ " ibs input block size (if given must be same as "
+ "'bs=')\n"
+ " if file or device to read from (def: stdin)\n"
+ " iflag comma separated list from: [coe,dio,direct,"
+ "dpo,dsync,excl,\n"
+ " flock,fua,nocache,null,sgio]\n"
+ " obs output block size (if given must be same as "
+ "'bs=')\n"
+ " odir 1->use O_DIRECT when opening block dev, "
+ "0->don't(def)\n"
+ " of file or device to write to (def: stdout), "
+ "OFILE of '.'\n");
+ pr2serr(" treated as /dev/null\n"
+ " of2 additional output file (def: /dev/null), "
+ "OFILE2 should be\n"
+ " normal file or pipe\n"
+ " oflag comma separated list from: [append,coe,dio,"
+ "direct,dpo,\n"
+ " dsync,excl,flock,fua,nocache,null,sgio,"
+ "sparse]\n"
+ " retries retry sgio errors RETR times (def: 0)\n"
+ " seek block position to start writing to OFILE\n"
+ " skip block position to start reading from IFILE\n"
+ " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on "
+ "OFILE after copy\n"
+ " time 0->no timing(def), 1->time plus calculate "
+ "throughput\n"
+ " verbose 0->quiet(def), 1->some noise, 2->more noise, "
+ "etc\n"
+ " --help print out this usage message then exit\n"
+ " --version print version information then exit\n\n"
+ "copy from IFILE to OFILE, similar to dd command; "
+ "specialized for SCSI devices\n");
}
@@ -445,8 +440,8 @@ scsi_read_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
*sect_sz = (int)sg_get_unaligned_be32(rcBuff + 4);
}
if (verbose)
- fprintf(stderr, " number of blocks=%" PRId64 " [0x%" PRIx64
- "], " "block size=%d\n", *num_sect, *num_sect, *sect_sz);
+ pr2serr(" number of blocks=%" PRId64 " [0x%" PRIx64 "], "
+ "block size=%d\n", *num_sect, *num_sect, *sect_sz);
return 0;
}
@@ -471,9 +466,8 @@ read_blkdev_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
}
*num_sect = ((int64_t)ull / (int64_t)*sect_sz);
if (verbose)
- fprintf(stderr, " [bgs64] number of blocks=%" PRId64 " [0x%"
- PRIx64 "], block size=%d\n", *num_sect, *num_sect,
- *sect_sz);
+ pr2serr(" [bgs64] number of blocks=%" PRId64 " [0x%" PRIx64
+ "], block size=%d\n", *num_sect, *num_sect, *sect_sz);
#else
unsigned long ul;
@@ -483,15 +477,14 @@ read_blkdev_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
}
*num_sect = (int64_t)ul;
if (verbose)
- fprintf(stderr, " [bgs] number of blocks=%" PRId64 " [0x%"
- PRIx64 "], block size=%d\n", *num_sect, *num_sect,
- *sect_sz);
+ pr2serr(" [bgs] number of blocks=%" PRId64 " [0x%" PRIx64
+ "], block size=%d\n", *num_sect, *num_sect, *sect_sz);
#endif
}
return 0;
#else
if (verbose)
- fprintf(stderr, " BLKSSZGET+BLKGETSIZE ioctl not available\n");
+ pr2serr(" BLKSSZGET+BLKGETSIZE ioctl not available\n");
*num_sect = 0;
*sect_sz = 0;
return -1;
@@ -520,18 +513,18 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be24(0x1fffff & start_block, cdbp + 1);
cdbp[4] = (256 == blocks) ? 0 : (unsigned char)blocks;
if (blocks > 256) {
- fprintf(stderr, ME "for 6 byte commands, maximum number of "
- "blocks is 256\n");
+ pr2serr(ME "for 6 byte commands, maximum number of blocks is "
+ "256\n");
return 1;
}
if ((start_block + blocks - 1) & (~0x1fffff)) {
- fprintf(stderr, ME "for 6 byte commands, can't address blocks"
- " beyond %d\n", 0x1fffff);
+ pr2serr(ME "for 6 byte commands, can't address blocks beyond "
+ "%d\n", 0x1fffff);
return 1;
}
if (dpo || fua) {
- fprintf(stderr, ME "for 6 byte commands, neither dpo nor fua"
- " bits supported\n");
+ pr2serr(ME "for 6 byte commands, neither dpo nor fua bits "
+ "supported\n");
return 1;
}
break;
@@ -542,8 +535,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32(start_block, cdbp + 2);
sg_put_unaligned_be16(blocks, cdbp + 7);
if (blocks & (~0xffff)) {
- fprintf(stderr, ME "for 10 byte commands, maximum number of "
- "blocks is %d\n", 0xffff);
+ pr2serr(ME "for 10 byte commands, maximum number of blocks is "
+ "%d\n", 0xffff);
return 1;
}
break;
@@ -562,8 +555,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32(blocks, cdbp + 10);
break;
default:
- fprintf(stderr, ME "expected cdb size of 6, 10, 12, or 16 but got"
- " %d\n", cdb_sz);
+ pr2serr(ME "expected cdb size of 6, 10, 12, or 16 but got %d\n",
+ cdb_sz);
return 1;
}
return 0;
@@ -590,8 +583,8 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
if (sg_build_scsi_cdb(rdCmd, ifp->cdbsz, blocks, from_block, 0,
ifp->fua, ifp->dpo)) {
- fprintf(stderr, ME "bad rd cdb build, from_block=%" PRId64
- ", blocks=%d\n", from_block, blocks);
+ pr2serr(ME "bad rd cdb build, from_block=%" PRId64 ", blocks=%d\n",
+ from_block, blocks);
return SG_LIB_SYNTAX_ERROR;
}
@@ -610,10 +603,10 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
io_hdr.flags |= SG_FLAG_DIRECT_IO;
if (verbose > 2) {
- fprintf(stderr, " read cdb: ");
+ pr2serr(" read cdb: ");
for (k = 0; k < ifp->cdbsz; ++k)
- fprintf(stderr, "%02x ", rdCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rdCmd[k]);
+ pr2serr("\n");
}
while (((res = ioctl(sg_fd, SG_IO, &io_hdr)) < 0) &&
((EINTR == errno) || (EAGAIN == errno)))
@@ -625,7 +618,7 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
return -1;
}
if (verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
res = sg_err_category3(&io_hdr);
sbp = io_hdr.sbp;
slen = io_hdr.sb_len_wr;
@@ -636,13 +629,13 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
++recovered_errs;
info_valid = sg_get_sense_info_fld(sbp, slen, io_addrp);
if (info_valid) {
- fprintf(stderr, " lba of last recovered error in this "
- "READ=0x%" PRIx64 "\n", *io_addrp);
+ pr2serr(" lba of last recovered error in this READ=0x%" PRIx64
+ "\n", *io_addrp);
if (verbose > 1)
sg_chk_n_print3("reading", &io_hdr, 1);
} else {
- fprintf(stderr, "Recovered error: [no info] reading from "
- "block=0x%" PRIx64 ", num=%d\n", from_block, blocks);
+ pr2serr("Recovered error: [no info] reading from block=0x%" PRIx64
+ ", num=%d\n", from_block, blocks);
sg_chk_n_print3("reading", &io_hdr, verbose > 1);
}
break;
@@ -659,8 +652,8 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
if ((info_valid) || ((5 == ifp->pdt) && (*io_addrp > 0)))
return SG_LIB_CAT_MEDIUM_HARD_WITH_INFO;
else {
- fprintf(stderr, "Medium, hardware or blank check error but "
- "no lba of failure in sense\n");
+ pr2serr("Medium, hardware or blank check error but no lba of "
+ "failure in sense\n");
return res;
}
break;
@@ -685,8 +678,8 @@ sg_read_low(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
++unrecovered_errs;
return SG_LIB_CAT_MEDIUM_HARD_WITH_INFO;
} else
- fprintf(stderr, "MMC READ gave 'illegal mode for "
- "this track' and ILI but no LBA of failure\n");
+ pr2serr("MMC READ gave 'illegal mode for this track' "
+ "and ILI but no LBA of failure\n");
}
++unrecovered_errs;
return SG_LIB_CAT_MEDIUM_HARD;
@@ -740,30 +733,30 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
case -2: /* ENOMEM */
return res;
case SG_LIB_CAT_NOT_READY:
- fprintf(stderr, "Device (r) not ready\n");
+ pr2serr("Device (r) not ready\n");
return res;
case SG_LIB_CAT_ABORTED_COMMAND:
if (--max_aborted > 0) {
- fprintf(stderr, "Aborted command, continuing (r)\n");
+ pr2serr("Aborted command, continuing (r)\n");
repeat = 1;
} else {
- fprintf(stderr, "Aborted command, too many (r)\n");
+ pr2serr("Aborted command, too many (r)\n");
return res;
}
break;
case SG_LIB_CAT_UNIT_ATTENTION:
if (--max_uas > 0) {
- fprintf(stderr, "Unit attention, continuing (r)\n");
+ pr2serr("Unit attention, continuing (r)\n");
repeat = 1;
} else {
- fprintf(stderr, "Unit attention, too many (r)\n");
+ pr2serr("Unit attention, too many (r)\n");
return res;
}
break;
case SG_LIB_CAT_MEDIUM_HARD_WITH_INFO:
if (retries_tmp > 0) {
- fprintf(stderr, ">>> retrying a sgio read, lba=0x%" PRIx64
- "\n", (uint64_t)lba);
+ pr2serr(">>> retrying a sgio read, lba=0x%" PRIx64 "\n",
+ (uint64_t)lba);
--retries_tmp;
++num_retries;
if (unrecovered_errs > 0)
@@ -783,8 +776,8 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
may_coe = 1;
default:
if (retries_tmp > 0) {
- fprintf(stderr, ">>> retrying a sgio read, lba=0x%" PRIx64
- "\n", (uint64_t)lba);
+ pr2serr(">>> retrying a sgio read, lba=0x%" PRIx64 "\n",
+ (uint64_t)lba);
--retries_tmp;
++num_retries;
if (unrecovered_errs > 0)
@@ -799,9 +792,9 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
continue;
if ((io_addr < (uint64_t)lba) ||
(io_addr >= (uint64_t)(lba + blks))) {
- fprintf(stderr, " Unrecovered error lba 0x%" PRIx64 " not "
- "in correct range:\n\t[0x%" PRIx64 ",0x%" PRIx64
- "]\n", io_addr, (uint64_t)lba,
+ pr2serr(" Unrecovered error lba 0x%" PRIx64 " not in "
+ "correct range:\n\t[0x%" PRIx64 ",0x%" PRIx64 "]\n",
+ io_addr, (uint64_t)lba,
(uint64_t)(lba + blks - 1));
may_coe = 1;
goto err_out;
@@ -809,8 +802,8 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
blks = (int)(io_addr - (uint64_t)lba);
if (blks > 0) {
if (verbose)
- fprintf(stderr, " partial read of %d blocks prior to "
- "medium error\n", blks);
+ pr2serr(" partial read of %d blocks prior to medium error\n",
+ blks);
res = sg_read_low(sg_fd, bp, blks, lba, bs, ifp, diop, &io_addr);
switch (res) {
case 0:
@@ -820,16 +813,16 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
ret = res;
goto err_out;
case -2:
- fprintf(stderr, "ENOMEM again, unexpected (r)\n");
+ pr2serr("ENOMEM again, unexpected (r)\n");
return -1;
case SG_LIB_CAT_NOT_READY:
- fprintf(stderr, "device (r) not ready\n");
+ pr2serr("device (r) not ready\n");
return res;
case SG_LIB_CAT_UNIT_ATTENTION:
- fprintf(stderr, "Unit attention, unexpected (r)\n");
+ pr2serr("Unit attention, unexpected (r)\n");
return res;
case SG_LIB_CAT_ABORTED_COMMAND:
- fprintf(stderr, "Aborted command, unexpected (r)\n");
+ pr2serr("Aborted command, unexpected (r)\n");
return res;
case SG_LIB_CAT_MEDIUM_HARD_WITH_INFO:
case SG_LIB_CAT_MEDIUM_HARD:
@@ -837,8 +830,8 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
goto err_out;
case SG_LIB_SYNTAX_ERROR:
default:
- fprintf(stderr, ">> unexpected result=%d from "
- "sg_read_low() 2\n", res);
+ pr2serr(">> unexpected result=%d from sg_read_low() 2\n",
+ res);
ret = res;
goto err_out;
}
@@ -851,14 +844,14 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
return ret;
}
if (bs < 32) {
- fprintf(stderr, ">> bs=%d too small for read_long\n", bs);
+ pr2serr(">> bs=%d too small for read_long\n", bs);
return -1; /* nah, block size can't be that small */
}
bp += (blks * bs);
lba += blks;
if ((0 != ifp->pdt) || (ifp->coe < 2)) {
- fprintf(stderr, ">> unrecovered read error at blk=%" PRId64 ", "
- "pdt=%d, use zeros\n", lba, ifp->pdt);
+ pr2serr(">> unrecovered read error at blk=%" PRId64 ", pdt=%d, "
+ "use zeros\n", lba, ifp->pdt);
memset(bp, 0, bs);
} else if (io_addr < UINT_MAX) {
unsigned char * buffp;
@@ -866,7 +859,7 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
buffp = (unsigned char*)malloc(bs * 2);
if (NULL == buffp) {
- fprintf(stderr, ">> heap problems\n");
+ pr2serr(">> heap problems\n");
return -1;
}
corrct = (ifp->coe > 2) ? 1 : 0;
@@ -882,15 +875,14 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
case SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO:
nl = bs + read_long_blk_inc - offset;
if ((nl < 32) || (nl > (bs * 2))) {
- fprintf(stderr, ">> read_long(10) len=%d unexpected\n",
- nl);
+ pr2serr(">> read_long(10) len=%d unexpected\n", nl);
break;
}
/* remember for next read_long attempt, if required */
read_long_blk_inc = nl - bs;
if (verbose)
- fprintf(stderr, "read_long(10): adjusted len=%d\n", nl);
+ pr2serr("read_long(10): adjusted len=%d\n", nl);
r = sg_ll_read_long10(sg_fd, 0, corrct, lba, buffp, nl,
&offset, 1, verbose);
if (0 == r) {
@@ -898,26 +890,26 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
++read_longs;
break;
} else
- fprintf(stderr, ">> unexpected result=%d on second "
+ pr2serr(">> unexpected result=%d on second "
"read_long(10)\n", r);
break;
case SG_LIB_CAT_INVALID_OP:
- fprintf(stderr, ">> read_long(10); not supported\n");
+ pr2serr(">> read_long(10); not supported\n");
break;
case SG_LIB_CAT_ILLEGAL_REQ:
- fprintf(stderr, ">> read_long(10): bad cdb field\n");
+ pr2serr(">> read_long(10): bad cdb field\n");
break;
case SG_LIB_CAT_NOT_READY:
- fprintf(stderr, ">> read_long(10): device not ready\n");
+ pr2serr(">> read_long(10): device not ready\n");
break;
case SG_LIB_CAT_UNIT_ATTENTION:
- fprintf(stderr, ">> read_long(10): unit attention\n");
+ pr2serr(">> read_long(10): unit attention\n");
break;
case SG_LIB_CAT_ABORTED_COMMAND:
- fprintf(stderr, ">> read_long(10): aborted command\n");
+ pr2serr(">> read_long(10): aborted command\n");
break;
default:
- fprintf(stderr, ">> read_long(10): problem (%d)\n", res);
+ pr2serr(">> read_long(10): problem (%d)\n", res);
break;
}
if (ok)
@@ -926,8 +918,8 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
memset(bp, 0, bs);
free(buffp);
} else {
- fprintf(stderr, ">> read_long(10) cannot handle blk=%" PRId64
- ", use zeros\n", lba);
+ pr2serr(">> read_long(10) cannot handle blk=%" PRId64 ", use "
+ "zeros\n", lba);
memset(bp, 0, bs);
}
++xferred;
@@ -936,7 +928,7 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
if ((coe_limit > 0) && (++coe_count > coe_limit)) {
if (blks_readp)
*blks_readp = xferred + blks;
- fprintf(stderr, ">> coe_limit on consecutive reads exceeded\n");
+ pr2serr(">> coe_limit on consecutive reads exceeded\n");
return SG_LIB_CAT_MEDIUM_HARD;
}
}
@@ -947,16 +939,16 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
err_out:
if (ifp->coe) {
memset(bp, 0, bs * blks);
- fprintf(stderr, ">> unable to read at blk=%" PRId64 " for "
- "%d bytes, use zeros\n", lba, bs * blks);
+ pr2serr(">> unable to read at blk=%" PRId64 " for %d bytes, use "
+ "zeros\n", lba, bs * blks);
if (blks > 1)
- fprintf(stderr, ">> try reducing bpt to limit number "
- "of zeros written near bad block(s)\n");
+ pr2serr(">> try reducing bpt to limit number of zeros written "
+ "near bad block(s)\n");
/* fudge success */
if (blks_readp)
*blks_readp = xferred + blks;
if ((coe_limit > 0) && (++coe_count > coe_limit)) {
- fprintf(stderr, ">> coe_limit on consecutive reads exceeded\n");
+ pr2serr(">> coe_limit on consecutive reads exceeded\n");
return ret;
}
return may_coe ? 0 : ret;
@@ -981,8 +973,8 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
if (sg_build_scsi_cdb(wrCmd, ofp->cdbsz, blocks, to_block, 1, ofp->fua,
ofp->dpo)) {
- fprintf(stderr, ME "bad wr cdb build, to_block=%" PRId64
- ", blocks=%d\n", to_block, blocks);
+ pr2serr(ME "bad wr cdb build, to_block=%" PRId64 ", blocks=%d\n",
+ to_block, blocks);
return SG_LIB_SYNTAX_ERROR;
}
@@ -1001,10 +993,10 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
io_hdr.flags |= SG_FLAG_DIRECT_IO;
if (verbose > 2) {
- fprintf(stderr, " write cdb: ");
+ pr2serr(" write cdb: ");
for (k = 0; k < ofp->cdbsz; ++k)
- fprintf(stderr, "%02x ", wrCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", wrCmd[k]);
+ pr2serr("\n");
}
while (((res = ioctl(sg_fd, SG_IO, &io_hdr)) < 0) &&
((EINTR == errno) || (EAGAIN == errno)))
@@ -1017,7 +1009,7 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
}
if (verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
res = sg_err_category3(&io_hdr);
switch (res) {
case SG_LIB_CAT_CLEAN:
@@ -1027,13 +1019,13 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
info_valid = sg_get_sense_info_fld(io_hdr.sbp, io_hdr.sb_len_wr,
&io_addr);
if (info_valid) {
- fprintf(stderr, " lba of last recovered error in this "
- "WRITE=0x%" PRIx64 "\n", io_addr);
+ pr2serr(" lba of last recovered error in this WRITE=0x%" PRIx64
+ "\n", io_addr);
if (verbose > 1)
sg_chk_n_print3("writing", &io_hdr, 1);
} else {
- fprintf(stderr, "Recovered error: [no info] writing to "
- "block=0x%" PRIx64 ", num=%d\n", to_block, blocks);
+ pr2serr("Recovered error: [no info] writing to block=0x%" PRIx64
+ ", num=%d\n", to_block, blocks);
sg_chk_n_print3("writing", &io_hdr, verbose > 1);
}
break;
@@ -1043,15 +1035,15 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
return res;
case SG_LIB_CAT_NOT_READY:
++unrecovered_errs;
- fprintf(stderr, "device not ready (w)\n");
+ pr2serr("device not ready (w)\n");
return res;
case SG_LIB_CAT_MEDIUM_HARD:
default:
sg_chk_n_print3("writing", &io_hdr, verbose > 1);
++unrecovered_errs;
if (ofp->coe) {
- fprintf(stderr, ">> ignored errors for out blk=%" PRId64 " for "
- "%d bytes\n", to_block, bs * blocks);
+ pr2serr(">> ignored errors for out blk=%" PRId64 " for %d "
+ "bytes\n", to_block, bs * blocks);
return 0; /* fudge success */
} else
return res;
@@ -1082,13 +1074,13 @@ calc_duration_throughput(int contin)
a = res_tm.tv_sec;
a += (0.000001 * res_tm.tv_usec);
b = (double)blk_sz * blks;
- fprintf(stderr, "time to transfer data%s: %d.%06d secs",
+ pr2serr("time to transfer data%s: %d.%06d secs",
(contin ? " so far" : ""), (int)res_tm.tv_sec,
(int)res_tm.tv_usec);
if ((a > 0.00001) && (b > 511))
- fprintf(stderr, " at %.2f MB/sec\n", b / (a * 1000000.0));
+ pr2serr(" at %.2f MB/sec\n", b / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
}
}
@@ -1104,7 +1096,7 @@ process_flags(const char * arg, struct flags_t * fp)
strncpy(buff, arg, sizeof(buff));
buff[sizeof(buff) - 1] = '\0';
if ('\0' == buff[0]) {
- fprintf(stderr, "no flag found\n");
+ pr2serr("no flag found\n");
return 1;
}
cp = buff;
@@ -1139,7 +1131,7 @@ process_flags(const char * arg, struct flags_t * fp)
else if (0 == strcmp(cp, "flock"))
++fp->flock;
else {
- fprintf(stderr, "unrecognised flag: %s\n", cp);
+ pr2serr("unrecognised flag: %s\n", cp);
return 1;
}
cp = np;
@@ -1159,7 +1151,7 @@ process_conv(const char * arg, struct flags_t * ifp, struct flags_t * ofp)
strncpy(buff, arg, sizeof(buff));
buff[sizeof(buff) - 1] = '\0';
if ('\0' == buff[0]) {
- fprintf(stderr, "no conversions found\n");
+ pr2serr("no conversions found\n");
return 1;
}
cp = buff;
@@ -1193,7 +1185,7 @@ process_conv(const char * arg, struct flags_t * ifp, struct flags_t * ofp)
++ofp->trunc;
#endif
else {
- fprintf(stderr, "unrecognised flag: %s\n", cp);
+ pr2serr("unrecognised flag: %s\n", cp);
return 1;
}
cp = np;
@@ -1215,16 +1207,16 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
verb = (verbose ? verbose - 1: 0);
*in_typep = dd_filetype(inf);
if (verbose)
- fprintf(stderr, " >> Input file type: %s\n",
+ pr2serr(" >> Input file type: %s\n",
dd_filetype_str(*in_typep, ebuff));
if (FT_ERROR & *in_typep) {
- fprintf(stderr, ME "unable access %s\n", inf);
+ pr2serr(ME "unable access %s\n", inf);
goto file_err;
} else if ((FT_BLOCK & *in_typep) && ifp->sgio)
*in_typep |= FT_SG;
if (FT_ST & *in_typep) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", inf);
+ pr2serr(ME "unable to use scsi tape device %s\n", inf);
goto file_err;
} else if (FT_SG & *in_typep) {
flags = O_NONBLOCK;
@@ -1245,16 +1237,15 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
}
}
if (verbose)
- fprintf(stderr, " open input(sg_io), flags=0x%x\n",
- fl | flags);
+ pr2serr(" open input(sg_io), flags=0x%x\n", fl | flags);
if (sg_simple_inquiry(infd, &sir, 0, verb)) {
- fprintf(stderr, "INQUIRY failed on %s\n", inf);
+ pr2serr("INQUIRY failed on %s\n", inf);
goto other_err;
}
ifp->pdt = sir.peripheral_type;
if (verbose)
- fprintf(stderr, " %s: %.8s %.16s %.4s [pdt=%d]\n",
- inf, sir.vendor, sir.product, sir.revision, ifp->pdt);
+ pr2serr(" %s: %.8s %.16s %.4s [pdt=%d]\n", inf, sir.vendor,
+ sir.product, sir.revision, ifp->pdt);
if (! (FT_BLOCK & *in_typep)) {
t = blk_sz * bpt;
res = ioctl(infd, SG_SET_RESERVED_SIZE, &t);
@@ -1263,10 +1254,9 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
res = ioctl(infd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30000)) {
if (FT_BLOCK & *in_typep)
- fprintf(stderr, ME "SG_IO unsupported on this block"
- " device\n");
+ pr2serr(ME "SG_IO unsupported on this block device\n");
else
- fprintf(stderr, ME "sg driver prior to 3.x.y\n");
+ pr2serr(ME "sg driver prior to 3.x.y\n");
goto file_err;
}
}
@@ -1286,8 +1276,7 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
goto file_err;
} else {
if (verbose)
- fprintf(stderr, " open input, flags=0x%x\n",
- flags);
+ pr2serr(" open input, flags=0x%x\n", flags);
if (skip > 0) {
off64_t offset = skip;
@@ -1299,9 +1288,8 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
goto file_err;
}
if (verbose)
- fprintf(stderr, " >> skip: lseek64 SEEK_SET, "
- "byte offset=0x%" PRIx64 "\n",
- (uint64_t)offset);
+ pr2serr(" >> skip: lseek64 SEEK_SET, byte offset=0x%"
+ PRIx64 "\n", (uint64_t)offset);
}
#ifdef HAVE_POSIX_FADVISE
if (ifp->nocache) {
@@ -1309,8 +1297,8 @@ open_if(const char * inf, int64_t skip, int bpt, struct flags_t * ifp,
rt = posix_fadvise(infd, 0, 0, POSIX_FADV_SEQUENTIAL);
if (rt)
- fprintf(stderr, "open_if: posix_fadvise(SEQUENTIAL), "
- "err=%d\n", rt);
+ pr2serr("open_if: posix_fadvise(SEQUENTIAL), err=%d\n",
+ rt);
}
#endif
}
@@ -1348,14 +1336,14 @@ open_of(const char * outf, int64_t seek, int bpt, struct flags_t * ofp,
verb = (verbose ? verbose - 1: 0);
*out_typep = dd_filetype(outf);
if (verbose)
- fprintf(stderr, " >> Output file type: %s\n",
+ pr2serr(" >> Output file type: %s\n",
dd_filetype_str(*out_typep, ebuff));
if ((FT_BLOCK & *out_typep) && ofp->sgio)
*out_typep |= FT_SG;
if (FT_ST & *out_typep) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", outf);
+ pr2serr(ME "unable to use scsi tape device %s\n", outf);
goto file_err;
} else if (FT_SG & *out_typep) {
flags = O_RDWR | O_NONBLOCK;
@@ -1372,16 +1360,15 @@ open_of(const char * outf, int64_t seek, int bpt, struct flags_t * ofp,
goto file_err;
}
if (verbose)
- fprintf(stderr, " open output(sg_io), flags=0x%x\n",
- flags);
+ pr2serr(" open output(sg_io), flags=0x%x\n", flags);
if (sg_simple_inquiry(outfd, &sir, 0, verb)) {
- fprintf(stderr, "INQUIRY failed on %s\n", outf);
+ pr2serr("INQUIRY failed on %s\n", outf);
goto other_err;
}
ofp->pdt = sir.peripheral_type;
if (verbose)
- fprintf(stderr, " %s: %.8s %.16s %.4s [pdt=%d]\n",
- outf, sir.vendor, sir.product, sir.revision, ofp->pdt);
+ pr2serr(" %s: %.8s %.16s %.4s [pdt=%d]\n", outf, sir.vendor,
+ sir.product, sir.revision, ofp->pdt);
if (! (FT_BLOCK & *out_typep)) {
t = blk_sz * bpt;
res = ioctl(outfd, SG_SET_RESERVED_SIZE, &t);
@@ -1389,7 +1376,7 @@ open_of(const char * outf, int64_t seek, int bpt, struct flags_t * ofp,
perror(ME "SG_SET_RESERVED_SIZE error");
res = ioctl(outfd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30000)) {
- fprintf(stderr, ME "sg driver prior to 3.x.y\n");
+ pr2serr(ME "sg driver prior to 3.x.y\n");
goto file_err;
}
}
@@ -1428,7 +1415,7 @@ open_of(const char * outf, int64_t seek, int bpt, struct flags_t * ofp,
}
}
if (verbose)
- fprintf(stderr, " %s output, flags=0x%x\n",
+ pr2serr(" %s output, flags=0x%x\n",
((O_CREAT & flags) ? "create" : "open"), flags);
if (seek > 0) {
off64_t offset = seek;
@@ -1441,9 +1428,8 @@ open_of(const char * outf, int64_t seek, int bpt, struct flags_t * ofp,
goto file_err;
}
if (verbose)
- fprintf(stderr, " >> seek: lseek64 SEEK_SET, "
- "byte offset=0x%" PRIx64 "\n",
- (uint64_t)offset);
+ pr2serr(" >> seek: lseek64 SEEK_SET, byte offset=0x%" PRIx64
+ "\n", (uint64_t)offset);
}
}
if (ofp->flock) {
@@ -1508,9 +1494,8 @@ main(int argc, char * argv[])
iflag.cdbsz = DEF_SCSI_CDBSZ;
oflag.cdbsz = DEF_SCSI_CDBSZ;
if (argc < 2) {
- fprintf(stderr,
- "Won't default both IFILE to stdin _and_ OFILE to stdout\n");
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Won't default both IFILE to stdin _and_ OFILE to stdout\n");
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
@@ -1533,14 +1518,14 @@ main(int argc, char * argv[])
} else if (0 == strcmp(key, "bpt")) {
bpt = sg_get_num(buf);
if (-1 == bpt) {
- fprintf(stderr, ME "bad argument to 'bpt='\n");
+ pr2serr(ME "bad argument to 'bpt='\n");
return SG_LIB_SYNTAX_ERROR;
}
bpt_given = 1;
} else if (0 == strcmp(key, "bs")) {
blk_sz = sg_get_num(buf);
if (-1 == blk_sz) {
- fprintf(stderr, ME "bad argument to 'bs='\n");
+ pr2serr(ME "bad argument to 'bs='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "cdbsz")) {
@@ -1553,19 +1538,19 @@ main(int argc, char * argv[])
} else if (0 == strcmp(key, "coe_limit")) {
coe_limit = sg_get_num(buf);
if (-1 == coe_limit) {
- fprintf(stderr, ME "bad argument to 'coe_limit='\n");
+ pr2serr(ME "bad argument to 'coe_limit='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "conv")) {
if (process_conv(buf, &iflag, &oflag)) {
- fprintf(stderr, ME "bad argument to 'conv='\n");
+ pr2serr(ME "bad argument to 'conv='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "count")) {
if (0 != strcmp("-1", buf)) {
dd_count = sg_get_llnum(buf);
if (-1LL == dd_count) {
- fprintf(stderr, ME "bad argument to 'count='\n");
+ pr2serr(ME "bad argument to 'count='\n");
return SG_LIB_SYNTAX_ERROR;
}
} /* treat 'count=-1' as calculate count (same as not given) */
@@ -1580,13 +1565,13 @@ main(int argc, char * argv[])
ibs = sg_get_num(buf);
else if (strcmp(key, "if") == 0) {
if ('\0' != inf[0]) {
- fprintf(stderr, "Second IFILE argument??\n");
+ pr2serr("Second IFILE argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(inf, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "iflag")) {
if (process_flags(buf, &iflag)) {
- fprintf(stderr, ME "bad argument to 'iflag='\n");
+ pr2serr(ME "bad argument to 'iflag='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "obs"))
@@ -1596,38 +1581,38 @@ main(int argc, char * argv[])
oflag.direct = iflag.direct;
} else if (strcmp(key, "of") == 0) {
if ('\0' != outf[0]) {
- fprintf(stderr, "Second OFILE argument??\n");
+ pr2serr("Second OFILE argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(outf, buf, INOUTF_SZ);
} else if (strcmp(key, "of2") == 0) {
if ('\0' != out2f[0]) {
- fprintf(stderr, "Second OFILE2 argument??\n");
+ pr2serr("Second OFILE2 argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(out2f, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "oflag")) {
if (process_flags(buf, &oflag)) {
- fprintf(stderr, ME "bad argument to 'oflag='\n");
+ pr2serr(ME "bad argument to 'oflag='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "retries")) {
iflag.retries = sg_get_num(buf);
oflag.retries = iflag.retries;
if (-1 == iflag.retries) {
- fprintf(stderr, ME "bad argument to 'retries='\n");
+ pr2serr(ME "bad argument to 'retries='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "seek")) {
seek = sg_get_llnum(buf);
if (-1LL == seek) {
- fprintf(stderr, ME "bad argument to 'seek='\n");
+ pr2serr(ME "bad argument to 'seek='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "skip")) {
skip = sg_get_llnum(buf);
if (-1LL == skip) {
- fprintf(stderr, ME "bad argument to 'skip='\n");
+ pr2serr(ME "bad argument to 'skip='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key, "sync"))
@@ -1643,38 +1628,37 @@ main(int argc, char * argv[])
return 0;
} else if ((0 == strncmp(key, "--vers", 6)) ||
(0 == strcmp(key, "-V"))) {
- fprintf(stderr, ME "%s\n", version_str);
+ pr2serr(ME "%s\n", version_str);
return 0;
} else {
- fprintf(stderr, "Unrecognized option '%s'\n", key);
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Unrecognized option '%s'\n", key);
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
}
if (blk_sz <= 0) {
blk_sz = DEF_BLOCK_SIZE;
- fprintf(stderr, "Assume default 'bs' (block size) of %d bytes\n",
- blk_sz);
+ pr2serr("Assume default 'bs' (block size) of %d bytes\n", blk_sz);
}
if ((ibs && (ibs != blk_sz)) || (obs && (obs != blk_sz))) {
- fprintf(stderr, "If 'ibs' or 'obs' given must be same as 'bs'\n");
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("If 'ibs' or 'obs' given must be same as 'bs'\n");
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((skip < 0) || (seek < 0)) {
- fprintf(stderr, "skip and seek cannot be negative\n");
+ pr2serr("skip and seek cannot be negative\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((oflag.append > 0) && (seek > 0)) {
- fprintf(stderr, "Can't use both append and seek switches\n");
+ pr2serr("Can't use both append and seek switches\n");
return SG_LIB_SYNTAX_ERROR;
}
if (bpt < 1) {
- fprintf(stderr, "bpt must be greater than 0\n");
+ pr2serr("bpt must be greater than 0\n");
return SG_LIB_SYNTAX_ERROR;
}
if (iflag.sparse)
- fprintf(stderr, "sparse flag ignored for iflag\n");
+ pr2serr("sparse flag ignored for iflag\n");
/* defaulting transfer size to 128*2048 for CD/DVDs is too large
for the block layer in lk 2.6 and results in an EIO on the
@@ -1682,8 +1666,8 @@ main(int argc, char * argv[])
if ((blk_sz >= 2048) && (0 == bpt_given))
bpt = DEF_BLOCKS_PER_2048TRANSFER;
#ifdef SG_DEBUG
- fprintf(stderr, ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64
- " count=%" PRId64 "\n", inf, skip, outf, seek, dd_count);
+ pr2serr(ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64 " count=%" PRId64
+ "\n", inf, skip, outf, seek, dd_count);
#endif
install_handler(SIGINT, interrupt_handler);
install_handler(SIGQUIT, interrupt_handler);
@@ -1719,14 +1703,13 @@ main(int argc, char * argv[])
out2fd = -1;
if ((STDIN_FILENO == infd) && (STDOUT_FILENO == outfd)) {
- fprintf(stderr,
- "Can't have both 'if' as stdin _and_ 'of' as stdout\n");
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Can't have both 'if' as stdin _and_ 'of' as stdout\n");
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (oflag.sparse) {
if (STDOUT_FILENO == outfd) {
- fprintf(stderr, "oflag=sparse needs seekable output file\n");
+ pr2serr("oflag=sparse needs seekable output file\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -1737,33 +1720,31 @@ main(int argc, char * argv[])
if (FT_SG & in_type) {
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention (readcap in), continuing\n");
+ pr2serr("Unit attention (readcap in), continuing\n");
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
} else if (SG_LIB_CAT_ABORTED_COMMAND == res) {
- fprintf(stderr, "Aborted command (readcap in), continuing\n");
+ pr2serr("Aborted command (readcap in), continuing\n");
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
}
if (0 != res) {
if (res == SG_LIB_CAT_INVALID_OP)
- fprintf(stderr, "read capacity not supported on %s\n",
- inf);
+ pr2serr("read capacity not supported on %s\n", inf);
else if (res == SG_LIB_CAT_NOT_READY)
- fprintf(stderr, "read capacity failed on %s - not "
- "ready\n", inf);
+ pr2serr("read capacity failed on %s - not ready\n", inf);
else
- fprintf(stderr, "Unable to read capacity on %s\n", inf);
+ pr2serr("Unable to read capacity on %s\n", inf);
in_num_sect = -1;
} else if (in_sect_sz != blk_sz)
- fprintf(stderr, ">> warning: block size on %s confusion: "
- "bs=%d, device claims=%d\n", inf, blk_sz, in_sect_sz);
+ pr2serr(">> warning: block size on %s confusion: bs=%d, "
+ "device claims=%d\n", inf, blk_sz, in_sect_sz);
} else if (FT_BLOCK & in_type) {
if (0 != read_blkdev_capacity(infd, &in_num_sect, &in_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n", inf);
+ pr2serr("Unable to read block capacity on %s\n", inf);
in_num_sect = -1;
}
if (blk_sz != in_sect_sz) {
- fprintf(stderr, "block size on %s confusion: bs=%d, "
- "device claims=%d\n", inf, blk_sz, in_sect_sz);
+ pr2serr("block size on %s confusion: bs=%d, device "
+ "claims=%d\n", inf, blk_sz, in_sect_sz);
in_num_sect = -1;
}
}
@@ -1775,41 +1756,37 @@ main(int argc, char * argv[])
if (FT_SG & out_type) {
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention (readcap out), continuing\n");
+ pr2serr("Unit attention (readcap out), continuing\n");
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
} else if (SG_LIB_CAT_ABORTED_COMMAND == res) {
- fprintf(stderr,
- "Aborted command (readcap out), continuing\n");
+ pr2serr("Aborted command (readcap out), continuing\n");
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
}
if (0 != res) {
if (res == SG_LIB_CAT_INVALID_OP)
- fprintf(stderr, "read capacity not supported on %s\n",
- outf);
+ pr2serr("read capacity not supported on %s\n", outf);
else
- fprintf(stderr, "Unable to read capacity on %s\n", outf);
+ pr2serr("Unable to read capacity on %s\n", outf);
out_num_sect = -1;
} else if (blk_sz != out_sect_sz)
- fprintf(stderr, ">> warning: block size on %s confusion: "
- "bs=%d, device claims=%d\n", outf, blk_sz,
- out_sect_sz);
+ pr2serr(">> warning: block size on %s confusion: bs=%d, "
+ "device claims=%d\n", outf, blk_sz, out_sect_sz);
} else if (FT_BLOCK & out_type) {
if (0 != read_blkdev_capacity(outfd, &out_num_sect,
&out_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n",
- outf);
+ pr2serr("Unable to read block capacity on %s\n", outf);
out_num_sect = -1;
} else if (blk_sz != out_sect_sz) {
- fprintf(stderr, "block size on %s confusion: bs=%d, "
- "device claims=%d\n", outf, blk_sz, out_sect_sz);
+ pr2serr("block size on %s confusion: bs=%d, device "
+ "claims=%d\n", outf, blk_sz, out_sect_sz);
out_num_sect = -1;
}
}
if (out_num_sect > seek)
out_num_sect -= seek;
#ifdef SG_DEBUG
- fprintf(stderr, "Start of loop, count=%" PRId64 ", in_num_sect=%"
- PRId64 ", out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
+ pr2serr("Start of loop, count=%" PRId64 ", in_num_sect=%" PRId64
+ ", out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
out_num_sect);
#endif
if (dd_count < 0) {
@@ -1825,20 +1802,20 @@ main(int argc, char * argv[])
}
if (dd_count < 0) {
- fprintf(stderr, "Couldn't calculate count, please give one\n");
+ pr2serr("Couldn't calculate count, please give one\n");
return SG_LIB_CAT_OTHER;
}
if (! cdbsz_given) {
if ((FT_SG & in_type) && (MAX_SCSI_CDBSZ != iflag.cdbsz) &&
(((dd_count + skip) > UINT_MAX) || (bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'if')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'if')\n");
iflag.cdbsz = MAX_SCSI_CDBSZ;
}
if ((FT_SG & out_type) && (MAX_SCSI_CDBSZ != oflag.cdbsz) &&
(((dd_count + seek) > UINT_MAX) || (bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'of')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'of')\n");
oflag.cdbsz = MAX_SCSI_CDBSZ;
}
}
@@ -1859,8 +1836,7 @@ main(int argc, char * argv[])
err = posix_memalign((void **)&wrkBuff, psz, blk_sz * bpt);
if (err) {
- fprintf(stderr, "posix_memalign: error [%d] out of memory?\n",
- err);
+ pr2serr("posix_memalign: error [%d] out of memory?\n", err);
return SG_LIB_CAT_OTHER;
}
wrkPos = wrkBuff;
@@ -1868,7 +1844,7 @@ main(int argc, char * argv[])
#else
wrkBuff = (unsigned char*)malloc(blk_sz * bpt + psz);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory for work buffer\n");
+ pr2serr("Not enough user memory for work buffer\n");
return SG_LIB_CAT_OTHER;
}
wrkPos = (unsigned char *)(((uintptr_t)wrkBuff + psz - 1) &
@@ -1877,7 +1853,7 @@ main(int argc, char * argv[])
} else {
wrkBuff = (unsigned char*)malloc(blk_sz * bpt);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory\n");
+ pr2serr("Not enough user memory\n");
return SG_LIB_CAT_OTHER;
}
wrkPos = wrkBuff;
@@ -1885,8 +1861,8 @@ main(int argc, char * argv[])
blocks_per = bpt;
#ifdef SG_DEBUG
- fprintf(stderr, "Start of loop, count=%" PRId64 ", blocks_per=%d\n",
- dd_count, blocks_per);
+ pr2serr("Start of loop, count=%" PRId64 ", blocks_per=%d\n", dd_count,
+ blocks_per);
#endif
if (do_time) {
start_tm.tv_sec = 0;
@@ -1920,16 +1896,16 @@ main(int argc, char * argv[])
blocks_per = (buf_sz + blk_sz - 1) / blk_sz;
if (blocks_per < blocks) {
blocks = blocks_per;
- fprintf(stderr, "Reducing read to %d blocks per "
- "loop\n", blocks_per);
+ pr2serr("Reducing read to %d blocks per loop\n",
+ blocks_per);
res = sg_read(infd, wrkPos, blocks, skip, blk_sz,
&iflag, &dio_tmp, &blks_read);
}
}
if (res) {
- fprintf(stderr, "sg_read failed,%s at or after lba=%" PRId64
- " [0x%" PRIx64 "]\n",
- ((-2 == res) ? " try reducing bpt," : ""), skip, skip);
+ pr2serr("sg_read failed,%s at or after lba=%" PRId64 " [0x%"
+ PRIx64 "]\n", ((-2 == res) ?
+ " try reducing bpt," : ""), skip, skip);
ret = res;
break;
} else {
@@ -1946,8 +1922,8 @@ main(int argc, char * argv[])
((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "read(unix): count=%d, res=%d\n",
- blocks * blk_sz, res);
+ pr2serr("read(unix): count=%d, res=%d\n", blocks * blk_sz,
+ res);
if (res < 0) {
snprintf(ebuff, EBUFF_SZ, ME "reading, skip=%" PRId64 " ",
skip);
@@ -1974,8 +1950,8 @@ main(int argc, char * argv[])
((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "write to of2: count=%d, res=%d\n",
- blocks * blk_sz, res);
+ pr2serr("write to of2: count=%d, res=%d\n", blocks * blk_sz,
+ res);
if (res < 0) {
snprintf(ebuff, EBUFF_SZ, ME "writing to of2, seek=%" PRId64
" ", seek);
@@ -1992,7 +1968,7 @@ main(int argc, char * argv[])
if (NULL == zeros_buff) {
zeros_buff = (unsigned char *)malloc(blocks * blk_sz);
if (NULL == zeros_buff) {
- fprintf(stderr, "zeros_buff malloc failed\n");
+ pr2serr("zeros_buff malloc failed\n");
ret = -1;
break;
}
@@ -2005,9 +1981,8 @@ main(int argc, char * argv[])
if (FT_SG & out_type) {
out_sparse += blocks;
if (verbose > 2)
- fprintf(stderr, "sparse bypassing sg_write: seek "
- "blk=%" PRId64 ", offset blks=%d\n", seek,
- blocks);
+ pr2serr("sparse bypassing sg_write: seek blk=%" PRId64
+ ", offset blks=%d\n", seek, blocks);
} else if (FT_DEV_NULL & out_type)
;
else {
@@ -2015,20 +1990,20 @@ main(int argc, char * argv[])
off64_t off_res;
if (verbose > 2)
- fprintf(stderr, "sparse bypassing write: seek=%" PRId64
- ", rel offset=%" PRId64 "\n", (seek * blk_sz),
+ pr2serr("sparse bypassing write: seek=%" PRId64 ", rel "
+ "offset=%" PRId64 "\n", (seek * blk_sz),
(int64_t)offset);
off_res = lseek64(outfd, offset, SEEK_CUR);
if (off_res < 0) {
- fprintf(stderr, "sparse tried to bypass write: seek=%"
- PRId64 ", rel offset=%" PRId64 " but ...\n",
+ pr2serr("sparse tried to bypass write: seek=%" PRId64
+ ", rel offset=%" PRId64 " but ...\n",
(seek * blk_sz), (int64_t)offset);
perror("lseek64 on output");
ret = SG_LIB_FILE_ERROR;
break;
} else if (verbose > 4)
- fprintf(stderr, "oflag=sparse lseek64 result=%" PRId64
- "\n", (int64_t)off_res);
+ pr2serr("oflag=sparse lseek64 result=%" PRId64 "\n",
+ (int64_t)off_res);
out_sparse += blocks;
}
} else if (FT_SG & out_type) {
@@ -2054,29 +2029,29 @@ main(int argc, char * argv[])
blocks_per = (buf_sz + blk_sz - 1) / blk_sz;
if (blocks_per < blocks) {
blocks = blocks_per;
- fprintf(stderr, "Reducing write to %d blocks per "
- "loop\n", blocks);
+ pr2serr("Reducing write to %d blocks per loop\n",
+ blocks);
} else
break;
} else if ((SG_LIB_CAT_UNIT_ATTENTION == ret) && first) {
if (--max_uas > 0)
- fprintf(stderr, "Unit attention, continuing (w)\n");
+ pr2serr("Unit attention, continuing (w)\n");
else {
- fprintf(stderr, "Unit attention, too many (w)\n");
+ pr2serr("Unit attention, too many (w)\n");
break;
}
} else if ((SG_LIB_CAT_ABORTED_COMMAND == ret) && first) {
if (--max_aborted > 0)
- fprintf(stderr, "Aborted command, continuing (w)\n");
+ pr2serr("Aborted command, continuing (w)\n");
else {
- fprintf(stderr, "Aborted command, too many (w)\n");
+ pr2serr("Aborted command, too many (w)\n");
break;
}
} else if (ret < 0)
break;
else if (retries_tmp > 0) {
- fprintf(stderr, ">>> retrying a sgio write, "
- "lba=0x%" PRIx64 "\n", (uint64_t)seek);
+ pr2serr(">>> retrying a sgio write, lba=0x%" PRIx64 "\n",
+ (uint64_t)seek);
--retries_tmp;
++num_retries;
if (unrecovered_errs > 0)
@@ -2086,7 +2061,7 @@ main(int argc, char * argv[])
first = 0;
}
if (0 != ret) {
- fprintf(stderr, "sg_write failed,%s seek=%" PRId64 "\n",
+ pr2serr("sg_write failed,%s seek=%" PRId64 "\n",
((-2 == ret) ? " try reducing bpt," : ""), seek);
break;
} else {
@@ -2101,8 +2076,8 @@ main(int argc, char * argv[])
((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "write(unix): count=%d, res=%d\n",
- blocks * blk_sz, res);
+ pr2serr("write(unix): count=%d, res=%d\n", blocks * blk_sz,
+ res);
if (res < 0) {
snprintf(ebuff, EBUFF_SZ, ME "writing, seek=%" PRId64 " ",
seek);
@@ -2110,8 +2085,7 @@ main(int argc, char * argv[])
ret = -1;
break;
} else if (res < blocks * blk_sz) {
- fprintf(stderr, "output file probably full, seek=%" PRId64
- " ", seek);
+ pr2serr("output file probably full, seek=%" PRId64 " ", seek);
blocks = res / blk_sz;
out_full += blocks;
if ((res % blk_sz) > 0)
@@ -2137,20 +2111,20 @@ main(int argc, char * argv[])
// POSIX_FADV_DONTNEED);
// rt = posix_fadvise(infd, 0, 0, POSIX_FADV_DONTNEED);
if (rt) /* returns error as result */
- fprintf(stderr, "posix_fadvise on read, skip="
- "%" PRId64 " ,err=%d\n", skip, rt);
+ pr2serr("posix_fadvise on read, skip=%" PRId64
+ " ,err=%d\n", skip, rt);
}
if ((oflag.nocache & 2) && (bytes_of2 > 0) && out2_valid) {
rt = posix_fadvise(out2fd, 0, 0, POSIX_FADV_DONTNEED);
if (rt)
- fprintf(stderr, "posix_fadvise on of2, seek="
- "%" PRId64 " ,err=%d\n", seek, rt);
+ pr2serr("posix_fadvise on of2, seek=%" PRId64
+ " ,err=%d\n", seek, rt);
}
if ((oflag.nocache & 1) && (bytes_of > 0) && out_valid) {
rt = posix_fadvise(outfd, 0, 0, POSIX_FADV_DONTNEED);
if (rt)
- fprintf(stderr, "posix_fadvise on output, seek="
- "%" PRId64 " ,err=%d\n", seek, rt);
+ pr2serr("posix_fadvise on output, seek=%" PRId64
+ " ,err=%d\n", seek, rt);
}
}
#endif
@@ -2169,8 +2143,8 @@ main(int argc, char * argv[])
< 0) && ((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "write(unix, sparse after error): count=%d, "
- "res=%d\n", penult_blocks * blk_sz, res);
+ pr2serr("write(unix, sparse after error): count=%d, res=%d\n",
+ penult_blocks * blk_sz, res);
if (res < 0) {
snprintf(ebuff, EBUFF_SZ, ME "writing(sparse after error), "
"seek=%" PRId64 " ", seek);
@@ -2184,15 +2158,14 @@ main(int argc, char * argv[])
if (do_sync) {
if (FT_SG & out_type) {
- fprintf(stderr, ">> Synchronizing cache on %s\n", outf);
+ pr2serr(">> Synchronizing cache on %s\n", outf);
res = sg_ll_sync_cache_10(outfd, 0, 0, 0, 0, 0, 1, 0);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention (out, sync cache), "
- "continuing\n");
+ pr2serr("Unit attention (out, sync cache), continuing\n");
res = sg_ll_sync_cache_10(outfd, 0, 0, 0, 0, 0, 0, 0);
}
if (0 != res)
- fprintf(stderr, "Unable to synchronize cache\n");
+ pr2serr("Unable to synchronize cache\n");
}
}
free(wrkBuff);
@@ -2203,7 +2176,7 @@ main(int argc, char * argv[])
if (! ((STDOUT_FILENO == outfd) || (FT_DEV_NULL & out_type)))
close(outfd);
if (0 != dd_count) {
- fprintf(stderr, "Some error occurred,");
+ pr2serr("Some error occurred,");
if (0 == ret)
ret = SG_LIB_CAT_OTHER;
}
@@ -2212,19 +2185,18 @@ main(int argc, char * argv[])
int fd;
char c;
- fprintf(stderr, ">> Direct IO requested but incomplete %d times\n",
+ pr2serr(">> Direct IO requested but incomplete %d times\n",
dio_incomplete);
if ((fd = open(proc_allow_dio, O_RDONLY)) >= 0) {
if (1 == read(fd, &c, 1)) {
if ('0' == c)
- fprintf(stderr, ">>> %s set to '0' but should be set "
- "to '1' for direct IO\n", proc_allow_dio);
+ pr2serr(">>> %s set to '0' but should be set to '1' for "
+ "direct IO\n", proc_allow_dio);
}
close(fd);
}
}
if (sum_of_resids)
- fprintf(stderr, ">> Non-zero sum of residual counts=%d\n",
- sum_of_resids);
+ pr2serr(">> Non-zero sum of residual counts=%d\n", sum_of_resids);
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_decode_sense.c b/src/sg_decode_sense.c
index 42905b10..d8d8dfd2 100644
--- a/src/sg_decode_sense.c
+++ b/src/sg_decode_sense.c
@@ -23,9 +23,10 @@
#include "config.h"
#endif
#include "sg_lib.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.07 20150123";
+static const char * version_str = "1.08 20151219";
#define MAX_SENSE_LEN 1024 /* max descriptor format actually: 256+8 */
@@ -65,8 +66,7 @@ static char concat_buff[1024];
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_decode_sense [--binary=FN] [--file=FN] [--help] [--hex] "
+ pr2serr("Usage: sg_decode_sense [--binary=FN] [--file=FN] [--help] [--hex] "
"[--nospace]\n"
" [--status=SS] [--verbose] [--version] "
"[--write=WFN]\n"
@@ -119,8 +119,8 @@ process_cl(struct opts_t *optsp, int argc, char *argv[])
switch (c) {
case 'b':
if (optsp->fname) {
- fprintf(stderr, "expect only one '--binary=FN' or "
- "'--file=FN' option\n");
+ pr2serr("expect only one '--binary=FN' or '--file=FN' "
+ "option\n");
return SG_LIB_SYNTAX_ERROR;
}
++optsp->do_binary;
@@ -128,8 +128,8 @@ process_cl(struct opts_t *optsp, int argc, char *argv[])
break;
case 'f':
if (optsp->fname) {
- fprintf(stderr, "expect only one '--binary=FN' or "
- "'--file=FN' option\n");
+ pr2serr("expect only one '--binary=FN' or '--file=FN' "
+ "option\n");
return SG_LIB_SYNTAX_ERROR;
}
++optsp->do_file;
@@ -147,11 +147,11 @@ process_cl(struct opts_t *optsp, int argc, char *argv[])
break;
case 's':
if (1 != sscanf(optarg, "%x", &ui)) {
- fprintf(stderr, "'--status=SS' expects a byte value\n");
+ pr2serr("'--status=SS' expects a byte value\n");
return SG_LIB_SYNTAX_ERROR;
}
if (ui > 0xff) {
- fprintf(stderr, "'--status=SS' byte value exceeds FF\n");
+ pr2serr("'--status=SS' byte value exceeds FF\n");
return SG_LIB_SYNTAX_ERROR;
}
++optsp->do_status;
@@ -177,18 +177,18 @@ process_cl(struct opts_t *optsp, int argc, char *argv[])
if (optsp->no_space_str) {
if ('\0' == concat_buff[0]) {
if (strlen(optsp->no_space_str) > sizeof(concat_buff)) {
- fprintf(stderr, "'--nospace' concat_buff overflow\n");
+ pr2serr("'--nospace' concat_buff overflow\n");
return SG_LIB_SYNTAX_ERROR;
}
strcpy(concat_buff, optsp->no_space_str);
}
if ((strlen(concat_buff) + strlen(opt)) >=
sizeof(concat_buff)) {
- fprintf(stderr, "'--nospace' concat_buff overflow\n");
+ pr2serr("'--nospace' concat_buff overflow\n");
return SG_LIB_SYNTAX_ERROR;
}
if (optsp->do_version)
- fprintf(stderr, "'--nospace' and found whitespace so "
+ pr2serr("'--nospace' and found whitespace so "
"concatenate\n");
strcat(concat_buff, opt);
optsp->no_space_str = concat_buff;
@@ -198,13 +198,12 @@ process_cl(struct opts_t *optsp, int argc, char *argv[])
}
val = strtol(opt, &endptr, 16);
if (*opt == '\0' || *endptr != '\0' || val < 0x00 || val > 0xff) {
- fprintf(stderr, "Invalid byte '%s'\n", opt);
+ pr2serr("Invalid byte '%s'\n", opt);
return SG_LIB_SYNTAX_ERROR;
}
if (optsp->sense_len > MAX_SENSE_LEN) {
- fprintf(stderr, "sense data too long (max. %d bytes)\n",
- MAX_SENSE_LEN);
+ pr2serr("sense data too long (max. %d bytes)\n", MAX_SENSE_LEN);
return SG_LIB_SYNTAX_ERROR;
}
optsp->sense[optsp->sense_len++] = (unsigned char)val;
@@ -239,7 +238,7 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
else {
fp = fopen(fname, "r");
if (NULL == fp) {
- fprintf(stderr, "Unable to open %s for reading\n", fname);
+ pr2serr("Unable to open %s for reading\n", fname);
return 1;
}
}
@@ -268,8 +267,8 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
if (1 == sscanf(carry_over, "%x", &h))
mp_arr[off - 1] = h; /* back up and overwrite */
else {
- fprintf(stderr, "f2hex_arr: carry_over error ['%s'] "
- "around line %d\n", carry_over, j + 1);
+ pr2serr("f2hex_arr: carry_over error ['%s'] around line "
+ "%d\n", carry_over, j + 1);
goto bad;
}
lcp = line + 1;
@@ -289,20 +288,20 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
continue;
k = strspn(lcp, "0123456789aAbBcCdDeEfF ,\t");
if ((k < in_len) && ('#' != lcp[k]) && ('\r' != lcp[k])) {
- fprintf(stderr, "f2hex_arr: syntax error at line %d, pos %d\n",
- j + 1, m + k + 1);
+ pr2serr("f2hex_arr: syntax error at line %d, pos %d\n", j + 1,
+ m + k + 1);
goto bad;
}
if (no_space) {
for (k = 0; isxdigit(*lcp) && isxdigit(*(lcp + 1));
++k, lcp += 2) {
if (1 != sscanf(lcp, "%2x", &h)) {
- fprintf(stderr, "f2hex_arr: bad hex number in line %d, "
- "pos %d\n", j + 1, (int)(lcp - line + 1));
+ pr2serr("f2hex_arr: bad hex number in line %d, pos %d\n",
+ j + 1, (int)(lcp - line + 1));
goto bad;
}
if ((off + k) >= max_arr_len) {
- fprintf(stderr, "f2hex_arr: array length exceeded\n");
+ pr2serr("f2hex_arr: array length exceeded\n");
goto bad;
}
mp_arr[off + k] = h;
@@ -314,8 +313,8 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
for (k = 0; k < 1024; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "f2hex_arr: hex number larger than "
- "0xff in line %d, pos %d\n", j + 1,
+ pr2serr("f2hex_arr: hex number larger than 0xff in "
+ "line %d, pos %d\n", j + 1,
(int)(lcp - line + 1));
goto bad;
}
@@ -324,7 +323,7 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
carry_over[0] = *lcp;
}
if ((off + k) >= max_arr_len) {
- fprintf(stderr, "f2hex_arr: array length exceeded\n");
+ pr2serr("f2hex_arr: array length exceeded\n");
goto bad;
}
mp_arr[off + k] = h;
@@ -339,8 +338,8 @@ f2hex_arr(const char * fname, int no_space, unsigned char * mp_arr,
--k;
break;
}
- fprintf(stderr, "f2hex_arr: error in line %d, at pos "
- "%d\n", j + 1, (int)(lcp - line + 1));
+ pr2serr("f2hex_arr: error in line %d, at pos %d\n", j + 1,
+ (int)(lcp - line + 1));
goto bad;
}
}
@@ -380,8 +379,8 @@ write2wfn(FILE * fp, struct opts_t * optsp)
} else {
s = fwrite(optsp->sense, 1, optsp->sense_len, fp);
if ((int)s != optsp->sense_len)
- fprintf(stderr, "only able to write %d of %d bytes to %s\n",
- (int)s, optsp->sense_len, optsp->wfname);
+ pr2serr("only able to write %d of %d bytes to %s\n", (int)s,
+ optsp->sense_len, optsp->wfname);
}
}
@@ -408,7 +407,7 @@ main(int argc, char *argv[])
usage();
return 0;
} else if (opts.do_version) {
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
}
@@ -420,11 +419,11 @@ main(int argc, char *argv[])
if ((0 == opts.sense_len) && opts.no_space_str) {
if (opts.do_verbose > 2)
- fprintf(stderr, "no_space str: %s\n", opts.no_space_str);
+ pr2serr("no_space str: %s\n", opts.no_space_str);
cp = opts.no_space_str;
for (k = 0; isxdigit(cp[k]) && isxdigit(cp[k + 1]); k += 2) {
if (1 != sscanf(cp + k, "%2x", &ui)) {
- fprintf(stderr, "bad no_space hex string: %s\n", cp);
+ pr2serr("bad no_space hex string: %s\n", cp);
return SG_LIB_SYNTAX_ERROR;
}
opts.sense[opts.sense_len++] = (unsigned char)ui;
@@ -434,32 +433,31 @@ main(int argc, char *argv[])
if ((0 == opts.sense_len) && (! opts.do_binary) && (! opts.do_file)) {
if (opts.do_status)
return 0;
- fprintf(stderr, ">> Need sense data on the command line or in a "
- "file\n\n");
+ pr2serr(">> Need sense data on the command line or in a file\n\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (opts.sense_len && (opts.do_binary || opts.do_file)) {
- fprintf(stderr, ">> Need sense data on command line or in a file, "
- "not both\n\n");
+ pr2serr(">> Need sense data on command line or in a file, not "
+ "both\n\n");
return SG_LIB_SYNTAX_ERROR;
}
if (opts.do_binary && opts.do_file) {
- fprintf(stderr, ">> Either a binary file or a ASCII hexadecimal, "
- "file not both\n\n");
+ pr2serr(">> Either a binary file or a ASCII hexadecimal, file not "
+ "both\n\n");
return SG_LIB_SYNTAX_ERROR;
}
if (opts.do_binary) {
fp = fopen(opts.fname, "r");
if (NULL == fp) {
- fprintf(stderr, "unable to open file: %s\n", opts.fname);
+ pr2serr("unable to open file: %s\n", opts.fname);
return SG_LIB_SYNTAX_ERROR;
}
s = fread(opts.sense, 1, MAX_SENSE_LEN, fp);
fclose(fp);
if (0 == s) {
- fprintf(stderr, "read nothing from file: %s\n", opts.fname);
+ pr2serr("read nothing from file: %s\n", opts.fname);
return SG_LIB_SYNTAX_ERROR;
}
opts.sense_len = s;
@@ -467,8 +465,7 @@ main(int argc, char *argv[])
ret = f2hex_arr(opts.fname, opts.no_space, opts.sense,
&opts.sense_len, MAX_SENSE_LEN);
if (ret) {
- fprintf(stderr, "unable to decode ASCII hex from file: %s\n",
- opts.fname);
+ pr2serr("unable to decode ASCII hex from file: %s\n", opts.fname);
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -480,7 +477,7 @@ main(int argc, char *argv[])
fclose(fp);
} else {
perror("open");
- fprintf(stderr, "trying to write to %s\n", opts.wfname);
+ pr2serr("trying to write to %s\n", opts.wfname);
}
}
sg_get_sense_str(NULL, opts.sense, opts.sense_len, opts.do_verbose,
diff --git a/src/sg_emc_trespass.c b/src/sg_emc_trespass.c
index eeb9ebf0..ac7191ce 100644
--- a/src/sg_emc_trespass.c
+++ b/src/sg_emc_trespass.c
@@ -2,7 +2,7 @@
* LUN ownership from one Service-Processor to this one on an EMC
* CLARiiON and potentially other devices.
*
- * Copyright (C) 2004-2014 Lars Marowsky-Bree <lmb@suse.de>
+ * Copyright (C) 2004-2015 Lars Marowsky-Bree <lmb@suse.de>
*
* Based on sg_start.c; credits from there also apply.
* Minor modifications for sg_lib, D. Gilbert 2004/10/19
@@ -26,9 +26,10 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.19 20140516";
+static const char * version_str = "0.20 20141219";
static int debug = 0;
@@ -72,24 +73,24 @@ static int do_trespass(int fd, int hr, int short_cmd)
switch (res) {
case 0:
if (debug)
- fprintf(stderr, "%s trespass successful\n",
- short_cmd ? "short" : "long");
+ pr2serr("%s trespass successful\n",
+ short_cmd ? "short" : "long");
break;
case SG_LIB_CAT_INVALID_OP:
case SG_LIB_CAT_ILLEGAL_REQ:
- fprintf(stderr, "%s form trepass page failed, try again %s "
- "'-s' option\n", short_cmd ? "short" : "long",
+ pr2serr("%s form trepass page failed, try again %s '-s' "
+ "option\n", short_cmd ? "short" : "long",
short_cmd ? "without" : "with");
break;
case SG_LIB_CAT_NOT_READY:
- fprintf(stderr, "device not ready\n");
+ pr2serr("device not ready\n");
break;
case SG_LIB_CAT_UNIT_ATTENTION:
- fprintf(stderr, "unit attention\n");
+ pr2serr("unit attention\n");
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, debug);
- fprintf(stderr, "%s trespass failed: %s\n",
+ pr2serr("%s trespass failed: %s\n",
(short_cmd ? "short" : "long"), b);
break;
}
@@ -98,18 +99,17 @@ static int do_trespass(int fd, int hr, int short_cmd)
void usage ()
{
- fprintf(stderr, "Usage: sg_emc_trespass [-d] [-hr] [-s] "
- " [-V] DEVICE\n"
- " Change ownership of a LUN from another SP to this one.\n"
- " EMC CLARiiON CX-/AX-family + FC5300/FC4500/FC4700.\n"
- " -d : output debug\n"
- " -hr: Set Honor Reservation bit\n"
- " -s : Send Short Trespass Command page (default: long)\n"
- " (for FC series)\n"
- " -V: print version string then exit\n"
- " DEVICE sg or block device (latter in lk 2.6 or lk 3 "
- "series)\n"
- " Example: sg_emc_trespass /dev/sda\n");
+ pr2serr("Usage: sg_emc_trespass [-d] [-hr] [-s] [-V] DEVICE\n"
+ " Change ownership of a LUN from another SP to this one.\n"
+ " EMC CLARiiON CX-/AX-family + FC5300/FC4500/FC4700.\n"
+ " -d : output debug\n"
+ " -hr: Set Honor Reservation bit\n"
+ " -s : Send Short Trespass Command page (default: long)\n"
+ " (for FC series)\n"
+ " -V: print version string then exit\n"
+ " DEVICE sg or block device (latter in lk 2.6 or lk 3 "
+ "series)\n"
+ " Example: sg_emc_trespass /dev/sda\n");
exit (1);
}
@@ -138,14 +138,14 @@ int main(int argc, char * argv[])
exit(0);
}
else if (*argv[k] == '-') {
- fprintf(stderr, "Unrecognized switch: %s\n", argv[k]);
+ pr2serr("Unrecognized switch: %s\n", argv[k]);
file_name = 0;
break;
}
else if (0 == file_name)
file_name = argv[k];
else {
- fprintf(stderr, "too many arguments\n");
+ pr2serr("too many arguments\n");
file_name = 0;
break;
}
@@ -157,7 +157,7 @@ int main(int argc, char * argv[])
fd = open(file_name, O_RDWR | O_NONBLOCK);
if (fd < 0) {
- fprintf(stderr, "Error trying to open %s\n", file_name);
+ pr2serr("Error trying to open %s\n", file_name);
perror("");
usage();
return SG_LIB_FILE_ERROR;
diff --git a/src/sg_format.c b/src/sg_format.c
index c6e732d3..f4b653b8 100644
--- a/src/sg_format.c
+++ b/src/sg_format.c
@@ -32,8 +32,9 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.31 20151207";
+static const char * version_str = "1.32 20151219";
#define RW_ERROR_RECOVERY_PAGE 1 /* can give alternate with --mode=MP */
@@ -205,7 +206,7 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed,
fmt_pl, fmt_pl_sz, 1, verbose);
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Format command: %s\n", b);
+ pr2serr("Format command: %s\n", b);
return res;
}
if (! immed)
@@ -243,13 +244,13 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed,
res = sg_ll_request_sense(fd, 0, reqSense,
sizeof(reqSense), 0, verb);
if (res) {
- fprintf(stderr, "polling with Request Sense "
- "command failed [res=%d]\n", res);
+ pr2serr("polling with Request Sense command "
+ "failed [res=%d]\n", res);
break;
}
resp_len = reqSense[7] + 8;
if (verb) {
- fprintf(stderr, "Parameter data in hex:\n");
+ pr2serr("Parameter data in hex:\n");
dStrHexErr((const char *)reqSense, resp_len,
1);
}
@@ -275,13 +276,13 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed,
if (res) {
ret = res;
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Request Sense command: %s\n", b);
+ pr2serr("Request Sense command: %s\n", b);
break;
}
/* "Additional sense length" same in descriptor and fixed */
resp_len = requestSenseBuff[7] + 8;
if (verbose > 1) {
- fprintf(stderr, "Parameter data in hex\n");
+ pr2serr("Parameter data in hex\n");
dStrHexErr((const char *)requestSenseBuff, resp_len, 1);
}
progress = -1;
@@ -290,8 +291,8 @@ scsi_format(int fd, int fmtpinfo, int cmplst, int pf_usage, int immed,
if (progress < 0) {
ret = res;
if (verbose > 1)
- fprintf(stderr, "No progress indication found, "
- "iteration %d\n", k + 1);
+ pr2serr("No progress indication found, iteration %d\n",
+ k + 1);
/* N.B. exits first time there isn't a progress indication */
break;
} else
@@ -399,21 +400,20 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
printf(" << supports protection information>>"
"\n");
} else {
- fprintf(stderr, "Short INQUIRY response: %d bytes, expect at "
- "least " "36\n", n);
+ pr2serr("Short INQUIRY response: %d bytes, expect at least "
+ "36\n", n);
return SG_LIB_CAT_OTHER;
}
res = sg_ll_inquiry(fd, 0, 1 /* evpd */, VPD_SUPPORTED_VPDS, b,
SAFE_STD_INQ_RESP_LEN, 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS gave res=%d\n",
- res);
+ pr2serr("VPD_SUPPORTED_VPDS gave res=%d\n", res);
return 0;
}
if (VPD_SUPPORTED_VPDS != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS corrupted\n");
+ pr2serr("VPD_SUPPORTED_VPDS corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -423,7 +423,7 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
if (VPD_UNIT_SERIAL_NUM == b[4 + k]) {
if (has_di) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS "
+ pr2serr("VPD_SUPPORTED_VPDS "
"dis-ordered\n");
return 0;
}
@@ -438,14 +438,13 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
b, sizeof(b), 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_UNIT_SERIAL_NUM gave "
- "res=%d\n", res);
+ pr2serr("VPD_UNIT_SERIAL_NUM gave res=%d\n",
+ res);
return 0;
}
if (VPD_UNIT_SERIAL_NUM != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_UNIT_SERIAL_NUM "
- "corrupted\n");
+ pr2serr("VPD_UNIT_SERIAL_NUM corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -459,13 +458,12 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
sizeof(b), 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_DEVICE_ID gave res=%d\n",
- res);
+ pr2serr("VPD_DEVICE_ID gave res=%d\n", res);
return 0;
}
if (VPD_DEVICE_ID != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_DEVICE_ID corrupted\n");
+ pr2serr("VPD_DEVICE_ID corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -539,7 +537,7 @@ print_read_cap(int fd, int do_16, int verbose)
}
}
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "READ CAPACITY (%d): %s\n", (do_16 ? 16 : 10), b);
+ pr2serr("READ CAPACITY (%d): %s\n", (do_16 ? 16 : 10), b);
return -1;
}
@@ -592,8 +590,7 @@ main(int argc, char **argv)
else {
blk_count = sg_get_llnum(optarg);
if (-1 == blk_count) {
- fprintf(stderr, "bad argument to "
- "'--count'\n");
+ pr2serr("bad argument to '--count'\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -601,8 +598,8 @@ main(int argc, char **argv)
case 'C':
cmplst = sg_get_num(optarg);
if ((cmplst < 0) || ( cmplst > 1)) {
- fprintf(stderr, "bad argument to '--cmplst', "
- "want 0 or 1\n");
+ pr2serr("bad argument to '--cmplst', want 0 "
+ "or 1\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -615,9 +612,8 @@ main(int argc, char **argv)
case 'f':
fmtpinfo = sg_get_num(optarg);
if ((fmtpinfo < 0) || ( fmtpinfo > 3)) {
- fprintf(stderr, "bad argument to "
- "'--fmtpinfo', accepts 0 to 3 "
- "inclusive\n");
+ pr2serr("bad argument to '--fmtpinfo', "
+ "accepts 0 to 3 inclusive\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -637,8 +633,8 @@ main(int argc, char **argv)
case 'M':
mode_page = sg_get_num(optarg);
if ((mode_page < 0) || ( mode_page > 62)) {
- fprintf(stderr, "bad argument to '--mode', "
- "accepts 0 to 62 inclusive\n");
+ pr2serr("bad argument to '--mode', accepts "
+ "0 to 62 inclusive\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -648,16 +644,16 @@ main(int argc, char **argv)
case 'P':
pfu = sg_get_num(optarg);
if ((pfu < 0) || ( pfu > 7)) {
- fprintf(stderr, "bad argument to '--pfu', "
- "accepts 0 to 7 inclusive\n");
+ pr2serr("bad argument to '--pfu', accepts 0 "
+ "to 7 inclusive\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'q':
pie = sg_get_num(optarg);
if ((pie < 0) || ( pie > 15)) {
- fprintf(stderr, "bad argument to '--pie', "
- "accepts 0 to 15 inclusive\n");
+ pr2serr("bad argument to '--pie', accepts 0 "
+ "to 15 inclusive\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -670,8 +666,8 @@ main(int argc, char **argv)
case 's':
blk_size = sg_get_num(optarg);
if (blk_size <= 0) {
- fprintf(stderr, "bad argument to '--size', "
- "want arg > 0\n");
+ pr2serr("bad argument to '--size', want arg "
+ "> 0\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -682,8 +678,7 @@ main(int argc, char **argv)
verbose++;
break;
case 'V':
- fprintf(stderr, "sg_format version: %s\n",
- version_str);
+ pr2serr("sg_format version: %s\n", version_str);
return 0;
case 'w':
fwait = 1;
@@ -707,42 +702,41 @@ main(int argc, char **argv)
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
+ pr2serr("Unexpected extra argument: %s\n",
argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (NULL == device_name) {
- fprintf(stderr, "no DEVICE name given\n");
+ pr2serr("no DEVICE name given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (ip_def && do_si) {
- fprintf(stderr, "'--ip_def' and '--security' contradict, "
- "choose one\n");
+ pr2serr("'--ip_def' and '--security' contradict, choose "
+ "one\n");
return SG_LIB_SYNTAX_ERROR;
}
if (resize) {
if (format) {
- fprintf(stderr, "both '--format' and '--resize'"
- "not permitted\n");
+ pr2serr("both '--format' and '--resize' not "
+ "permitted\n");
usage();
return SG_LIB_SYNTAX_ERROR;
} else if (0 == blk_count) {
- fprintf(stderr, "'--resize' needs a '--count' (other"
- " than 0)\n");
+ pr2serr("'--resize' needs a '--count' (other than "
+ "0)\n");
usage();
return SG_LIB_SYNTAX_ERROR;
} else if (0 != blk_size) {
- fprintf(stderr, "'--resize' not compatible with "
- "'--size'\n");
+ pr2serr("'--resize' not compatible with '--size'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if ((pinfo > 0) || (rto_req > 0) || (fmtpinfo > 0)) {
if ((pinfo || rto_req) && fmtpinfo) {
- fprintf(stderr, "confusing with both '--pinfo' or "
+ pr2serr("confusing with both '--pinfo' or "
"'--rto_req' together with\n'--fmtpinfo', "
"best use '--fmtpinfo' only\n");
usage();
@@ -755,8 +749,8 @@ main(int argc, char **argv)
}
if ((fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose)) < 0) {
- fprintf(stderr, "error opening device file: %s: %s\n",
- device_name, safe_strerror(-fd));
+ pr2serr("error opening device file: %s: %s\n", device_name,
+ safe_strerror(-fd));
return SG_LIB_FILE_ERROR;
}
@@ -768,8 +762,8 @@ main(int argc, char **argv)
goto out;
pdt = 0x1f & inq_resp[0];
if ((0 != pdt) && (7 != pdt) && (0xe != pdt)) {
- fprintf(stderr, "This format is only defined for disks "
- "(using SBC-2 or RBC) and MO media\n");
+ pr2serr("This format is only defined for disks (using SBC-2 "
+ "or RBC) and MO media\n");
ret = SG_LIB_CAT_MALFORMED;
goto out;
}
@@ -789,21 +783,20 @@ again_with_long_lba:
if (res) {
if (SG_LIB_CAT_ILLEGAL_REQ == res) {
if (long_lba && (! mode6))
- fprintf(stderr, "bad field in MODE SENSE "
- "(%d) [longlba flag not supported?]"
- "\n", (mode6 ? 6 : 10));
+ pr2serr("bad field in MODE SENSE (%d) "
+ "[longlba flag not supported?]\n",
+ (mode6 ? 6 : 10));
else
- fprintf(stderr, "bad field in MODE SENSE "
- "(%d) [mode_page %d not supported?]"
- "\n", (mode6 ? 6 : 10), mode_page);
+ pr2serr("bad field in MODE SENSE (%d) "
+ "[mode_page %d not supported?]\n",
+ (mode6 ? 6 : 10), mode_page);
} else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "MODE SENSE (%d) command: %s\n",
+ pr2serr("MODE SENSE (%d) command: %s\n",
(mode6 ? 6 : 10), b);
}
if (0 == verbose)
- fprintf(stderr, " try '-v' for more "
- "information\n");
+ pr2serr(" try '-v' for more information\n");
goto out;
}
if (mode6) {
@@ -840,8 +833,8 @@ again_with_long_lba:
sg_get_unaligned_be32(dbuff + offset);
if ((0 == long_lba) && (0xffffffff == ull)) {
if (verbose)
- fprintf(stderr, "Mode sense number of "
- "blocks maxed out, set longlba\n");
+ pr2serr("Mode sense number of blocks maxed "
+ "out, set longlba\n");
long_lba = 1;
mode6 = 0;
do_rcap16 = 1;
@@ -902,10 +895,10 @@ again_with_long_lba:
*/
if (prob) {
- fprintf(stderr, "Need to perform MODE SELECT (to "
- "change number or blocks or block length)\n");
- fprintf(stderr, "but (single) block descriptor not "
- "found in earlier MODE SENSE\n");
+ pr2serr("Need to perform MODE SELECT (to change "
+ "number or blocks or block length)\n");
+ pr2serr("but (single) block descriptor not found "
+ "in earlier MODE SENSE\n");
ret = SG_LIB_CAT_MALFORMED;
goto out;
}
@@ -936,10 +929,9 @@ again_with_long_lba:
ret = res;
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "MODE SELECT command: %s\n", b);
+ pr2serr("MODE SELECT command: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for "
- "more information\n");
+ pr2serr(" try '-v' for more information\n");
goto out;
}
}
@@ -986,20 +978,20 @@ format_only:
pie, ip_def, do_si, early, pt, verbose);
ret = res;
if (res) {
- fprintf(stderr, "FORMAT failed\n");
+ pr2serr("FORMAT failed\n");
if (0 == verbose)
- fprintf(stderr, " try '-v' for more "
+ pr2serr(" try '-v' for more "
"information\n");
}
#else
- fprintf(stderr, "FORMAT ignored, testing\n");
+ pr2serr("FORMAT ignored, testing\n");
#endif
}
out:
res = sg_cmds_close_device(fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_get_config.c b/src/sg_get_config.c
index 4125b79b..d98341b6 100644
--- a/src/sg_get_config.c
+++ b/src/sg_get_config.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Douglas Gilbert.
+ * Copyright (c) 2004-2015 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.
@@ -19,6 +19,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_mmc.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -27,7 +28,7 @@
*/
-static const char * version_str = "0.39 20140516"; /* mmc6r02 */
+static const char * version_str = "0.40 20151219"; /* mmc6r02 */
#define MX_ALLOC_LEN 8192
#define NAME_BUFF_SZ 64
@@ -57,8 +58,7 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr,
- "Usage: sg_get_config [--brief] [--current] [--help] [--hex] "
+ pr2serr("Usage: sg_get_config [--brief] [--current] [--help] [--hex] "
"[--inner-hex]\n"
" [--list] [--raw] [--readonly] [--rt=RT]\n"
" [--starting=FC] [--verbose] [--version] "
@@ -873,7 +873,7 @@ decode_feature(int feature, unsigned char * ucp, int len)
}
break;
default:
- fprintf(stderr, " Unknown feature [0x%x], version=%d persist=%d, "
+ pr2serr(" Unknown feature [0x%x], version=%d persist=%d, "
"current=%d\n", feature, ((ucp[2] >> 2) & 0xf),
!!(ucp[2] & 0x2), !!(ucp[2] & 0x1));
dStrHexErr((const char *)ucp, len, 1);
@@ -890,17 +890,17 @@ decode_config(unsigned char * resp, int max_resp_len, int len, int brief,
char buff[128];
if (max_resp_len < len) {
- fprintf(stderr, "<<<warning: response to long for buffer, "
- "resp_len=%d>>>\n", len);
+ pr2serr("<<<warning: response to long for buffer, resp_len=%d>>>\n",
+ len);
len = max_resp_len;
}
if (len < 8) {
- fprintf(stderr, "response length too short: %d\n", len);
+ pr2serr("response length too short: %d\n", len);
return;
}
curr_profile = (resp[6] << 8) + resp[7];
if (0 == curr_profile)
- fprintf(stderr, "No current profile\n");
+ pr2serr("No current profile\n");
else
printf("Current profile: %s\n", get_profile_str(curr_profile, buff));
printf("Features%s:\n", (brief ? " (in brief)" : ""));
@@ -998,7 +998,7 @@ main(int argc, char * argv[])
case 'r':
rt = sg_get_num(optarg);
if ((rt < 0) || (rt > 3)) {
- fprintf(stderr, "bad argument to '--rt'\n");
+ pr2serr("bad argument to '--rt'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -1008,7 +1008,7 @@ main(int argc, char * argv[])
case 's':
starting = sg_get_num(optarg);
if ((starting < 0) || (starting > 0xffff)) {
- fprintf(stderr, "bad argument to '--starting'\n");
+ pr2serr("bad argument to '--starting'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -1016,10 +1016,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -1031,8 +1031,7 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -1043,13 +1042,13 @@ main(int argc, char * argv[])
return 0;
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((sg_fd = sg_cmds_open_device(device_name, 1 /* ro */, verbose)) < 0) {
- fprintf(stderr, ME "error opening file: %s (ro): %s\n",
- device_name, safe_strerror(-sg_fd));
+ pr2serr(ME "error opening file: %s (ro): %s\n", device_name,
+ safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (0 == sg_simple_inquiry(sg_fd, &inq_resp, 1, verbose)) {
@@ -1065,15 +1064,14 @@ main(int argc, char * argv[])
printf(" Peripheral device type: 0x%x\n", peri_type);
}
} else {
- fprintf(stderr, ME "%s doesn't respond to a SCSI INQUIRY\n",
- device_name);
+ pr2serr(ME "%s doesn't respond to a SCSI INQUIRY\n", device_name);
return SG_LIB_CAT_OTHER;
}
sg_cmds_close_device(sg_fd);
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error (rw): %s\n", safe_strerror(-sg_fd));
+ pr2serr(ME "open error (rw): %s\n", safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (do_raw) {
@@ -1102,14 +1100,14 @@ main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Get Configuration command: %s\n", b);
+ pr2serr("Get Configuration command: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' option for more information\n");
+ pr2serr(" try '-v' option for more information\n");
}
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_get_lba_status.c b/src/sg_get_lba_status.c
index d667580c..69bfa18e 100644
--- a/src/sg_get_lba_status.c
+++ b/src/sg_get_lba_status.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2014 Douglas Gilbert.
+ * Copyright (c) 2009-2015 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.
@@ -20,6 +20,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -28,7 +30,7 @@
* device.
*/
-static const char * version_str = "1.06 20140515"; /* sbc2r29 */
+static const char * version_str = "1.07 20151219";
#define MAX_GLBAS_BUFF_LEN (1024 * 1024)
#define DEF_GLBAS_BUFF_LEN 24
@@ -53,8 +55,8 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_get_lba_status [--brief] [--help] [--hex] [--lba=LBA]\n"
+ pr2serr("Usage: sg_get_lba_status [--brief] [--help] [--hex] "
+ "[--lba=LBA]\n"
" [--maxlen=LEN] [--raw] [--readonly] "
"[--verbose]\n"
" [--version] DEVICE\n"
@@ -71,8 +73,7 @@ usage()
"length in cdb)\n"
" (def: 0 -> %d bytes)\n",
DEF_GLBAS_BUFF_LEN );
- fprintf(stderr,
- " --raw|-r output in binary\n"
+ pr2serr(" --raw|-r output in binary\n"
" --readonly|-R open DEVICE read-only (def: read-write)\n"
" --verbose|-v increase verbosity\n"
" --version|-V print version string and exit\n\n"
@@ -96,24 +97,13 @@ static int
decode_lba_status_desc(const unsigned char * ucp, uint64_t * slbap,
uint32_t * blocksp)
{
- int j;
uint32_t blocks;
uint64_t ull;
if (NULL == ucp)
return -1;
- ull = 0;
- for (j = 0; j < 8; ++j) {
- if (j > 0)
- ull <<= 8;
- ull |= ucp[j];
- }
- blocks = 0;
- for (j = 0; j < 4; ++j) {
- if (j > 0)
- blocks <<= 8;
- blocks |= ucp[8 + j];
- }
+ ull = sg_get_unaligned_be64(ucp + 0);
+ blocks = sg_get_unaligned_be32(ucp + 8);
if (slbap)
*slbap = ull;
if (blocksp)
@@ -162,7 +152,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
lba = (uint64_t)ll;
@@ -170,8 +160,8 @@ main(int argc, char * argv[])
case 'm':
maxlen = sg_get_num(optarg);
if ((maxlen < 0) || (maxlen > MAX_GLBAS_BUFF_LEN)) {
- fprintf(stderr, "argument to '--maxlen' should be %d or "
- "less\n", MAX_GLBAS_BUFF_LEN);
+ pr2serr("argument to '--maxlen' should be %d or less\n",
+ MAX_GLBAS_BUFF_LEN);
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -185,10 +175,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -200,22 +190,21 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (maxlen > DEF_GLBAS_BUFF_LEN) {
glbasBuffp = (unsigned char *)calloc(maxlen, 1);
if (NULL == glbasBuffp) {
- fprintf(stderr, "unable to allocate %d bytes on heap\n", maxlen);
+ pr2serr("unable to allocate %d bytes on heap\n", maxlen);
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -229,8 +218,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
ret = SG_LIB_FILE_ERROR;
goto free_buff;
}
@@ -242,8 +230,7 @@ main(int argc, char * argv[])
/* in sbc3r25 offset for calculating the 'parameter data length'
* (rlen variable below) was reduced from 8 to 4. */
if (maxlen >= 4)
- rlen = (glbasBuffp[0] << 24) + (glbasBuffp[1] << 16) +
- (glbasBuffp[2] << 8) + glbasBuffp[3] + 4;
+ rlen = sg_get_unaligned_be32(glbasBuffp + 0) + 4;
else
rlen = maxlen;
k = (rlen > maxlen) ? maxlen : rlen;
@@ -257,39 +244,38 @@ main(int argc, char * argv[])
}
if (maxlen < 4) {
if (verbose)
- fprintf(stderr, "Exiting because allocation length (maxlen) "
- " less than 4\n");
+ pr2serr("Exiting because allocation length (maxlen) less "
+ "than 4\n");
goto the_end;
}
if ((verbose > 1) || (verbose && (rlen > maxlen))) {
- fprintf(stderr, "response length %d bytes\n", rlen);
+ pr2serr("response length %d bytes\n", rlen);
if (rlen > maxlen)
- fprintf(stderr, " ... which is greater than maxlen "
- "(allocation length %d), truncation\n", maxlen);
+ pr2serr(" ... which is greater than maxlen (allocation "
+ "length %d), truncation\n", maxlen);
}
if (rlen > maxlen)
rlen = maxlen;
if (do_brief > 1) {
if (rlen < 24) {
- fprintf(stderr, "Need maxlen and response length to "
- " be at least 24, have %d bytes\n", rlen);
+ pr2serr("Need maxlen and response length to be at least 24, "
+ "have %d bytes\n", rlen);
ret = SG_LIB_CAT_OTHER;
goto the_end;
}
res = decode_lba_status_desc(glbasBuffp + 8, &d_lba, &d_blocks);
if ((res < 0) || (res > 15)) {
- fprintf(stderr, "first LBA status descriptor returned %d "
- "??\n", res);
+ pr2serr("first LBA status descriptor returned %d ??\n", res);
ret = SG_LIB_CAT_OTHER;
goto the_end;
}
if ((lba < d_lba) || (lba >= (d_lba + d_blocks))) {
- fprintf(stderr, "given LBA not in range of first "
- "descriptor:\n" " descriptor LBA: 0x");
+ pr2serr("given LBA not in range of first descriptor:\n"
+ " descriptor LBA: 0x");
for (j = 0; j < 8; ++j)
- fprintf(stderr, "%02x", glbasBuffp[8 + j]);
- fprintf(stderr, " blocks: 0x%x p_status: %d\n",
+ pr2serr("%02x", glbasBuffp[8 + j]);
+ pr2serr(" blocks: 0x%x p_status: %d\n",
(unsigned int)d_blocks, res);
ret = SG_LIB_CAT_OTHER;
goto the_end;
@@ -304,13 +290,12 @@ main(int argc, char * argv[])
}
num_descs = (rlen - 8) / 16;
if (verbose)
- fprintf(stderr, "%d complete LBA status descriptors found\n",
- num_descs);
+ pr2serr("%d complete LBA status descriptors found\n", num_descs);
for (ucp = glbasBuffp + 8, k = 0; k < num_descs; ucp += 16, ++k) {
res = decode_lba_status_desc(ucp, &d_lba, &d_blocks);
if ((res < 0) || (res > 15))
- fprintf(stderr, "descriptor %d: bad LBA status descriptor "
- "returned %d\n", k + 1, res);
+ pr2serr("descriptor %d: bad LBA status descriptor returned "
+ "%d\n", k + 1, res);
if (do_brief) {
printf("0x");
for (j = 0; j < 8; ++j)
@@ -323,7 +308,7 @@ main(int argc, char * argv[])
printf(" blocks: %u", (unsigned int)d_blocks);
switch (res) {
case 0:
- printf(" mapped\n");
+ printf(" mapped (or unknown)\n");
break;
case 1:
printf(" deallocated\n");
@@ -338,23 +323,22 @@ main(int argc, char * argv[])
}
}
if ((num_descs * 16) + 8 < rlen)
- fprintf(stderr, "incomplete trailing LBA status descriptors "
- "found\n");
+ pr2serr("incomplete trailing LBA status descriptors found\n");
} else if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "Get LBA Status command not supported\n");
+ pr2serr("Get LBA Status command not supported\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "Get LBA Status command: bad field in cdb\n");
+ pr2serr("Get LBA Status command: bad field in cdb\n");
else {
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Get LBA Status command: %s\n", b);
+ pr2serr("Get LBA Status command: %s\n", b);
}
the_end:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
ret = SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_ident.c b/src/sg_ident.c
index af217845..3f641564 100644
--- a/src/sg_ident.c
+++ b/src/sg_ident.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005-2014 Douglas Gilbert.
+ * Copyright (c) 2005-2015 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.
@@ -18,6 +18,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -27,7 +29,7 @@
* DEVICE IDENTIFIER and SET DEVICE IDENTIFIER prior to spc4r07.
*/
-static const char * version_str = "1.13 20140904";
+static const char * version_str = "1.14 20151219";
#define ME "sg_ident: "
@@ -63,14 +65,14 @@ static void decode_ii(const unsigned char * iip, int ii_len, int itype,
n = write(STDOUT_FILENO, iip, ii_len);
#endif
if (verbose && (n < 1))
- fprintf(stderr, "unable to write to stdout\n");
+ pr2serr("unable to write to stdout\n");
}
return;
}
if (0x7f == itype) { /* list of available information types */
for (k = 0; k < (ii_len - 3); k += 4)
printf(" Information type: %d, Maximum information length: "
- "%d bytes\n", iip[k], ((iip[k + 2] << 8) + iip[k + 3]));
+ "%d bytes\n", iip[k], sg_get_unaligned_be16(iip + 2));
} else { /* single element */
if (verbose)
printf("Information:\n");
@@ -85,26 +87,25 @@ static void decode_ii(const unsigned char * iip, int ii_len, int itype,
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_ident [--ascii] [--clear] [--help] [--itype=IT] [--raw] "
- "[--set]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --ascii|-A report identifying information as ASCII "
- "(or UTF8) string\n"
- " --clear|-C clear (set to zero length) identifying "
- "information\n"
- " --help|-h print out usage message\n"
- " --itype=IT|-i IT specify identifying information type "
- "(def: 0)\n"
- " --raw|-r output identifying information to "
- "stdout\n"
- " --set|-S invoke set identifying information with "
- "data from stdin\n"
- " --verbose|-v increase verbosity of output\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI REPORT (or SET) IDENTIFYING INFORMATION command\n"
- );
+ pr2serr("Usage: sg_ident [--ascii] [--clear] [--help] [--itype=IT] "
+ "[--raw] [--set]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --ascii|-A report identifying information as ASCII "
+ "(or UTF8) string\n"
+ " --clear|-C clear (set to zero length) identifying "
+ "information\n"
+ " --help|-h print out usage message\n"
+ " --itype=IT|-i IT specify identifying information type "
+ "(def: 0)\n"
+ " --raw|-r output identifying information to "
+ "stdout\n"
+ " --set|-S invoke set identifying information with "
+ "data from stdin\n"
+ " --verbose|-v increase verbosity of output\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI REPORT (or SET) IDENTIFYING INFORMATION "
+ "command\n");
}
int main(int argc, char * argv[])
@@ -144,8 +145,7 @@ int main(int argc, char * argv[])
case 'i':
itype = sg_get_num(optarg);
if ((itype < 0) || (itype > 127)) {
- fprintf(stderr, "argument to '--itype' should be in range "
- "0 to 127\n");
+ pr2serr("argument to '--itype' should be in range 0 to 127\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -159,10 +159,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -174,38 +174,35 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (do_set && do_clear) {
- fprintf(stderr, "only one of '--clear' and '--set' can be given\n");
+ pr2serr("only one of '--clear' and '--set' can be given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (ascii && raw) {
- fprintf(stderr, "only one of '--ascii' and '--raw' can be given\n");
+ pr2serr("only one of '--ascii' and '--raw' can be given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((do_set || do_clear) && (raw || ascii)) {
- fprintf(stderr, "'--set' cannot be used with either '--ascii' or "
- "'--raw'\n");
+ pr2serr("'--set' cannot be used with either '--ascii' or '--raw'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -214,13 +211,12 @@ int main(int argc, char * argv[])
if (do_set) {
res = fread(rdi_buff, 1, REPORT_ID_INFO_SANITY_LEN + 2, stdin);
if (res <= 0) {
- fprintf(stderr, "no data read from stdin; to clear "
- "identifying information use '--clear' instead\n");
+ pr2serr("no data read from stdin; to clear identifying "
+ "information use '--clear' instead\n");
ret = -1;
goto err_out;
} else if (res > REPORT_ID_INFO_SANITY_LEN) {
- fprintf(stderr, "SPC-4 limits information length to 512 "
- "bytes\n");
+ pr2serr("SPC-4 limits information length to 512 bytes\n");
ret = -1;
goto err_out;
}
@@ -232,26 +228,25 @@ int main(int argc, char * argv[])
if (res) {
ret = res;
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Set identifying information: %s\n", b);
+ pr2serr("Set identifying information: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for more information\n");
+ pr2serr(" try '-v' for more information\n");
}
} else { /* do report identifying information */
res = sg_ll_report_id_info(sg_fd, itype, rdi_buff, 4, 1, verbose);
if (0 == res) {
- ii_len = (rdi_buff[0] << 24) + (rdi_buff[1] << 16) +
- (rdi_buff[2] << 8) + rdi_buff[3];
+ ii_len = sg_get_unaligned_be32(rdi_buff + 0);
if ((! raw) && (verbose > 0))
printf("Reported identifying information length = %d\n",
ii_len);
if (0 == ii_len) {
if (verbose > 1)
- fprintf(stderr, " This implies the device has an "
- "empty information field\n");
+ pr2serr(" This implies the device has an empty "
+ "information field\n");
goto err_out;
}
if (ii_len > REPORT_ID_INFO_SANITY_LEN) {
- fprintf(stderr, " That length (%d) seems too long for an "
+ pr2serr(" That length (%d) seems too long for an "
"information\n", ii_len);
ret = -1;
goto err_out;
@@ -260,8 +255,7 @@ int main(int argc, char * argv[])
res = sg_ll_report_id_info(sg_fd, itype, ucp, ii_len + 4, 1,
verbose);
if (0 == res) {
- ii_len = (ucp[0] << 24) + (ucp[1] << 16) + (ucp[2] << 8) +
- ucp[3];
+ ii_len = sg_get_unaligned_be32(ucp + 0);
decode_ii(ucp + 4, ii_len, itype, ascii, raw, verbose);
} else
ret = res;
@@ -269,16 +263,16 @@ int main(int argc, char * argv[])
ret = res;
if (ret) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Report identifying information: %s\n", b);
+ pr2serr("Report identifying information: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for more information\n");
+ pr2serr(" try '-v' for more information\n");
}
}
err_out:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 0a4c5ad0..7cbf4d04 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -19,7 +19,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -41,8 +40,9 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.51 20151201"; /* SPC-5 rev 06 */
+static const char * version_str = "1.52 20151219"; /* SPC-5 rev 06 */
/* INQUIRY notes:
* It is recommended that the initial allocation length given to a
@@ -238,26 +238,6 @@ struct opts_t {
#endif
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
diff --git a/src/sg_logs.c b/src/sg_logs.c
index 745b6954..76888f3f 100644
--- a/src/sg_logs.c
+++ b/src/sg_logs.c
@@ -14,7 +14,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
@@ -28,10 +27,11 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
-#include "sg_unaligned.h"
#include "sg_pt.h" /* needed for scsi_pt_win32_direct() */
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.34 20151127"; /* spc5r07 + sbc4r05 */
+static const char * version_str = "1.36 20151219"; /* spc5r07 + sbc4r05 */
#define MX_ALLOC_LEN (0xfffc)
#define SHORT_RESP_LEN 128
@@ -328,6 +328,8 @@ static struct log_elem log_arr[] = {
show_power_condition_transitions_page}, /* 0x1a, 0 */
{0x1b, 0, 0, PDT_TAPE, 0, "Data compression", "dc",
show_data_compression_page}, /* 0x1b, 0 SSC */
+ {0x2d, 0, 0, PDT_TAPE, 0, "Current service information", "csi",
+ NULL}, /* 0x2d, 0 SSC */
{TAPE_ALERT_LPAGE, 0, 0, PDT_TAPE, 0, "Tape alert", "ta",
show_tape_alert_ssc_page}, /* 0x2e, 0 SSC */
{IE_LPAGE, 0, 0, -1, 0, "Informational exceptions", "ie",
@@ -381,26 +383,6 @@ static int win32_spt_curr_state = 0;
#endif
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage(int hval)
{
diff --git a/src/sg_luns.c b/src/sg_luns.c
index 172b4a87..b7c0d5b9 100644
--- a/src/sg_luns.c
+++ b/src/sg_luns.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -22,6 +21,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -30,7 +30,7 @@
* and decodes the response.
*/
-static const char * version_str = "1.29 20151207";
+static const char * version_str = "1.30 20151219";
#define MAX_RLUNS_BUFF_LEN (1024 * 1024)
#define DEF_RLUNS_BUFF_LEN (1024 * 8)
@@ -56,39 +56,18 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
#ifdef SG_LIB_LINUX
- pr2serr("Usage: "
- "sg_luns [--decode] [--help] [--hex] [--linux] "
+ pr2serr("Usage: sg_luns [--decode] [--help] [--hex] [--linux] "
"[--lu_cong]\n"
" [--maxlen=LEN] [--quiet] [--raw] "
"[--readonly]\n"
" [--select=SR] [--verbose] [--version] "
"DEVICE\n");
#else
- pr2serr("Usage: "
- "sg_luns [--decode] [--help] [--hex] [--lu_cong] "
+ pr2serr("Usage: sg_luns [--decode] [--help] [--hex] [--lu_cong] "
"[--maxlen=LEN]\n"
" [--quiet] [--raw] [--readonly] "
"[--select=SR]\n"
diff --git a/src/sg_map26.c b/src/sg_map26.c
index f778fc55..ff79aae5 100644
--- a/src/sg_map26.c
+++ b/src/sg_map26.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005-2013 Douglas Gilbert.
+ * Copyright (c) 2005-2015 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.
@@ -23,6 +23,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
@@ -39,7 +40,7 @@
#endif
#include "sg_lib.h"
-static const char * version_str = "1.09 20130507";
+static const char * version_str = "1.10 20151219";
#define ME "sg_map26: "
@@ -123,11 +124,30 @@ static const char * nt_names[] = {
"directory",
};
+#ifdef __GNUC__
+static int pr2serr(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2serr(const char * fmt, ...);
+#endif
+
+
+static int
+pr2serr(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_map26 [--dev_dir=DIR] [--given_is=0...1] [--help] "
+ pr2serr("Usage: sg_map26 [--dev_dir=DIR] [--given_is=0...1] [--help] "
"[--result=0...3]\n"
" [--symlink] [--verbose] [--version] "
"DEVICE\n"
@@ -357,7 +377,7 @@ list_matching_nodes(const char * dir_name, int file_type, int majj, int minn,
num = scandir(dir_name, &namelist, nd_match_scandir_select, NULL);
if (num < 0) {
if (verbose)
- fprintf(stderr, "scandir: %s %s\n", dir_name,
+ pr2serr("scandir: %s %s\n", dir_name,
ssafe_strerror(errno));
return -errno;
}
@@ -472,13 +492,13 @@ from_sg_scan(const char * dir_name, int verbose)
num = scandir(dir_name, &namelist, from_sg_scandir_select, NULL);
if (num < 0) {
if (verbose)
- fprintf(stderr, "scandir: %s %s\n", dir_name,
+ pr2serr("scandir: %s %s\n", dir_name,
ssafe_strerror(errno));
return -errno;
}
if (verbose) {
for (k = 0; k < num; ++k)
- fprintf(stderr, " %s/%s\n", dir_name,
+ pr2serr(" %s/%s\n", dir_name,
namelist[k]->d_name);
}
for (k = 0; k < num; ++k)
@@ -679,15 +699,14 @@ map_sd(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs sd dev: %s\n", value);
+ pr2serr("sysfs sd dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if (if_directory_ch2generic(".")) {
@@ -698,25 +717,22 @@ map_sd(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs generic"
- "dev\n");
+ pr2serr("Couldn't find sysfs generic dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, FT_CHAR, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "sd device: %s does not match any "
- "SCSI generic device\n", device_name);
- fprintf(stderr, " perhaps sg module is not "
- "loaded\n");
+ pr2serr("sd device: %s does not match any SCSI generic "
+ "device\n", device_name);
+ pr2serr(" perhaps sg module is not loaded\n");
return 1;
}
}
@@ -740,15 +756,14 @@ map_sr(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs sr dev: %s\n", value);
+ pr2serr("sysfs sr dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if (if_directory_ch2generic(".")) {
@@ -759,25 +774,22 @@ map_sr(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs generic"
- "dev\n");
+ pr2serr("Couldn't find sysfs generic dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, FT_BLOCK, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "sr device: %s does not match any "
- "SCSI generic device\n", device_name);
- fprintf(stderr, " perhaps sg module is not "
- "loaded\n");
+ pr2serr("sr device: %s does not match any SCSI generic "
+ "device\n", device_name);
+ pr2serr(" perhaps sg module is not loaded\n");
return 1;
}
}
@@ -802,15 +814,14 @@ map_st(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs st dev: %s\n", value);
+ pr2serr("sysfs st dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if (if_directory_ch2generic(".")) {
@@ -821,25 +832,22 @@ map_st(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs generic"
- "dev\n");
+ pr2serr("Couldn't find sysfs generic dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, FT_CHAR, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "st device: %s does not match any "
- "SCSI generic device\n", device_name);
- fprintf(stderr, " perhaps sg module is not "
- "loaded\n");
+ pr2serr("st device: %s does not match any SCSI generic "
+ "device\n", device_name);
+ pr2serr(" perhaps sg module is not loaded\n");
return 1;
}
}
@@ -864,15 +872,14 @@ map_osst(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs osst dev: %s\n", value);
+ pr2serr("sysfs osst dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if (if_directory_ch2generic(".")) {
@@ -883,25 +890,22 @@ map_osst(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs generic"
- "dev\n");
+ pr2serr("Couldn't find sysfs generic dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, FT_CHAR, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "osst device: %s does not match any "
- "SCSI generic device\n", device_name);
- fprintf(stderr, " perhaps sg module is not "
- "loaded\n");
+ pr2serr("osst device: %s does not match any SCSI generic "
+ "device\n", device_name);
+ pr2serr(" perhaps sg module is not loaded\n");
return 1;
}
}
@@ -925,15 +929,14 @@ map_ch(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs sch dev: %s\n", value);
+ pr2serr("sysfs sch dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if (if_directory_ch2generic(".")) {
@@ -944,25 +947,22 @@ map_ch(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs generic"
- "dev\n");
+ pr2serr("Couldn't find sysfs generic dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, FT_CHAR, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "sch device: %s does not match any "
- "SCSI generic device\n", device_name);
- fprintf(stderr, " perhaps sg module is not "
- "loaded\n");
+ pr2serr("sch device: %s does not match any SCSI generic "
+ "device\n", device_name);
+ pr2serr(" perhaps sg module is not loaded\n");
return 1;
}
}
@@ -986,15 +986,14 @@ map_sg(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(name, "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs match for "
- "device: %s\n", device_name);
+ pr2serr("Couldn't find sysfs match for device: %s\n",
+ device_name);
return 1;
}
if (verbose)
- fprintf(stderr, "sysfs sg dev: %s\n", value);
+ pr2serr("sysfs sg dev: %s\n", value);
if (! if_directory_chdir(name, "device")) {
- fprintf(stderr, "sysfs problem with device: %s\n",
- device_name);
+ pr2serr("sysfs problem with device: %s\n", device_name);
return 1;
}
if ((1 == from_sg_scan(".", verbose)) &&
@@ -1004,8 +1003,7 @@ map_sg(const char * device_name, const char * device_dir, int ma, int mi,
(if_directory_chdir(".", for_first.name))) {
;
} else {
- fprintf(stderr, "unexpected scan_for_first "
- "error\n");
+ pr2serr("unexpected scan_for_first error\n");
}
}
if (1 == result) {
@@ -1015,23 +1013,21 @@ map_sg(const char * device_name, const char * device_dir, int ma, int mi,
return 0;
}
if (! get_value(".", "dev", value, sizeof(value))) {
- fprintf(stderr, "Couldn't find sysfs block "
- "dev\n");
+ pr2serr("Couldn't find sysfs block dev\n");
return 1;
}
if (verbose)
printf("matching dev: %s\n", value);
if (2 != sscanf(value, "%d:%d", &m_ma, &m_mi)) {
- fprintf(stderr, "Couldn't decode mapped "
- "dev\n");
+ pr2serr("Couldn't decode mapped dev\n");
return 1;
}
num = list_matching_nodes(device_dir, from_sg.ft, m_ma, m_mi,
follow_symlink, verbose);
return (num > 0) ? 0 : 1;
} else {
- fprintf(stderr, "sg device: %s does not match any "
- "other SCSI device\n", device_name);
+ pr2serr("sg device: %s does not match any other SCSI "
+ "device\n", device_name);
return 1;
}
}
@@ -1072,8 +1068,8 @@ main(int argc, char * argv[])
if ((1 == num) && ((0 == res) || (1 == res)))
given_is = res;
else {
- fprintf(stderr, "value for '--given_to=' "
- "must be 0 or 1\n");
+ pr2serr("value for '--given_to=' must be 0 "
+ "or 1\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -1086,8 +1082,8 @@ main(int argc, char * argv[])
if ((1 == num) && (res >= 0) && (res < 4))
result = res;
else {
- fprintf(stderr, "value for '--result=' "
- "must be 0..3\n");
+ pr2serr("value for '--result=' must be "
+ "0..3\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -1098,11 +1094,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n",
- c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -1116,15 +1111,15 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: "
- "%s\n", argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n",
+ argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (0 == device_name[0]) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -1138,10 +1133,10 @@ main(int argc, char * argv[])
else
device_dir[0] = '\0';
if (verbose > 1)
- fprintf(stderr, "Absolute path to "
- "dev_dir: %s\n", device_dir);
+ pr2serr("Absolute path to dev_dir: %s\n",
+ device_dir);
} else {
- fprintf(stderr, "dev_dir: %s invalid\n", device_dir);
+ pr2serr("dev_dir: %s invalid\n", device_dir);
return SG_LIB_FILE_ERROR;
}
} else {
@@ -1154,21 +1149,21 @@ main(int argc, char * argv[])
}
ret = nt_typ_from_filename(device_name, &ma, &mi);
if (ret < 0) {
- fprintf(stderr, "stat failed on %s: %s\n", device_name,
+ pr2serr("stat failed on %s: %s\n", device_name,
ssafe_strerror(-ret));
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, " %s: %s device [maj=%d, min=%d]\n",
- device_name, nt_names[ret], ma, mi);
+ pr2serr(" %s: %s device [maj=%d, min=%d]\n", device_name,
+ nt_names[ret], ma, mi);
res = 0;
switch (ret) {
case NT_SD:
case NT_SR:
case NT_HD:
if (given_is > 0) {
- fprintf(stderr, "block special but '--given_is=' "
- "suggested sysfs device\n");
+ pr2serr("block special but '--given_is=' suggested "
+ "sysfs device\n");
return SG_LIB_FILE_ERROR;
}
break;
@@ -1177,23 +1172,23 @@ main(int argc, char * argv[])
case NT_CH:
case NT_SG:
if (given_is > 0) {
- fprintf(stderr, "character special but '--given_is=' "
+ pr2serr("character special but '--given_is=' "
"suggested sysfs device\n");
return SG_LIB_FILE_ERROR;
}
break;
case NT_REG:
if (0 == given_is) {
- fprintf(stderr, "regular file but '--given_is=' "
- "suggested block or char special\n");
+ pr2serr("regular file but '--given_is=' suggested "
+ "block or char special\n");
return SG_LIB_FILE_ERROR;
}
strcpy(device_dir, def_dev_dir);
break;
case NT_DIR:
if (0 == given_is) {
- fprintf(stderr, "directory but '--given_is=' "
- "suggested block or char special\n");
+ pr2serr("directory but '--given_is=' suggested "
+ "block or char special\n");
return SG_LIB_FILE_ERROR;
}
strcpy(device_dir, def_dev_dir);
@@ -1219,8 +1214,8 @@ main(int argc, char * argv[])
break;
case NT_HD:
if (result < 2) {
- fprintf(stderr, "a hd device does not map "
- "to a sg device\n");
+ pr2serr("a hd device does not map to a sg "
+ "device\n");
return SG_LIB_FILE_ERROR;
}
res = map_hd(device_dir, ma, mi, result,
@@ -1245,14 +1240,14 @@ main(int argc, char * argv[])
case NT_REG:
if (! get_value(NULL, device_name, value,
sizeof(value))) {
- fprintf(stderr, "Couldn't fetch value "
- "from: %s\n", device_name);
+ pr2serr("Couldn't fetch value from: %s\n",
+ device_name);
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, "value: %s\n", value);
+ pr2serr("value: %s\n", value);
if (2 != sscanf(value, "%d:%d", &ma, &mi)) {
- fprintf(stderr, "Couldn't decode value\n");
+ pr2serr("Couldn't decode value\n");
return SG_LIB_FILE_ERROR;
}
tt = nt_typ_from_major(ma);
@@ -1261,14 +1256,14 @@ main(int argc, char * argv[])
case NT_DIR:
if (! get_value(device_name, "dev", value,
sizeof(value))) {
- fprintf(stderr, "Couldn't fetch value from: "
- "%s/dev\n", device_name);
+ pr2serr("Couldn't fetch value from: %s/dev\n",
+ device_name);
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, "value: %s\n", value);
+ pr2serr("value: %s\n", value);
if (2 != sscanf(value, "%d:%d", &ma, &mi)) {
- fprintf(stderr, "Couldn't decode value\n");
+ pr2serr("Couldn't decode value\n");
return SG_LIB_FILE_ERROR;
}
tt = nt_typ_from_major(ma);
diff --git a/src/sg_modes.c b/src/sg_modes.c
index c9383956..01f2450a 100644
--- a/src/sg_modes.c
+++ b/src/sg_modes.c
@@ -25,8 +25,10 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.47 20151123";
+static const char * version_str = "1.48 20151219";
#define DEF_ALLOC_LEN (1024 * 4)
#define DEF_6_ALLOC_LEN 252
@@ -86,27 +88,6 @@ struct opts_t {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
-
static void
usage()
{
@@ -912,7 +893,7 @@ examine_pages(int sg_fd, int inq_pdt, int inq_byte6,
}
if (0 == res) {
len = op->do_six ? (rbuf[0] + 1) :
- ((rbuf[0] << 8) + rbuf[1] + 2);
+ (sg_get_unaligned_be16(rbuf + 0) + 2);
if (len > mresp_len)
len = mresp_len;
if (op->do_raw) {
@@ -1172,8 +1153,8 @@ main(int argc, char * argv[])
longlba = 0;
} else {
headerlen = 8;
- md_len = (rsp_buff[0] << 8) + rsp_buff[1] + 2;
- bd_len = (rsp_buff[6] << 8) + rsp_buff[7];
+ md_len = sg_get_unaligned_be16(rsp_buff + 0) + 2;
+ bd_len = sg_get_unaligned_be16(rsp_buff + 6);
medium_type = rsp_buff[2];
specific = rsp_buff[3];
longlba = rsp_buff[4] & 1;
@@ -1189,7 +1170,8 @@ main(int argc, char * argv[])
ucp = rsp_buff + bd_len + headerlen;
md_len -= bd_len + headerlen;
spf = ((ucp[0] & 0x40) ? 1 : 0);
- len = (spf ? ((ucp[2] << 8) + ucp[3] + 4) : (ucp[1] + 2));
+ len = (spf ? (sg_get_unaligned_be16(ucp + 2) + 4) :
+ (ucp[1] + 2));
len = (len < md_len) ? len : md_len;
for (k = 0; k < len; ++k)
printf("%02x\n", ucp[k]);
@@ -1259,7 +1241,7 @@ main(int argc, char * argv[])
}
uc = *ucp;
spf = ((uc & 0x40) ? 1 : 0);
- len = (spf ? ((ucp[2] << 8) + ucp[3] + 4) : (ucp[1] + 2));
+ len = (spf ? (sg_get_unaligned_be16(ucp + 2) + 4) : (ucp[1] + 2));
page_num = ucp[0] & PG_CODE_MASK;
if (0x0 == page_num) {
++num_ua_pages;
diff --git a/src/sg_opcodes.c b/src/sg_opcodes.c
index 64db6eb0..1b42f172 100644
--- a/src/sg_opcodes.c
+++ b/src/sg_opcodes.c
@@ -24,10 +24,11 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
#include "sg_pt.h"
-static const char * version_str = "0.44 20151127"; /* spc5r07 */
+static const char * version_str = "0.45 20151219"; /* spc5r07 */
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -97,8 +98,7 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr,
- "Usage: sg_opcodes [--alpha] [--compact] [--help] [--hex] "
+ pr2serr("Usage: sg_opcodes [--alpha] [--compact] [--help] [--hex] "
"[--mask]\n"
" [--no-inquiry] [--opcode=OP[,SA]] [--raw] "
"[--rctd]\n"
@@ -141,8 +141,7 @@ usage()
static void
usage_old()
{
- fprintf(stderr,
- "Usage: sg_opcodes [-a] [-c] [-H] [-m] [-n] [-o=OP] [-q] [-r] "
+ pr2serr("Usage: sg_opcodes [-a] [-c] [-H] [-m] [-n] [-o=OP] [-q] [-r] "
"[-R] [-s=SA]\n"
" [-t] [-u] [-v] [-V] DEVICE\n"
" where:\n"
@@ -206,7 +205,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
break; /* ignore */
case 'o':
if (strlen(optarg) >= (sizeof(b) - 1)) {
- fprintf(stderr, "argument to '--opcode' too long\n");
+ pr2serr("argument to '--opcode' too long\n");
return SG_LIB_SYNTAX_ERROR;
}
cp = strchr(optarg, ',');
@@ -215,13 +214,13 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
strncpy(b, optarg, cp - optarg);
n = sg_get_num(b);
if ((n < 0) || (n > 255)) {
- fprintf(stderr, "bad OP argument to '--opcode'\n");
+ pr2serr("bad OP argument to '--opcode'\n");
return SG_LIB_SYNTAX_ERROR;
}
optsp->do_opcode = n;
n = sg_get_num(cp + 1);
if ((n < 0) || (n > 0xffff)) {
- fprintf(stderr, "bad SA argument to '--opcode'\n");
+ pr2serr("bad SA argument to '--opcode'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -229,7 +228,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
} else {
n = sg_get_num(optarg);
if ((n < 0) || (n > 255)) {
- fprintf(stderr, "bad argument to '--opcode'\n");
+ pr2serr("bad argument to '--opcode'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -251,7 +250,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
case 's':
n = sg_get_num(optarg);
if ((n < 0) || (n > 0xffff)) {
- fprintf(stderr, "bad argument to '--sa'\n");
+ pr2serr("bad argument to '--sa'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -270,7 +269,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
++optsp->do_version;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (optsp->do_help)
break;
usage();
@@ -284,8 +283,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -361,7 +359,7 @@ process_cl_old(struct opts_t * optsp, int argc, char * argv[])
if (0 == strncmp("o=", cp, 2)) {
num = sscanf(cp + 2, "%x", (unsigned int *)&n);
if ((1 != num) || (n > 255)) {
- fprintf(stderr, "Bad number after 'o=' option\n");
+ pr2serr("Bad number after 'o=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -369,7 +367,7 @@ process_cl_old(struct opts_t * optsp, int argc, char * argv[])
} else if (0 == strncmp("s=", cp, 2)) {
num = sscanf(cp + 2, "%x", (unsigned int *)&n);
if (1 != num) {
- fprintf(stderr, "Bad number after 's=' option\n");
+ pr2serr("Bad number after 's=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -377,15 +375,15 @@ process_cl_old(struct opts_t * optsp, int argc, char * argv[])
} else if (0 == strncmp("-old", cp, 4))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
} else if (NULL == optsp->device_name)
optsp->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not expecting: "
- "%s\n", optsp->device_name, cp);
+ pr2serr("too many arguments, got: %s, not expecting: %s\n",
+ optsp->device_name, cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -740,12 +738,12 @@ main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
if (NULL == op->device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
if (op->opt_new)
usage();
else
@@ -753,7 +751,7 @@ main(int argc, char * argv[])
return SG_LIB_SYNTAX_ERROR;
}
if ((-1 != op->do_servact) && (-1 == op->do_opcode)) {
- fprintf(stderr, "When '-s' is chosen, so must '-o' be chosen\n");
+ pr2serr("When '-s' is chosen, so must '-o' be chosen\n");
if (op->opt_new)
usage();
else
@@ -761,13 +759,13 @@ main(int argc, char * argv[])
return SG_LIB_SYNTAX_ERROR;
}
if (op->do_unsorted && op->do_alpha)
- fprintf(stderr, "warning: unsorted ('-u') and alpha ('-a') options "
- "chosen, ignoring alpha\n");
+ pr2serr("warning: unsorted ('-u') and alpha ('-a') options chosen, "
+ "ignoring alpha\n");
if (op->do_taskman && ((-1 != op->do_opcode) || op->do_alpha ||
op->do_unsorted)) {
- fprintf(stderr, "warning: task management functions ('-t') chosen "
- "so alpha ('-a'),\n unsorted ('-u') and opcode "
- "('-o') options ignored\n");
+ pr2serr("warning: task management functions ('-t') chosen so alpha "
+ "('-a'),\n unsorted ('-u') and opcode ('-o') "
+ "options ignored\n");
}
op_name = op->do_taskman ? "Report supported task management functions" :
"Report supported operation codes";
@@ -775,7 +773,7 @@ main(int argc, char * argv[])
if (op->do_opcode < 0) {
if ((sg_fd = scsi_pt_open_device(op->device_name, 1 /* RO */,
op->do_verbose)) < 0) {
- fprintf(stderr, "sg_opcodes: error opening file (ro): %s: %s\n",
+ pr2serr("sg_opcodes: error opening file (ro): %s: %s\n",
op->device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -791,20 +789,20 @@ main(int argc, char * argv[])
printf(" Peripheral device type: 0x%x\n", peri_type);
}
} else {
- fprintf(stderr, "sg_opcodes: %s doesn't respond to a SCSI "
- "INQUIRY\n", op->device_name);
+ pr2serr("sg_opcodes: %s doesn't respond to a SCSI INQUIRY\n",
+ op->device_name);
return SG_LIB_CAT_OTHER;
}
res = scsi_pt_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
return SG_LIB_FILE_ERROR;
}
}
if ((sg_fd = scsi_pt_open_device(op->device_name, 0 /* RW */,
op->do_verbose)) < 0) {
- fprintf(stderr, "sg_opcodes: error opening file (rw): %s: %s\n",
+ pr2serr("sg_opcodes: error opening file (rw): %s: %s\n",
op->device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -820,7 +818,7 @@ main(int argc, char * argv[])
op->do_verbose);
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
- fprintf(stderr, "%s: %s\n", op_name, b);
+ pr2serr("%s: %s\n", op_name, b);
goto err_out;
}
if (op->do_taskman) {
@@ -857,8 +855,8 @@ main(int argc, char * argv[])
printf(" I_T nexus reset\n");
if (op->do_repd) {
if (rsoc_buff[3] < 0xc) {
- fprintf(stderr, "when REPD given, byte 3 of response "
- "should be >= 12\n");
+ pr2serr("when REPD given, byte 3 of response should be >= "
+ "12\n");
res = SG_LIB_CAT_OTHER;
goto err_out;
} else
@@ -934,14 +932,14 @@ do_rsoc(int sg_fd, int rctd, int rep_opts, int rq_opcode, int rq_servact,
sg_put_unaligned_be32((uint32_t)mx_resp_len, rsocCmdBlk + 6);
if (verbose) {
- fprintf(stderr, " Report Supported Operation Codes cmd: ");
+ pr2serr(" Report Supported Operation Codes cmd: ");
for (k = 0; k < RSOC_CMD_LEN; ++k)
- fprintf(stderr, "%02x ", rsocCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rsocCmdBlk[k]);
+ pr2serr("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Report Supported Operation Codes: out of memory\n");
+ pr2serr("Report Supported Operation Codes: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rsocCmdBlk, sizeof(rsocCmdBlk));
@@ -985,16 +983,14 @@ do_rstmf(int sg_fd, int repd, void * resp, int mx_resp_len, int noisy,
sg_put_unaligned_be32((uint32_t)mx_resp_len, rstmfCmdBlk + 6);
if (verbose) {
- fprintf(stderr, " Report Supported Task Management Functions "
- "cmd: ");
+ pr2serr(" Report Supported Task Management Functions cmd: ");
for (k = 0; k < RSTMF_CMD_LEN; ++k)
- fprintf(stderr, "%02x ", rstmfCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rstmfCmdBlk[k]);
+ pr2serr("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Report Supported Task Management Functions: out of "
- "memory\n");
+ pr2serr("Report Supported Task Management Functions: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rstmfCmdBlk, sizeof(rstmfCmdBlk));
diff --git a/src/sg_persist.c b/src/sg_persist.c
index 6d4906b7..957525d4 100644
--- a/src/sg_persist.c
+++ b/src/sg_persist.c
@@ -12,7 +12,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -27,8 +26,9 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.50 20151205";
+static const char * version_str = "0.51 20151219";
#define PRIN_RKEY_SA 0x0
@@ -151,25 +151,6 @@ static const char * pr_type_strs[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage(int help)
{
diff --git a/src/sg_prevent.c b/src/sg_prevent.c
index 955a6745..1771cad2 100644
--- a/src/sg_prevent.c
+++ b/src/sg_prevent.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Douglas Gilbert.
+ * Copyright (c) 2004-2015 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.
@@ -17,6 +17,7 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -24,7 +25,7 @@
* given SCSI device.
*/
-static const char * version_str = "1.07 20140516";
+static const char * version_str = "1.08 20151219";
#define ME "sg_prevent: "
@@ -40,22 +41,21 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_prevent [--allow] [--help] [--prevent=PC] [--verbose] "
- "[--version]\n"
- " DEVICE\n"
- " where:\n"
- " --allow|-a allow media removal\n"
- " --help|-h print usage message then exit\n"
- " --prevent=PC|-p PC prevent code value (def: 1 -> "
- "prevent)\n"
- " 0 -> allow, 1 -> prevent\n"
- " 2 -> persistent allow, 3 -> "
- "persistent prevent\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI PREVENT ALLOW MEDIUM REMOVAL command\n"
- );
+ pr2serr("Usage: "
+ "sg_prevent [--allow] [--help] [--prevent=PC] [--verbose] "
+ "[--version]\n"
+ " DEVICE\n"
+ " where:\n"
+ " --allow|-a allow media removal\n"
+ " --help|-h print usage message then exit\n"
+ " --prevent=PC|-p PC prevent code value (def: 1 -> "
+ "prevent)\n"
+ " 0 -> allow, 1 -> prevent\n"
+ " 2 -> persistent allow, 3 -> "
+ "persistent prevent\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI PREVENT ALLOW MEDIUM REMOVAL command\n");
}
@@ -87,7 +87,7 @@ int main(int argc, char * argv[])
case 'p':
prevent = sg_get_num(optarg);
if ((prevent < 0) || (prevent > 3)) {
- fprintf(stderr, "bad argument to '--prevent'\n");
+ pr2serr("bad argument to '--prevent'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -95,10 +95,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -110,19 +110,18 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (allow && (prevent >= 0)) {
- fprintf(stderr, "can't give both '--allow' and '--prevent='\n");
+ pr2serr("can't give both '--allow' and '--prevent='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -133,7 +132,7 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
+ pr2serr(ME "open error: %s: %s\n", device_name,
safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -143,11 +142,11 @@ int main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Prevent allow medium removal: %s\n", b);
+ pr2serr("Prevent allow medium removal: %s\n", b);
}
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_raw.c b/src/sg_raw.c
index 3b950d57..8fd6dd7b 100644
--- a/src/sg_raw.c
+++ b/src/sg_raw.c
@@ -15,7 +15,6 @@
#define _XOPEN_SOURCE 600 /* clear up posix_memalign() warning */
#include <stdlib.h>
-#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
@@ -28,8 +27,9 @@
#endif
#include "sg_lib.h"
#include "sg_pt.h"
+#include "sg_pr2serr.h"
-#define SG_RAW_VERSION "0.4.13 (2015-11-27)"
+#define SG_RAW_VERSION "0.4.14 (2015-12-19)"
#ifdef SG_LIB_WIN32
#ifndef HAVE_SYSCONF
@@ -88,26 +88,6 @@ struct opts_t {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
version()
{
diff --git a/src/sg_rbuf.c b/src/sg_rbuf.c
index 3a7d3203..41090bdc 100644
--- a/src/sg_rbuf.c
+++ b/src/sg_rbuf.c
@@ -37,6 +37,7 @@
#include "sg_lib.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
#define RB_MODE_DESC 3
#define RB_MODE_DATA 2
@@ -54,7 +55,7 @@
#endif
-static const char * version_str = "4.93 20151207";
+static const char * version_str = "4.94 20151219";
static struct option long_options[] = {
{"buffer", required_argument, 0, 'b'},
@@ -91,20 +92,19 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr, "Usage: sg_rbuf [--buffer=EACH] [--dio] [--echo] "
+ pr2serr("Usage: sg_rbuf [--buffer=EACH] [--dio] [--echo] "
"[--help] [--mmap]\n"
" [--quick] [--size=OVERALL] [--time] [--verbose] "
"[--version]\n"
" DEVICE\n");
- fprintf(stderr, " where:\n"
+ pr2serr(" where:\n"
" --buffer=EACH|-b EACH buffer size to use (in bytes)\n"
" --dio|-d requests dio ('-q' overrides it)\n"
" --echo|-e use echo buffer (def: use data mode)\n"
" --help|-h print usage message then exit\n"
" --mmap|-m requests mmap-ed IO (overrides -q, -d)\n"
" --quick|-q quick, don't xfer to user space\n");
- fprintf(stderr,
- " --size=OVERALL|-s OVERALL total size to read (in bytes)\n"
+ pr2serr(" --size=OVERALL|-s OVERALL total size to read (in bytes)\n"
" default: 200 MiB\n"
" --time|-t time the data transfer\n"
" --verbose|-v increase verbosity (more debug)\n"
@@ -161,7 +161,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
case 'b':
n = sg_get_num(optarg);
if (n < 0) {
- fprintf(stderr, "bad argument to '--buffer'\n");
+ pr2serr("bad argument to '--buffer'\n");
usage_for(optsp);
return SG_LIB_SYNTAX_ERROR;
}
@@ -191,7 +191,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
case 's':
nn = sg_get_llnum(optarg);
if (nn < 0) {
- fprintf(stderr, "bad argument to '--size'\n");
+ pr2serr("bad argument to '--size'\n");
usage_for(optsp);
return SG_LIB_SYNTAX_ERROR;
}
@@ -207,7 +207,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
++optsp->do_version;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (optsp->do_help)
break;
usage_for(optsp);
@@ -221,8 +221,7 @@ process_cl_new(struct opts_t * optsp, int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage_for(optsp);
return SG_LIB_SYNTAX_ERROR;
}
@@ -305,15 +304,15 @@ process_cl_old(struct opts_t * optsp, int argc, char * argv[])
} else if (0 == strncmp("-old", cp, 4))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage_for(optsp);
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == optsp->device_name)
optsp->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not expecting: "
- "%s\n", optsp->device_name, cp);
+ pr2serr("too many arguments, got: %s, not expecting: %s\n",
+ optsp->device_name, cp);
usage_for(optsp);
return SG_LIB_SYNTAX_ERROR;
}
@@ -380,12 +379,12 @@ main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
if (NULL == op->device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
usage_for(op);
return SG_LIB_SYNTAX_ERROR;
}
@@ -425,11 +424,11 @@ main(int argc, char * argv[])
io_hdr.sbp = sense_buffer;
io_hdr.timeout = 60000; /* 60000 millisecs == 60 seconds */
if (op->do_verbose) {
- fprintf(stderr, " Read buffer (%sdescriptor) cdb: ",
+ pr2serr(" Read buffer (%sdescriptor) cdb: ",
(op->do_echo ? "echo " : ""));
for (k = 0; k < RB_CMD_LEN; ++k)
- fprintf(stderr, "%02x ", rbCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rbCmdBlk[k]);
+ pr2serr("\n");
}
/* do normal IO to find RB size (not dio or mmap-ed at this stage) */
@@ -440,7 +439,7 @@ main(int argc, char * argv[])
}
if (op->do_verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
/* now for the error processing */
res = sg_err_category3(&io_hdr);
switch (res) {
@@ -494,14 +493,13 @@ main(int argc, char * argv[])
sg_fd, 0);
if (MAP_FAILED == rbBuff) {
if (ENOMEM == errno) {
- fprintf(stderr, "mmap() out of memory, try a smaller "
- "buffer size than %d bytes\n", buf_size);
+ pr2serr("mmap() out of memory, try a smaller buffer size "
+ "than %d bytes\n", buf_size);
if (op->opt_new)
- fprintf(stderr, " [with '--buffer=EACH' where EACH "
- "is in bytes]\n");
+ pr2serr(" [with '--buffer=EACH' where EACH is in "
+ "bytes]\n");
else
- fprintf(stderr, " [with '-b=EACH' where EACH is in "
- "KiB]\n");
+ pr2serr(" [with '-b=EACH' where EACH is in KiB]\n");
} else
perror("error using mmap()");
return SG_LIB_CAT_OTHER;
@@ -556,23 +554,22 @@ main(int argc, char * argv[])
else if (op->do_quick)
io_hdr.flags |= SG_FLAG_NO_DXFER;
if (op->do_verbose > 1) {
- fprintf(stderr, " Read buffer (%sdata) cdb: ",
+ pr2serr(" Read buffer (%sdata) cdb: ",
(op->do_echo ? "echo " : ""));
for (j = 0; j < RB_CMD_LEN; ++j)
- fprintf(stderr, "%02x ", rbCmdBlk[j]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rbCmdBlk[j]);
+ pr2serr("\n");
}
if (ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
if (ENOMEM == errno) {
- fprintf(stderr, "SG_IO data: out of memory, try a smaller "
- "buffer size than %d bytes\n", buf_size);
+ pr2serr("SG_IO data: out of memory, try a smaller buffer "
+ "size than %d bytes\n", buf_size);
if (op->opt_new)
- fprintf(stderr, " [with '--buffer=EACH' where EACH "
- "is in bytes]\n");
+ pr2serr(" [with '--buffer=EACH' where EACH is in "
+ "bytes]\n");
else
- fprintf(stderr, " [with '-b=EACH' where EACH is in "
- "KiB]\n");
+ pr2serr(" [with '-b=EACH' where EACH is in KiB]\n");
} else
perror("SG_IO READ BUFFER data error");
if (rawp) free(rawp);
@@ -580,8 +577,7 @@ main(int argc, char * argv[])
}
if (op->do_verbose > 2)
- fprintf(stderr, " duration=%u ms\n",
- io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
/* now for the error processing */
res = sg_err_category3(&io_hdr);
switch (res) {
diff --git a/src/sg_rdac.c b/src/sg_rdac.c
index fce39b94..f53cc3d3 100644
--- a/src/sg_rdac.c
+++ b/src/sg_rdac.c
@@ -24,9 +24,10 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.09 20151207";
+static const char * version_str = "1.10 20151219";
unsigned char mode6_hdr[] = {
0x75, /* Length */
@@ -157,11 +158,11 @@ static int fail_all_paths(int fd, int use_6_byte)
switch (res) {
case 0:
if (do_verbose)
- fprintf(stderr, "fail paths successful\n");
+ pr2serr("fail paths successful\n");
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, do_verbose);
- fprintf(stderr, "fail paths failed: %s\n", b);
+ pr2serr("fail paths failed: %s\n", b);
break;
}
@@ -178,7 +179,7 @@ static int fail_this_path(int fd, int lun, int use_6_byte)
char b[80];
if (use_6_byte && lun > 32) {
- fprintf(stderr, "must use 10 byte cdb to fail luns over 32\n");
+ pr2serr("must use 10 byte cdb to fail luns over 32\n");
return -1;
}
@@ -222,12 +223,11 @@ static int fail_this_path(int fd, int lun, int use_6_byte)
switch (res) {
case 0:
if (do_verbose)
- fprintf(stderr, "fail paths successful\n");
+ pr2serr("fail paths successful\n");
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, do_verbose);
- fprintf(stderr, "fail paths page (lun=%d) failed: %s\n", lun,
- b);
+ pr2serr("fail paths page (lun=%d) failed: %s\n", lun, b);
break;
}
@@ -405,18 +405,18 @@ int main(int argc, char * argv[])
use_6_byte = 1;
}
else if (!strcmp(*argptr, "-V")) {
- fprintf(stderr, "sg_rdac version: %s\n", version_str);
+ pr2serr("sg_rdac version: %s\n", version_str);
return 0;
}
else if (*argv[k] == '-') {
- fprintf(stderr, "Unrecognized switch: %s\n", argv[k]);
+ pr2serr("Unrecognized switch: %s\n", argv[k]);
file_name = 0;
break;
}
else if (0 == file_name)
file_name = argv[k];
else {
- fprintf(stderr, "too many arguments\n");
+ pr2serr("too many arguments\n");
file_name = 0;
break;
}
@@ -428,8 +428,7 @@ int main(int argc, char * argv[])
fd = sg_cmds_open_device(file_name, 0 /* rw */, do_verbose);
if (fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", file_name,
- safe_strerror(-fd));
+ pr2serr("open error: %s: %s\n", file_name, safe_strerror(-fd));
usage();
return SG_LIB_FILE_ERROR;
}
@@ -456,19 +455,19 @@ int main(int argc, char * argv[])
print_rdac_mode(rsp_buff, !use_6_byte);
} else {
if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, ">>>>>> try again without "
- "the '-6' switch for a 10 byte MODE "
- "SENSE command\n");
+ pr2serr(">>>>>> try again without the '-6' "
+ "switch for a 10 byte MODE SENSE "
+ "command\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "mode sense: invalid field "
- "in cdb (perhaps subpages or page "
- "control (PC) not supported)\n");
+ pr2serr("mode sense: invalid field in cdb "
+ "(perhaps subpages or page control "
+ "(PC) not supported)\n");
else {
char b[80];
sg_get_category_sense_str(res, sizeof(b), b,
do_verbose);
- fprintf(stderr, "mode sense failed: %s\n", b);
+ pr2serr("mode sense failed: %s\n", b);
}
}
}
@@ -476,7 +475,7 @@ int main(int argc, char * argv[])
res = sg_cmds_close_device(fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_read.c b/src/sg_read.c
index e5987682..5b005e21 100644
--- a/src/sg_read.c
+++ b/src/sg_read.c
@@ -47,9 +47,10 @@
#include "sg_lib.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.23 20151207";
+static const char * version_str = "1.24 20151219";
#define DEF_BLOCK_SIZE 512
#define DEF_BLOCKS_PER_TRANSFER 128
@@ -106,17 +107,15 @@ static void print_stats(int iters, const char * str)
{
if (orig_count > 0) {
if (0 != dd_count)
- fprintf(stderr, " remaining block count=%" PRId64 "\n",
- dd_count);
- fprintf(stderr, "%" PRId64 "+%d records in", in_full - in_partial,
+ pr2serr(" remaining block count=%" PRId64 "\n", dd_count);
+ pr2serr("%" PRId64 "+%d records in", in_full - in_partial,
in_partial);
if (iters > 0)
- fprintf(stderr, ", %s commands issued: %d\n", (str ? str : ""),
- iters);
+ pr2serr(", %s commands issued: %d\n", (str ? str : ""), iters);
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
} else if (iters > 0)
- fprintf(stderr, "%s commands issued: %d\n", (str ? str : ""), iters);
+ pr2serr("%s commands issued: %d\n", (str ? str : ""), iters);
}
static void interrupt_handler(int sig)
@@ -127,7 +126,7 @@ static void interrupt_handler(int sig)
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (sig, &sigact, NULL);
- fprintf(stderr, "Interrupted by signal,");
+ pr2serr("Interrupted by signal,");
print_stats(0, NULL);
kill (getpid (), sig);
}
@@ -135,7 +134,7 @@ static void interrupt_handler(int sig)
static void siginfo_handler(int sig)
{
if (sig) { ; } /* unused, dummy to suppress warning */
- fprintf(stderr, "Progress report, continuing ...\n");
+ pr2serr("Progress report, continuing ...\n");
print_stats(0, NULL);
}
@@ -157,50 +156,48 @@ static int dd_filetype(const char * filename)
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_read [blk_sgio=0|1] [bpt=BPT] [bs=BS] "
- "[cdbsz=6|10|12|16]\n"
- " count=COUNT [dio=0|1] [dpo=0|1] [fua=0|1] "
- "if=IFILE\n"
- " [mmap=0|1] [no_dfxer=0|1] [odir=0|1] "
- "[skip=SKIP]\n"
- " [time=TI] [verbose=VERB] [--help] "
- "[--version]\n"
- " where:\n"
- " blk_sgio 0->normal IO for block devices, 1->SCSI commands "
- "via SG_IO\n"
- " bpt is blocks_per_transfer (default is 128, or 64 KiB "
- "for default BS)\n"
- " setting 'bpt=0' will do COUNT zero block SCSI "
- "READs\n"
- " bs must match sector size if IFILE accessed via SCSI "
- "commands\n"
- " (def=512)\n"
- " cdbsz size of SCSI READ command (default is 10)\n"
- " count total bytes read will be BS*COUNT (if no "
- "error)\n"
- " (if negative, do |COUNT| zero block SCSI READs)\n"
- " dio 1-> attempt direct IO on sg device, 0->indirect IO "
- "(def)\n");
- fprintf(stderr,
- " dpo 1-> set disable page out (DPO) in SCSI READs\n"
- " fua 1-> set force unit access (FUA) in SCSI READs\n"
- " if an sg, block or raw device, or a seekable file (not "
- "stdin)\n"
- " mmap 1->perform mmaped IO on sg device, 0->indirect IO "
- "(def)\n"
- " no_dxfer 1->DMA to kernel buffers only, not user space, "
- "0->normal(def)\n"
- " odir 1->open block device O_DIRECT, 0->don't (def)\n"
- " skip each transfer starts at this logical address "
- "(def=0)\n"
- " time 0->do nothing(def), 1->time from 1st cmd, 2->time "
- "from 2nd, ...\n"
- " verbose increase level of verbosity (def: 0)\n"
- " --help print this usage message then exit\n"
- " --version print version number then exit\n\n"
- "Issue SCSI READ commands, each starting from the same logical "
- "block address\n");
+ pr2serr("Usage: sg_read [blk_sgio=0|1] [bpt=BPT] [bs=BS] "
+ "[cdbsz=6|10|12|16]\n"
+ " count=COUNT [dio=0|1] [dpo=0|1] [fua=0|1] "
+ "if=IFILE\n"
+ " [mmap=0|1] [no_dfxer=0|1] [odir=0|1] "
+ "[skip=SKIP]\n"
+ " [time=TI] [verbose=VERB] [--help] "
+ "[--version]\n"
+ " where:\n"
+ " blk_sgio 0->normal IO for block devices, 1->SCSI commands "
+ "via SG_IO\n"
+ " bpt is blocks_per_transfer (default is 128, or 64 KiB "
+ "for default BS)\n"
+ " setting 'bpt=0' will do COUNT zero block SCSI "
+ "READs\n"
+ " bs must match sector size if IFILE accessed via SCSI "
+ "commands\n"
+ " (def=512)\n"
+ " cdbsz size of SCSI READ command (default is 10)\n"
+ " count total bytes read will be BS*COUNT (if no "
+ "error)\n"
+ " (if negative, do |COUNT| zero block SCSI READs)\n"
+ " dio 1-> attempt direct IO on sg device, 0->indirect IO "
+ "(def)\n");
+ pr2serr(" dpo 1-> set disable page out (DPO) in SCSI READs\n"
+ " fua 1-> set force unit access (FUA) in SCSI READs\n"
+ " if an sg, block or raw device, or a seekable file (not "
+ "stdin)\n"
+ " mmap 1->perform mmaped IO on sg device, 0->indirect IO "
+ "(def)\n"
+ " no_dxfer 1->DMA to kernel buffers only, not user space, "
+ "0->normal(def)\n"
+ " odir 1->open block device O_DIRECT, 0->don't (def)\n"
+ " skip each transfer starts at this logical address "
+ "(def=0)\n"
+ " time 0->do nothing(def), 1->time from 1st cmd, 2->time "
+ "from 2nd, ...\n"
+ " verbose increase level of verbosity (def: 0)\n"
+ " --help print this usage message then exit\n"
+ " --version print version number then exit\n\n"
+ "Issue SCSI READ commands, each starting from the same logical "
+ "block address\n");
}
static int sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz,
@@ -224,18 +221,18 @@ static int sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz,
sg_put_unaligned_be24(0x1fffff & start_block, cdbp + 1);
cdbp[4] = (256 == blocks) ? 0 : (unsigned char)blocks;
if (blocks > 256) {
- fprintf(stderr, ME "for 6 byte commands, maximum number of "
- "blocks is 256\n");
+ pr2serr(ME "for 6 byte commands, maximum number of blocks is "
+ "256\n");
return 1;
}
if ((start_block + blocks - 1) & (~0x1fffff)) {
- fprintf(stderr, ME "for 6 byte commands, can't address blocks"
- " beyond %d\n", 0x1fffff);
+ pr2serr(ME "for 6 byte commands, can't address blocks beyond "
+ "%d\n", 0x1fffff);
return 1;
}
if (dpo || fua) {
- fprintf(stderr, ME "for 6 byte commands, neither dpo nor fua"
- " bits supported\n");
+ pr2serr(ME "for 6 byte commands, neither dpo nor fua bits "
+ "supported\n");
return 1;
}
break;
@@ -246,8 +243,8 @@ static int sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz,
sg_put_unaligned_be32((uint32_t)start_block, cdbp + 2);
sg_put_unaligned_be16((uint16_t)blocks, cdbp + 7);
if (blocks & (~0xffff)) {
- fprintf(stderr, ME "for 10 byte commands, maximum number of "
- "blocks is %d\n", 0xffff);
+ pr2serr(ME "for 10 byte commands, maximum number of blocks is "
+ "%d\n", 0xffff);
return 1;
}
break;
@@ -266,8 +263,8 @@ static int sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz,
sg_put_unaligned_be32((uint32_t)blocks, cdbp + 10);
break;
default:
- fprintf(stderr, ME "expected cdb size of 6, 10, 12, or 16 but got"
- " %d\n", cdb_sz);
+ pr2serr(ME "expected cdb size of 6, 10, 12, or 16 but got %d\n",
+ cdb_sz);
return 1;
}
return 0;
@@ -287,8 +284,8 @@ static int sg_bread(int sg_fd, unsigned char * buff, int blocks,
struct sg_io_hdr io_hdr;
if (sg_build_scsi_cdb(rdCmd, cdbsz, blocks, from_block, 0, fua, dpo)) {
- fprintf(stderr, ME "bad cdb build, from_block=%" PRId64
- ", blocks=%d\n", from_block, blocks);
+ pr2serr(ME "bad cdb build, from_block=%" PRId64 ", blocks=%d\n",
+ from_block, blocks);
return -1;
}
memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
@@ -314,10 +311,10 @@ static int sg_bread(int sg_fd, unsigned char * buff, int blocks,
io_hdr.timeout = DEF_TIMEOUT;
io_hdr.pack_id = pack_id_count++;
if (verbose > 1) {
- fprintf(stderr, " read cdb: ");
+ pr2serr( " read cdb: ");
for (k = 0; k < cdbsz; ++k)
- fprintf(stderr, "%02x ", rdCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr( "%02x ", rdCmd[k]);
+ pr2serr( "\n");
}
if (ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
@@ -328,7 +325,7 @@ static int sg_bread(int sg_fd, unsigned char * buff, int blocks,
}
if (verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr( " duration=%u ms\n", io_hdr.duration);
switch (sg_err_category3(&io_hdr)) {
case SG_LIB_CAT_CLEAN:
break;
@@ -424,13 +421,13 @@ int main(int argc, char * argv[])
else if (0 == strcmp(key,"bpt")) {
bpt = sg_get_num(buf);
if (-1 == bpt) {
- fprintf(stderr, ME "bad argument to 'bpt'\n");
+ pr2serr( ME "bad argument to 'bpt'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"bs")) {
bs = sg_get_num(buf);
if (-1 == bs) {
- fprintf(stderr, ME "bad argument to 'bs'\n");
+ pr2serr( ME "bad argument to 'bs'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"cdbsz"))
@@ -440,14 +437,14 @@ int main(int argc, char * argv[])
if ('-' == *buf) {
dd_count = sg_get_llnum(buf + 1);
if (-1 == dd_count) {
- fprintf(stderr, ME "bad argument to 'count'\n");
+ pr2serr( ME "bad argument to 'count'\n");
return SG_LIB_SYNTAX_ERROR;
}
dd_count = - dd_count;
} else {
dd_count = sg_get_llnum(buf);
if (-1 == dd_count) {
- fprintf(stderr, ME "bad argument to 'count'\n");
+ pr2serr( ME "bad argument to 'count'\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -470,7 +467,7 @@ int main(int argc, char * argv[])
else if (0 == strcmp(key,"skip")) {
skip = sg_get_llnum(buf);
if (-1 == skip) {
- fprintf(stderr, ME "bad argument to 'skip'\n");
+ pr2serr( ME "bad argument to 'skip'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"time"))
@@ -481,10 +478,10 @@ int main(int argc, char * argv[])
usage();
return 0;
} else if (0 == strncmp(key, "--vers", 6)) {
- fprintf(stderr, ME ": %s\n", version_str);
+ pr2serr( ME ": %s\n", version_str);
return 0;
} else {
- fprintf(stderr, "Unrecognized argument '%s'\n", key);
+ pr2serr( "Unrecognized argument '%s'\n", key);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -492,16 +489,15 @@ int main(int argc, char * argv[])
if (bs <= 0) {
bs = DEF_BLOCK_SIZE;
if ((dd_count > 0) && (bpt > 0))
- fprintf(stderr, "Assume default 'bs' (block size) of %d bytes\n",
- bs);
+ pr2serr( "Assume default 'bs' (block size) of %d bytes\n", bs);
}
if (! count_given) {
- fprintf(stderr, "'count' must be given\n");
+ pr2serr("'count' must be given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (skip < 0) {
- fprintf(stderr, "skip cannot be negative\n");
+ pr2serr("skip cannot be negative\n");
return SG_LIB_SYNTAX_ERROR;
}
if (bpt < 1) {
@@ -509,16 +505,16 @@ int main(int argc, char * argv[])
if (dd_count > 0)
dd_count = - dd_count;
} else {
- fprintf(stderr, "bpt must be greater than 0\n");
+ pr2serr("bpt must be greater than 0\n");
return SG_LIB_SYNTAX_ERROR;
}
}
if (do_dio && do_mmap) {
- fprintf(stderr, "cannot select both dio and mmap\n");
+ pr2serr("cannot select both dio and mmap\n");
return SG_LIB_SYNTAX_ERROR;
}
if (no_dxfer && (do_dio || do_mmap)) {
- fprintf(stderr, "cannot select no_dxfer with dio or mmap\n");
+ pr2serr("cannot select no_dxfer with dio or mmap\n");
return SG_LIB_SYNTAX_ERROR;
}
@@ -528,26 +524,25 @@ int main(int argc, char * argv[])
install_handler (SIGUSR1, siginfo_handler);
if (! inf[0]) {
- fprintf(stderr, "must provide 'if=<filename>'\n");
+ pr2serr("must provide 'if=<filename>'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (0 == strcmp("-", inf)) {
- fprintf(stderr, "'-' (stdin) invalid as <filename>\n");
+ pr2serr("'-' (stdin) invalid as <filename>\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
in_type = dd_filetype(inf);
if (FT_ERROR == in_type) {
- fprintf(stderr, "Unable to access: %s\n", inf);
+ pr2serr("Unable to access: %s\n", inf);
return SG_LIB_FILE_ERROR;
} else if ((FT_BLOCK & in_type) && do_blk_sgio)
in_type |= FT_SG;
if (FT_SG & in_type) {
if ((dd_count < 0) && (6 == scsi_cdbsz)) {
- fprintf(stderr, ME "SCSI READ (6) can't do zero block "
- "reads\n");
+ pr2serr(ME "SCSI READ (6) can't do zero block reads\n");
return SG_LIB_SYNTAX_ERROR;
}
flags = O_RDWR;
@@ -565,12 +560,11 @@ int main(int argc, char * argv[])
}
}
if (verbose)
- fprintf(stderr, "Opened %s for SG_IO with flags=0x%x\n", inf,
- flags);
+ pr2serr("Opened %s for SG_IO with flags=0x%x\n", inf, flags);
if ((dd_count > 0) && (! (FT_BLOCK & in_type))) {
if (verbose > 2) {
if (ioctl(infd, SG_GET_RESERVED_SIZE, &t) >= 0)
- fprintf(stderr, " SG_GET_RESERVED_SIZE yields: %d\n", t);
+ pr2serr(" SG_GET_RESERVED_SIZE yields: %d\n", t);
}
t = bs * bpt;
if ((do_mmap) && (0 != (t % psz)))
@@ -580,24 +574,21 @@ int main(int argc, char * argv[])
perror(ME "SG_SET_RESERVED_SIZE error");
res = ioctl(infd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30000)) {
- fprintf(stderr, ME "sg driver prior to 3.x.y\n");
+ pr2serr(ME "sg driver prior to 3.x.y\n");
return SG_LIB_CAT_OTHER;
}
if (do_mmap && (t < 30122)) {
- fprintf(stderr, ME "mmap-ed IO needs a sg driver version "
- ">= 3.1.22\n");
+ pr2serr(ME "mmap-ed IO needs a sg driver version >= 3.1.22\n");
return SG_LIB_CAT_OTHER;
}
}
} else {
if (do_mmap) {
- fprintf(stderr, ME "mmap-ed IO only support on sg "
- "devices\n");
+ pr2serr(ME "mmap-ed IO only support on sg devices\n");
return SG_LIB_CAT_OTHER;
}
if (dd_count < 0) {
- fprintf(stderr, ME "negative 'count' only supported with "
- "SCSI READs\n");
+ pr2serr(ME "negative 'count' only supported with SCSI READs\n");
return SG_LIB_CAT_OTHER;
}
flags = O_RDONLY;
@@ -610,8 +601,7 @@ int main(int argc, char * argv[])
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, "Opened %s for Unix reads with flags=0x%x\n",
- inf, flags);
+ pr2serr("Opened %s for Unix reads with flags=0x%x\n", inf, flags);
if (skip > 0) {
off64_t offset = skip;
@@ -633,8 +623,7 @@ int main(int argc, char * argv[])
if (do_dio || do_odir || (FT_RAW & in_type)) {
wrkBuff = (unsigned char *)malloc(bs * bpt + psz);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory for aligned "
- "storage\n");
+ pr2serr("Not enough user memory for aligned storage\n");
return SG_LIB_CAT_OTHER;
}
/* perhaps use posix_memalign() instead */
@@ -650,7 +639,7 @@ int main(int argc, char * argv[])
} else {
wrkBuff = (unsigned char *)malloc(bs * bpt);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory\n");
+ pr2serr("Not enough user memory\n");
return SG_LIB_CAT_OTHER;
}
wrkPos = wrkBuff;
@@ -662,7 +651,7 @@ int main(int argc, char * argv[])
start_tm.tv_usec = 0;
if (verbose && (dd_count < 0))
- fprintf(stderr, "About to issue %" PRId64 " zero block SCSI READs\n",
+ pr2serr("About to issue %" PRId64 " zero block SCSI READs\n",
0 - dd_count);
/* main loop */
@@ -686,13 +675,11 @@ int main(int argc, char * argv[])
buf_sz = MIN_RESERVED_SIZE;
blocks_per = (buf_sz + bs - 1) / bs;
blocks = blocks_per;
- fprintf(stderr,
- "Reducing read to %d blocks per loop\n", blocks_per);
+ pr2serr("Reducing read to %d blocks per loop\n", blocks_per);
res = sg_bread(infd, wrkPos, blocks, skip, bs, scsi_cdbsz,
fua, dpo, &dio_tmp, do_mmap, no_dxfer);
} else if (2 == res) {
- fprintf(stderr,
- "Unit attention, try again (r)\n");
+ pr2serr("Unit attention, try again (r)\n");
res = sg_bread(infd, wrkPos, blocks, skip, bs, scsi_cdbsz,
fua, dpo, &dio_tmp, do_mmap, no_dxfer);
}
@@ -700,23 +687,23 @@ int main(int argc, char * argv[])
switch (res) {
case -3:
ret = SG_LIB_CAT_MEDIUM_HARD;
- fprintf(stderr, ME "SCSI READ medium/hardware error\n");
+ pr2serr(ME "SCSI READ medium/hardware error\n");
break;
case -2:
ret = SG_LIB_CAT_NOT_READY;
- fprintf(stderr, ME "device not ready\n");
+ pr2serr(ME "device not ready\n");
break;
case 2:
ret = SG_LIB_CAT_UNIT_ATTENTION;
- fprintf(stderr, ME "SCSI READ unit attention\n");
+ pr2serr(ME "SCSI READ unit attention\n");
break;
case 3:
ret = SG_LIB_CAT_ABORTED_COMMAND;
- fprintf(stderr, ME "SCSI READ aborted command\n");
+ pr2serr(ME "SCSI READ aborted command\n");
break;
default:
ret = SG_LIB_CAT_OTHER;
- fprintf(stderr, ME "SCSI READ failed\n");
+ pr2serr(ME "SCSI READ failed\n");
break;
}
break;
@@ -744,8 +731,8 @@ int main(int argc, char * argv[])
perror(ebuff);
break;
} else if (res < blocks * bs) {
- fprintf(stderr, ME "short read: wanted/got=%d/%d bytes"
- ", stop\n", blocks * bs, res);
+ pr2serr(ME "short read: wanted/got=%d/%d bytes, stop\n",
+ blocks * bs, res);
blocks = res / bs;
if ((res % bs) > 0) {
blocks++;
@@ -789,33 +776,32 @@ int main(int argc, char * argv[])
}
if (1 == do_time) {
- fprintf(stderr, "Time for all %s commands was "
- "%d.%06d secs", read_str, (int)res_tm.tv_sec,
- (int)res_tm.tv_usec);
+ pr2serr("Time for all %s commands was %d.%06d secs", read_str,
+ (int)res_tm.tv_sec, (int)res_tm.tv_usec);
if ((orig_count > 0) && (a > 0.00001) && (b > 511))
- fprintf(stderr, ", %.2f MB/sec\n", b / (a * 1000000.0));
+ pr2serr(", %.2f MB/sec\n", b / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
} else if (2 == do_time) {
- fprintf(stderr, "Time from second %s command to end "
- "was %d.%06d secs", read_str, (int)res_tm.tv_sec,
+ pr2serr("Time from second %s command to end was %d.%06d secs",
+ read_str, (int)res_tm.tv_sec,
(int)res_tm.tv_usec);
if ((orig_count > 0) && (a > 0.00001) && (c > 511))
- fprintf(stderr, ", %.2f MB/sec\n", c / (a * 1000000.0));
+ pr2serr(", %.2f MB/sec\n", c / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
} else {
- fprintf(stderr, "Time from start of %s command "
+ pr2serr("Time from start of %s command "
"#%d to end was %d.%06d secs", read_str, do_time,
(int)res_tm.tv_sec, (int)res_tm.tv_usec);
if ((orig_count > 0) && (a > 0.00001) && (c > 511))
- fprintf(stderr, ", %.2f MB/sec\n", c / (a * 1000000.0));
+ pr2serr(", %.2f MB/sec\n", c / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
}
if ((iters > 0) && (a > 0.00001))
- fprintf(stderr, "Average number of %s commands per "
- "second was %.2f\n", read_str, (double)iters / a);
+ pr2serr("Average number of %s commands per second was %.2f\n",
+ read_str, (double)iters / a);
}
}
@@ -825,7 +811,7 @@ int main(int argc, char * argv[])
close(infd);
res = 0;
if (0 != dd_count) {
- fprintf(stderr, "Some error occurred,");
+ pr2serr("Some error occurred,");
if (0 == ret)
ret = SG_LIB_CAT_OTHER;
}
@@ -835,19 +821,18 @@ int main(int argc, char * argv[])
int fd;
char c;
- fprintf(stderr, ">> Direct IO requested but incomplete %d times\n",
+ pr2serr(">> Direct IO requested but incomplete %d times\n",
dio_incomplete);
if ((fd = open(proc_allow_dio, O_RDONLY)) >= 0) {
if (1 == read(fd, &c, 1)) {
if ('0' == c)
- fprintf(stderr, ">>> %s set to '0' but should be set "
- "to '1' for direct IO\n", proc_allow_dio);
+ pr2serr(">>> %s set to '0' but should be set to '1' for "
+ "direct IO\n", proc_allow_dio);
}
close(fd);
}
}
if (sum_of_resids)
- fprintf(stderr, ">> Non-zero sum of residual counts=%d\n",
- sum_of_resids);
+ pr2serr(">> Non-zero sum of residual counts=%d\n", sum_of_resids);
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_read_block_limits.c b/src/sg_read_block_limits.c
index a061bd70..320dc5e4 100644
--- a/src/sg_read_block_limits.c
+++ b/src/sg_read_block_limits.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2014 Douglas Gilbert.
+ * Copyright (c) 2009-2015 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.
@@ -20,6 +20,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -28,7 +30,7 @@
* SCSI device.
*/
-static const char * version_str = "1.03 20140516";
+static const char * version_str = "1.04 20151219";
#define MAX_READ_BLOCK_LIMITS_LEN 6
@@ -48,9 +50,8 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_read_block_limits [--help] [--hex] [--raw] [--verbose] "
- "[--version]\n"
+ pr2serr("Usage: sg_read_block_limits [--help] [--hex] [--raw] "
+ "[--verbose] [--version]\n"
" DEVICE\n"
" where:\n"
" --help|-h print out usage message\n"
@@ -107,10 +108,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "invalid option -%c ??\n", c);
+ pr2serr("invalid option -%c ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -122,23 +123,21 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -155,39 +154,37 @@ main(int argc, char * argv[])
goto the_end;
}
- max_block_size = (readBlkLmtBuff[0] << 24) +
- (readBlkLmtBuff[1] << 16) +
- (readBlkLmtBuff[2] << 8) + readBlkLmtBuff[3];
- min_block_size = (readBlkLmtBuff[4] << 8) + readBlkLmtBuff[5];
+ max_block_size = sg_get_unaligned_be32(readBlkLmtBuff + 0);
+ min_block_size = sg_get_unaligned_be16(readBlkLmtBuff + 4);
k = min_block_size / 1024;
- fprintf(stderr, "Read Block Limits results:\n");
- fprintf(stderr, "\tMinimum block size: %u byte(s)",
+ pr2serr("Read Block Limits results:\n");
+ pr2serr("\tMinimum block size: %u byte(s)",
(unsigned int)min_block_size);
if (k != 0)
- fprintf(stderr, ", %d KB", k);
- fprintf(stderr, "\n");
+ pr2serr(", %d KB", k);
+ pr2serr("\n");
k = max_block_size / 1024;
m = max_block_size / 1048576;
- fprintf(stderr, "\tMaximum block size: %u byte(s)",
+ pr2serr("\tMaximum block size: %u byte(s)",
(unsigned int)max_block_size);
if (k != 0)
- fprintf(stderr, ", %d KB", k);
+ pr2serr(", %d KB", k);
if (m != 0)
- fprintf(stderr, ", %d MB", m);
- fprintf(stderr, "\n");
+ pr2serr(", %d MB", m);
+ pr2serr("\n");
} else {
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Read block limits: %s\n", b);
+ pr2serr("Read block limits: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' option for more information\n");
+ pr2serr(" try '-v' option for more information\n");
}
the_end:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_read_buffer.c b/src/sg_read_buffer.c
index fd93edb9..4b89a5f4 100644
--- a/src/sg_read_buffer.c
+++ b/src/sg_read_buffer.c
@@ -23,13 +23,14 @@
#include "sg_cmds_extra.h"
#include "sg_pt.h" /* needed for scsi_pt_win32_direct() */
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/*
* This utility issues the SCSI READ BUFFER(10 or 16) command to the given
* device.
*/
-static const char * version_str = "1.13 20150105";
+static const char * version_str = "1.14 20151219";
#ifndef SG_READ_BUFFER_10_CMD
@@ -66,8 +67,8 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_read_buffer [--16] [--help] [--hex] [--id=ID] [--length=LEN]\n"
+ pr2serr("Usage: sg_read_buffer [--16] [--help] [--hex] [--id=ID] "
+ "[--length=LEN]\n"
" [--long] [--mode=MO] [--offset=OFF] "
"[--raw]\n"
" [--readonly] [--specific=MS] [--verbose] "
@@ -129,10 +130,10 @@ print_modes(void)
{
const struct mode_s *mp;
- fprintf(stderr, "The modes parameter argument can be numeric "
- "(hex or decimal)\nor symbolic:\n");
+ pr2serr("The modes parameter argument can be numeric (hex or decimal)\n"
+ "or symbolic:\n");
for (mp = modes; mp->mode_string; ++mp) {
- fprintf(stderr, " %2d (0x%02x) %-16s%s\n", mp->mode, mp->mode,
+ pr2serr(" %2d (0x%02x) %-16s%s\n", mp->mode, mp->mode,
mp->mode_string, mp->comment);
}
}
@@ -157,15 +158,15 @@ ll_read_buffer_10(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
sg_put_unaligned_be24(rb_offset, rb10_cb + 3);
sg_put_unaligned_be24(mx_resp_len, rb10_cb + 6);
if (verbose) {
- fprintf(stderr, " Read buffer(10) cdb: ");
+ pr2serr(" Read buffer(10) cdb: ");
for (k = 0; k < SG_READ_BUFFER_10_CMDLEN; ++k)
- fprintf(stderr, "%02x ", rb10_cb[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rb10_cb[k]);
+ pr2serr("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Read buffer(10): out of memory\n");
+ pr2serr("Read buffer(10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rb10_cb, sizeof(rb10_cb));
@@ -188,7 +189,7 @@ ll_read_buffer_10(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(stderr, " Read buffer(10): response%s\n",
+ pr2serr(" Read buffer(10): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
@@ -221,15 +222,15 @@ ll_read_buffer_16(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
sg_put_unaligned_be24(mx_resp_len, rb16_cb + 11);
rb16_cb[14] = (uint8_t)rb_id;
if (verbose) {
- fprintf(stderr, " Read buffer(16) cdb: ");
+ pr2serr(" Read buffer(16) cdb: ");
for (k = 0; k < SG_READ_BUFFER_16_CMDLEN; ++k)
- fprintf(stderr, "%02x ", rb16_cb[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rb16_cb[k]);
+ pr2serr("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Read buffer(16): out of memory\n");
+ pr2serr("Read buffer(16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rb16_cb, sizeof(rb16_cb));
@@ -252,7 +253,7 @@ ll_read_buffer_16(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(stderr, " Read buffer(16): response%s\n",
+ pr2serr(" Read buffer(16): response%s\n",
(ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
@@ -315,20 +316,19 @@ main(int argc, char * argv[])
case 'i':
rb_id = sg_get_num(optarg);
if ((rb_id < 0) || (rb_id > 255)) {
- fprintf(stderr, "argument to '--id' should be in the range "
- "0 to 255\n");
+ pr2serr("argument to '--id' should be in the range 0 to "
+ "255\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'l':
rb_len = sg_get_num(optarg);
if (rb_len < 0) {
- fprintf(stderr, "bad argument to '--length'\n");
+ pr2serr("bad argument to '--length'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (rb_len > 0xffffff) {
- fprintf(stderr, "argument to '--length' must be <= "
- "0xffffff\n");
+ pr2serr("argument to '--length' must be <= 0xffffff\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -339,8 +339,8 @@ main(int argc, char * argv[])
if (isdigit(*optarg)) {
rb_mode = sg_get_num(optarg);
if ((rb_mode < 0) || (rb_mode > 31)) {
- fprintf(stderr, "argument to '--mode' should be in the "
- "range 0 to 31\n");
+ pr2serr("argument to '--mode' should be in the range 0 "
+ "to 31\n");
return SG_LIB_SYNTAX_ERROR;
}
} else {
@@ -360,7 +360,7 @@ main(int argc, char * argv[])
case 'o':
ll = sg_get_llnum(optarg);
if (ll < 0) {
- fprintf(stderr, "bad argument to '--offset'\n");
+ pr2serr("bad argument to '--offset'\n");
return SG_LIB_SYNTAX_ERROR;
}
rb_offset = ll;
@@ -374,8 +374,7 @@ main(int argc, char * argv[])
case 'S':
rb_mode_sp = sg_get_num(optarg);
if ((rb_mode_sp < 0) || (rb_mode_sp > 7)) {
- fprintf(stderr, "expected argument to '--specific' to be 0 "
- "to 7\n");
+ pr2serr("expected argument to '--specific' to be 0 to 7\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -383,10 +382,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -394,7 +393,7 @@ main(int argc, char * argv[])
if (do_help) {
if (do_help > 1) {
usage();
- fprintf(stderr, "\n");
+ pr2serr("\n");
print_modes();
} else
usage();
@@ -407,15 +406,14 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -423,8 +421,7 @@ main(int argc, char * argv[])
if (rb_len > 0) {
resp = (unsigned char *)malloc(rb_len);
if (NULL == resp) {
- fprintf(stderr, "unable to allocate %d bytes on the heap\n",
- rb_len);
+ pr2serr("unable to allocate %d bytes on the heap\n", rb_len);
return SG_LIB_CAT_OTHER;
}
memset(resp, 0, rb_len);
@@ -442,7 +439,7 @@ main(int argc, char * argv[])
#ifdef SG_LIB_WIN32
#ifdef SG_LIB_WIN32_DIRECT
if (verbose > 4)
- fprintf(stderr, "Initial win32 SPT interface state: %s\n",
+ pr2serr("Initial win32 SPT interface state: %s\n",
scsi_pt_win32_spt_state() ? "direct" : "indirect");
scsi_pt_win32_direct(SG_LIB_WIN32_DIRECT /* SPT pt interface */);
#endif
@@ -450,8 +447,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
ret = SG_LIB_FILE_ERROR;
goto fini;
}
@@ -460,8 +456,8 @@ main(int argc, char * argv[])
res = ll_read_buffer_16(sg_fd, rb_mode, rb_mode_sp, rb_id, rb_offset,
resp, rb_len, &resid, 1, verbose);
else if (rb_offset > 0xffffff) {
- fprintf(stderr, "--offset value is too large for READ BUFFER(10), "
- "try --16\n");
+ pr2serr("--offset value is too large for READ BUFFER(10), try "
+ "--16\n");
ret = SG_LIB_SYNTAX_ERROR;
goto fini;
} else
@@ -474,8 +470,7 @@ main(int argc, char * argv[])
ret = res;
if (res > 0) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Read buffer(%d) failed: %s\n",
- (do_long ? 16 : 10), b);
+ pr2serr("Read buffer(%d) failed: %s\n", (do_long ? 16 : 10), b);
}
goto fini;
}
@@ -513,7 +508,7 @@ fini:
if (sg_fd >= 0) {
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_read_long.c b/src/sg_read_long.c
index 459ebd46..4c5bc643 100644
--- a/src/sg_read_long.c
+++ b/src/sg_read_long.c
@@ -1,5 +1,5 @@
/* A utility program for the Linux OS SCSI subsystem.
- * Copyright (C) 2004-2014 D. Gilbert
+ * Copyright (C) 2004-2015 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)
@@ -28,8 +28,9 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.19 20140516";
+static const char * version_str = "1.20 20151219";
#define MAX_XFER_LEN 10000
@@ -55,32 +56,31 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_read_long [--16] [--correct] [--help] [--lba=LBA] "
- "[--out=OF]\n"
- " [--pblock] [--readonly] [--verbose] "
- "[--version]\n"
- " [--xfer_len=BTL] DEVICE\n"
- " where:\n"
- " --16|-S do READ LONG(16) (default: "
- "READ LONG(10))\n"
- " --correct|-c use ECC to correct data "
- "(default: don't)\n"
- " --help|-h print out usage message\n"
- " --lba=LBA|-l LBA logical block address"
- " (default: 0)\n"
- " --out=OF|-o OF output in binary to file named OF\n"
- " --pblock|-p fetch physical block containing LBA\n"
- " --readonly|-r open DEVICE read-only (def: open it "
- "read-write)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and"
- " exit\n"
- " --xfer_len=BTL|-x BTL byte transfer length (< 10000)"
- " default 520\n\n"
- "Perform a SCSI READ LONG (10 or 16) command. Reads a single "
- "block with\nassociated ECC data. User data could be scrambled.\n"
- );
+ pr2serr("Usage: sg_read_long [--16] [--correct] [--help] [--lba=LBA] "
+ "[--out=OF]\n"
+ " [--pblock] [--readonly] [--verbose] "
+ "[--version]\n"
+ " [--xfer_len=BTL] DEVICE\n"
+ " where:\n"
+ " --16|-S do READ LONG(16) (default: "
+ "READ LONG(10))\n"
+ " --correct|-c use ECC to correct data "
+ "(default: don't)\n"
+ " --help|-h print out usage message\n"
+ " --lba=LBA|-l LBA logical block address"
+ " (default: 0)\n"
+ " --out=OF|-o OF output in binary to file named OF\n"
+ " --pblock|-p fetch physical block containing LBA\n"
+ " --readonly|-r open DEVICE read-only (def: open it "
+ "read-write)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and"
+ " exit\n"
+ " --xfer_len=BTL|-x BTL byte transfer length (< 10000)"
+ " default 520\n\n"
+ "Perform a SCSI READ LONG (10 or 16) command. Reads a single "
+ "block with\nassociated ECC data. User data could be "
+ "scrambled.\n");
}
/* Returns 0 if successful */
@@ -103,12 +103,12 @@ process_read_long(int sg_fd, int do_16, int pblock, int correct,
case 0:
break;
case SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO:
- fprintf(stderr, "<<< device indicates 'xfer_len' should be %d "
- ">>>\n", xfer_len - offset);
+ pr2serr("<<< device indicates 'xfer_len' should be %d >>>\n",
+ xfer_len - offset);
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, " SCSI READ LONG (%s): %s\n", ten_or, b);
+ pr2serr(" SCSI READ LONG (%s): %s\n", ten_or, b);
break;
}
return res;
@@ -155,7 +155,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
llba = (uint64_t)ll;
@@ -176,17 +176,17 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'x':
xfer_len = sg_get_num(optarg);
if (-1 == xfer_len) {
- fprintf(stderr, "bad argument to '--xfer_len'\n");
+ pr2serr("bad argument to '--xfer_len'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -198,41 +198,39 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (xfer_len >= MAX_XFER_LEN){
- fprintf(stderr, "xfer_len (%d) is out of range ( < %d)\n",
- xfer_len, MAX_XFER_LEN);
+ pr2serr("xfer_len (%d) is out of range ( < %d)\n", xfer_len,
+ MAX_XFER_LEN);
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (NULL == (rawp = malloc(MAX_XFER_LEN))) {
- fprintf(stderr, ME "out of memory\n");
+ pr2serr(ME "out of memory\n");
sg_cmds_close_device(sg_fd);
return SG_LIB_SYNTAX_ERROR;
}
readLongBuff = (unsigned char *)rawp;
memset(rawp, 0x0, MAX_XFER_LEN);
- fprintf(stderr, ME "issue read long (%s) to device %s\n xfer_len=%d "
- "(0x%x), lba=%" PRIu64 " (0x%" PRIx64 "), correct=%d\n",
+ pr2serr(ME "issue read long (%s) to device %s\n xfer_len=%d (0x%x), "
+ "lba=%" PRIu64 " (0x%" PRIx64 "), correct=%d\n",
(do_16 ? "16" : "10"), device_name, xfer_len, xfer_len, llba,
llba, correct);
@@ -273,7 +271,7 @@ err_out:
if (rawp) free(rawp);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_readcap.c b/src/sg_readcap.c
index e1d66886..e05f791e 100644
--- a/src/sg_readcap.c
+++ b/src/sg_readcap.c
@@ -28,9 +28,10 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "3.94 20151126";
+static const char * version_str = "3.95 20151219";
#define ME "sg_readcap: "
@@ -76,8 +77,7 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr,
- "Usage: sg_readcap [--brief] [--help] [--hex] [--lba=LBA] "
+ pr2serr("Usage: sg_readcap [--brief] [--help] [--hex] [--lba=LBA] "
"[--long] [--16]\n"
" [--pmi] [--raw] [--readonly] [--verbose] "
"[--version]\n"
@@ -111,7 +111,7 @@ usage()
static void
usage_old()
{
- fprintf(stderr, "Usage: sg_readcap [-16] [-b] [-h] [-H] [-lba=LBA] "
+ pr2serr("Usage: sg_readcap [-16] [-b] [-h] [-H] [-lba=LBA] "
"[-pmi] [-r] [-R]\n"
" [-v] [-V] [-z] DEVICE\n"
" where:\n"
@@ -184,7 +184,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'L':
nn = sg_get_llnum(optarg);
if (-1 == nn) {
- fprintf(stderr, "bad argument to '--lba='\n");
+ pr2serr("bad argument to '--lba='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -218,7 +218,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
++op->do_zbc;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (op->do_help)
break;
usage();
@@ -232,8 +232,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -326,15 +325,15 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("-old", cp, 4))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage();
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == op->device_name)
op->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not expecting: "
- "%s\n", op->device_name, cp);
+ pr2serr("too many arguments, got: %s, not expecting: %s\n",
+ op->device_name, cp);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -412,12 +411,12 @@ main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
if (NULL == op->device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
usage_for(op);
return SG_LIB_SYNTAX_ERROR;
}
@@ -435,7 +434,7 @@ main(int argc, char * argv[])
memset(resp_buff, 0, sizeof(resp_buff));
if ((0 == op->do_pmi) && (op->llba > 0)) {
- fprintf(stderr, ME "lba can only be non-zero when '--pmi' is set\n");
+ pr2serr(ME "lba can only be non-zero when '--pmi' is set\n");
usage_for(op);
return SG_LIB_SYNTAX_ERROR;
}
@@ -445,7 +444,7 @@ main(int argc, char * argv[])
rw_0_flag = 1; /* RCAP(10) has opened RO in past, so leave */
if ((sg_fd = sg_cmds_open_device(op->device_name, rw_0_flag,
op->do_verbose)) < 0) {
- fprintf(stderr, ME "error opening file: %s: %s\n", op->device_name,
+ pr2serr(ME "error opening file: %s: %s\n", op->device_name,
safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -511,16 +510,16 @@ main(int argc, char * argv[])
sg_cmds_close_device(sg_fd);
if ((sg_fd = sg_cmds_open_device(op->device_name, op->o_readonly,
op->do_verbose)) < 0) {
- fprintf(stderr, ME "error re-opening file: %s (rw): %s\n",
+ pr2serr(ME "error re-opening file: %s (rw): %s\n",
op->device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (op->do_verbose)
- fprintf(stderr, "READ CAPACITY (10) not supported, trying "
- "READ CAPACITY (16)\n");
+ pr2serr("READ CAPACITY (10) not supported, trying READ "
+ "CAPACITY (16)\n");
} else if (res) {
sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
- fprintf(stderr, "READ CAPACITY (10) failed: %s\n", b);
+ pr2serr("READ CAPACITY (10) failed: %s\n", b);
}
}
if (op->do_long) {
@@ -600,11 +599,11 @@ main(int argc, char * argv[])
}
goto good;
} else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "bad field in READ CAPACITY (16) cdb "
- "including unsupported service action\n");
+ pr2serr("bad field in READ CAPACITY (16) cdb including "
+ "unsupported service action\n");
else if (res) {
sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
- fprintf(stderr, "READ CAPACITY (16) failed: %s\n", b);
+ pr2serr("READ CAPACITY (16) failed: %s\n", b);
}
}
if (op->do_brief)
@@ -613,7 +612,7 @@ main(int argc, char * argv[])
good:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_reassign.c b/src/sg_reassign.c
index 8aeb8522..d6882dff 100644
--- a/src/sg_reassign.c
+++ b/src/sg_reassign.c
@@ -23,6 +23,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -57,41 +58,39 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_reassign [--address=A,A...] [--dummy] [--eight=0|1] "
- "[--grown]\n"
- " [--help] [--hex] [--longlist=0|1] [--primary] "
- "[--verbose]\n"
- " [--version] DEVICE\n"
- " where:\n"
- " --address=A,A...|-a A,A... comma separated logical block "
- "addresses\n"
- " one or more, assumed to be "
- "decimal\n"
- " --address=-|-a - read stdin for logical block "
- "addresses\n"
- " --dummy|-d prepare but do not execute REASSIGN "
- "BLOCKS command\n"
- " --eight=0|1\n"
- " -e 0|1 force eight byte (64 bit) lbas "
- "when 1,\n"
- " four byte (32 bit) lbas when 0 "
- "(def)\n"
- " --grown|-g fetch grown defect list length, "
- "don't reassign\n"
- " --help|-h print out usage message\n"
- " --hex|-H print response in hex (for '-g' or "
- "'-p')\n"
- " --longlist=0|1\n"
- " -l 0|1 use 4 byte list length when 1, safe to "
- "ignore\n"
- " (def: 0 (2 byte list length))\n"
- " --primary|-p fetch primary defect list length, "
- "don't reassign\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Perform a SCSI REASSIGN BLOCKS command (or READ DEFECT LIST)\n"
- );
+ pr2serr("Usage: sg_reassign [--address=A,A...] [--dummy] [--eight=0|1] "
+ "[--grown]\n"
+ " [--help] [--hex] [--longlist=0|1] "
+ "[--primary] [--verbose]\n"
+ " [--version] DEVICE\n"
+ " where:\n"
+ " --address=A,A...|-a A,A... comma separated logical block "
+ "addresses\n"
+ " one or more, assumed to be "
+ "decimal\n"
+ " --address=-|-a - read stdin for logical block "
+ "addresses\n"
+ " --dummy|-d prepare but do not execute REASSIGN "
+ "BLOCKS command\n"
+ " --eight=0|1\n"
+ " -e 0|1 force eight byte (64 bit) lbas "
+ "when 1,\n"
+ " four byte (32 bit) lbas when 0 "
+ "(def)\n"
+ " --grown|-g fetch grown defect list length, "
+ "don't reassign\n"
+ " --help|-h print out usage message\n"
+ " --hex|-H print response in hex (for '-g' or "
+ "'-p')\n"
+ " --longlist=0|1\n"
+ " -l 0|1 use 4 byte list length when 1, safe to "
+ "ignore\n"
+ " (def: 0 (2 byte list length))\n"
+ " --primary|-p fetch primary defect list length, "
+ "don't reassign\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Perform a SCSI REASSIGN BLOCKS command (or READ DEFECT LIST)\n");
}
/* Trying to decode multipliers as sg_get_llnum() [in sg_libs] does would
@@ -171,16 +170,15 @@ build_lba_arr(const char * inp, uint64_t * lba_arr,
continue;
k = strspn(lcp, "0123456789aAbBcCdDeEfFhHxX ,\t");
if ((k < in_len) && ('#' != lcp[k])) {
- fprintf(stderr, "build_lba_arr: syntax error at "
- "line %d, pos %d\n", j + 1, m + k + 1);
+ pr2serr("build_lba_arr: syntax error at line %d, pos %d\n",
+ j + 1, m + k + 1);
return 1;
}
for (k = 0; k < 1024; ++k) {
ll = get_llnum(lcp);
if (-1 != ll) {
if ((off + k) >= max_arr_len) {
- fprintf(stderr, "build_lba_arr: array length "
- "exceeded\n");
+ pr2serr("build_lba_arr: array length exceeded\n");
return 1;
}
lba_arr[off + k] = (uint64_t)ll;
@@ -195,9 +193,8 @@ build_lba_arr(const char * inp, uint64_t * lba_arr,
--k;
break;
}
- fprintf(stderr, "build_lba_arr: error in "
- "line %d, at pos %d\n", j + 1,
- (int)(lcp - line + 1));
+ pr2serr("build_lba_arr: error in line %d, at pos %d\n",
+ j + 1, (int)(lcp - line + 1));
return 1;
}
}
@@ -207,7 +204,7 @@ build_lba_arr(const char * inp, uint64_t * lba_arr,
} else { /* list of numbers (default decimal) on command line */
k = strspn(inp, "0123456789aAbBcCdDeEfFhHxX, ");
if (in_len != k) {
- fprintf(stderr, "build_lba_arr: error at pos %d\n", k + 1);
+ pr2serr("build_lba_arr: error at pos %d\n", k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
@@ -224,14 +221,14 @@ build_lba_arr(const char * inp, uint64_t * lba_arr,
cp = c2p;
lcp = cp + 1;
} else {
- fprintf(stderr, "build_lba_arr: error at pos %d\n",
+ pr2serr("build_lba_arr: error at pos %d\n",
(int)(lcp - inp + 1));
return 1;
}
}
*lba_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_lba_arr: array length exceeded\n");
+ pr2serr("build_lba_arr: array length exceeded\n");
return 1;
}
}
@@ -272,7 +269,7 @@ main(int argc, char * argv[])
memset(addr_arr, 0, sizeof(addr_arr));
if (0 != build_lba_arr(optarg, addr_arr, &addr_arr_len,
MAX_NUM_ADDR)) {
- fprintf(stderr, "bad argument to '--address'\n");
+ pr2serr("bad argument to '--address'\n");
return SG_LIB_SYNTAX_ERROR;
}
got_addr = 1;
@@ -285,7 +282,7 @@ main(int argc, char * argv[])
if ((1 == num) && ((0 == res) || (1 == res)))
eight = res;
else {
- fprintf(stderr, "value for '--eight=' must be 0 or 1\n");
+ pr2serr("value for '--eight=' must be 0 or 1\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -304,7 +301,7 @@ main(int argc, char * argv[])
if ((1 == num) && ((0 == res) || (1 == res)))
longlist = res;
else {
- fprintf(stderr, "value for '--longlist=' must be 0 or 1\n");
+ pr2serr("value for '--longlist=' must be 0 or 1\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -315,10 +312,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -330,26 +327,24 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (grown || primary) {
if (got_addr) {
- fprintf(stderr, "can't have '--address=' with '--grown' or "
- "'--primary'\n");
+ pr2serr("can't have '--address=' with '--grown' or '--primary'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
} else if ((0 == got_addr) || (addr_arr_len < 1)) {
- fprintf(stderr, "need at least one address (see '--address=')\n");
+ pr2serr("need at least one address (see '--address=')\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -360,7 +355,7 @@ main(int argc, char * argv[])
eight = 1;
break;
} else if (0 == eight) {
- fprintf(stderr, "address number %d exceeds 32 bits so "
+ pr2serr("address number %d exceeds 32 bits so "
"'--eight=0' invalid\n", k + 1);
return SG_LIB_SYNTAX_ERROR;
}
@@ -389,16 +384,15 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (got_addr) {
if (dummy) {
- fprintf(stderr, ">>> dummy: REASSIGN BLOCKS not executed\n");
+ pr2serr(">>> dummy: REASSIGN BLOCKS not executed\n");
if (verbose) {
- fprintf(stderr, " Would have reassigned these blocks:\n");
+ pr2serr(" Would have reassigned these blocks:\n");
for (j = 0; j < addr_arr_len; ++j)
printf(" 0x%" PRIx64 "\n", addr_arr[j]);
}
@@ -409,7 +403,7 @@ main(int argc, char * argv[])
ret = res;
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "REASSIGN BLOCKS: %s\n", b);
+ pr2serr("REASSIGN BLOCKS: %s\n", b);
goto err_out;
}
} else /* if (grown || primary) */ {
@@ -425,7 +419,7 @@ main(int argc, char * argv[])
ret = res;
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "READ DEFECT DATA(10): %s\n", b);
+ pr2serr("READ DEFECT DATA(10): %s\n", b);
goto err_out;
}
if (do_hex) {
@@ -442,12 +436,12 @@ main(int argc, char * argv[])
else if (got_primary)
lstp = "primary defect list";
else {
- fprintf(stderr, "didn't get grown or primary list in response\n");
+ pr2serr("didn't get grown or primary list in response\n");
goto err_out;
}
if (verbose)
- fprintf(stderr, "asked for defect list format %d, got %d\n",
- dl_format, (param_arr[1] & 0x7));
+ pr2serr("asked for defect list format %d, got %d\n", dl_format,
+ (param_arr[1] & 0x7));
dl_format = (param_arr[1] & 0x7);
switch (dl_format) {
case 0: /* short block */
@@ -459,7 +453,7 @@ main(int argc, char * argv[])
div = 8;
break;
default:
- fprintf(stderr, "defect list format %d unknown\n", dl_format);
+ pr2serr("defect list format %d unknown\n", dl_format);
break;
}
dl_len = sg_get_unaligned_be16(param_arr + 2);
@@ -478,7 +472,7 @@ main(int argc, char * argv[])
err_out:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_referrals.c b/src/sg_referrals.c
index 118f604d..051f3520 100644
--- a/src/sg_referrals.c
+++ b/src/sg_referrals.c
@@ -20,6 +20,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/*
* A utility program originally written for the Linux OS SCSI subsystem.
@@ -29,7 +31,7 @@
* SCSI device.
*/
-static const char * version_str = "1.04 20150515"; /* sbc4r01 */
+static const char * version_str = "1.05 20151219"; /* sbc4r01 */
#define MAX_REFER_BUFF_LEN (1024 * 1024)
#define DEF_REFER_BUFF_LEN 256
@@ -91,8 +93,8 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_referrals [--help] [--hex] [--lba=LBA] [--maxlen=LEN]\n"
+ pr2serr("Usage: sg_referrals [--help] [--hex] [--lba=LBA] "
+ "[--maxlen=LEN]\n"
" [--one-segment] [--raw] [--readonly] "
"[--verbose]\n"
" [--version] DEVICE\n"
@@ -105,8 +107,7 @@ usage()
"length in cdb)\n"
" (def: 0 -> %d bytes)\n",
DEF_REFER_BUFF_LEN );
- fprintf(stderr,
- " --one-segment|-s return information about the specified "
+ pr2serr(" --one-segment|-s return information about the specified "
"segment only\n"
" --raw|-r output in binary\n"
" --verbose|-v increase verbosity\n"
@@ -140,14 +141,8 @@ decode_referral_desc(const unsigned char * ucp, int bytes)
if (bytes < 20)
return -1;
- first = ((uint64_t)ucp[4] << 56) | ((uint64_t)ucp[5] << 48) |
- ((uint64_t)ucp[6] << 40) | ((uint64_t)ucp[7] << 32) |
- ((uint64_t)ucp[8] << 24) | ((uint64_t)ucp[9] << 16) |
- ((uint64_t)ucp[10] << 8) | (uint64_t)ucp[11];
- last = ((uint64_t)ucp[12] << 56) | ((uint64_t)ucp[13] << 48) |
- ((uint64_t)ucp[14] << 40) | ((uint64_t)ucp[15] << 32) |
- ((uint64_t)ucp[16] << 24) | ((uint64_t)ucp[17] << 16) |
- ((uint64_t)ucp[18] << 8) | (uint64_t)ucp[19];
+ first = sg_get_unaligned_be64(ucp + 4);
+ last = sg_get_unaligned_be64(ucp + 12);
printf(" target port descriptors: %d\n", ucp[3]);
printf(" user data segment: first lba %" PRIu64 ", last lba %"
@@ -203,7 +198,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
lba = (uint64_t)ll;
@@ -211,8 +206,8 @@ main(int argc, char * argv[])
case 'm':
maxlen = sg_get_num(optarg);
if ((maxlen < 0) || (maxlen > MAX_REFER_BUFF_LEN)) {
- fprintf(stderr, "argument to '--maxlen' should be %d or "
- "less\n", MAX_REFER_BUFF_LEN);
+ pr2serr("argument to '--maxlen' should be %d or less\n",
+ MAX_REFER_BUFF_LEN);
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -229,10 +224,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -244,22 +239,21 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (maxlen > DEF_REFER_BUFF_LEN) {
referralBuffp = (unsigned char *)calloc(maxlen, 1);
if (NULL == referralBuffp) {
- fprintf(stderr, "unable to allocate %d bytes on heap\n", maxlen);
+ pr2serr("unable to allocate %d bytes on heap\n", maxlen);
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -273,8 +267,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
ret = SG_LIB_FILE_ERROR;
goto free_buff;
}
@@ -306,15 +299,15 @@ main(int argc, char * argv[])
}
if (maxlen < 4) {
if (verbose)
- fprintf(stderr, "Exiting because allocation length (maxlen) "
- " less than 4\n");
+ pr2serr("Exiting because allocation length (maxlen) less "
+ "than 4\n");
goto the_end;
}
if ((verbose > 1) || (verbose && (rlen > maxlen))) {
- fprintf(stderr, "response length %d bytes\n", rlen);
+ pr2serr("response length %d bytes\n", rlen);
if (rlen > maxlen)
- fprintf(stderr, " ... which is greater than maxlen "
- "(allocation length %d), truncation\n", maxlen);
+ pr2serr(" ... which is greater than maxlen (allocation "
+ "length %d), truncation\n", maxlen);
}
if (rlen > maxlen)
rlen = maxlen;
@@ -326,7 +319,7 @@ main(int argc, char * argv[])
printf(" descriptor %d:\n", desc);
res = decode_referral_desc(ucp + k, rlen - 4 - k);
if (res < 0) {
- fprintf(stderr, "bad user data segment referral descriptor\n");
+ pr2serr("bad user data segment referral descriptor\n");
k = rlen - 4;
break;
}
@@ -337,13 +330,13 @@ main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Report Referrals command failed: %s\n", b);
+ pr2serr("Report Referrals command failed: %s\n", b);
}
the_end:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
ret = SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_rep_zones.c b/src/sg_rep_zones.c
index 022bc84c..62fb57b5 100644
--- a/src/sg_rep_zones.c
+++ b/src/sg_rep_zones.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -24,6 +23,7 @@
#include "sg_pt.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -32,7 +32,7 @@
* and decodes the response. Based on zbc-r02.pdf
*/
-static const char * version_str = "1.06 20151210";
+static const char * version_str = "1.07 20151219";
#define MAX_RZONES_BUFF_LEN (1024 * 1024)
#define DEF_RZONES_BUFF_LEN (1024 * 8)
@@ -60,26 +60,6 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
@@ -325,7 +305,7 @@ main(int argc, char * argv[])
case 's':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--start=LBA'\n");
+ pr2serr("bad argument to '--start=LBA'\n");
return SG_LIB_SYNTAX_ERROR;
}
st_lba = (uint64_t)ll;
diff --git a/src/sg_requests.c b/src/sg_requests.c
index caa9d5f0..29c611c9 100644
--- a/src/sg_requests.c
+++ b/src/sg_requests.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Douglas Gilbert.
+ * Copyright (c) 2004-2015 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.
@@ -18,6 +18,7 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
*
@@ -25,7 +26,7 @@
* This program issues the SCSI command REQUEST SENSE to the given SCSI device.
*/
-static const char * version_str = "1.25 20140515";
+static const char * version_str = "1.26 20151219";
#define MAX_REQS_RESP_LEN 255
#define DEF_REQS_RESP_LEN 252
@@ -62,8 +63,7 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_requests [--desc] [--help] [--hex] [--maxlen=LEN] "
+ pr2serr("Usage: sg_requests [--desc] [--help] [--hex] [--maxlen=LEN] "
"[--num=NUM]\n"
" [--progress] [--raw] [--status] [--time] "
"[--verbose]\n"
@@ -145,15 +145,15 @@ main(int argc, char * argv[])
case 'm':
maxlen = sg_get_num(optarg);
if ((maxlen < 0) || (maxlen > MAX_REQS_RESP_LEN)) {
- fprintf(stderr, "argument to '--maxlen' should be %d or "
- "less\n", MAX_REQS_RESP_LEN);
+ pr2serr("argument to '--maxlen' should be %d or less\n",
+ MAX_REQS_RESP_LEN);
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'n':
num_rs = sg_get_num(optarg);
if (num_rs < 1) {
- fprintf(stderr, "bad argument to '--num'\n");
+ pr2serr("bad argument to '--num'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -175,10 +175,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -190,8 +190,7 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -200,7 +199,7 @@ main(int argc, char * argv[])
if (0 == maxlen)
maxlen = DEF_REQS_RESP_LEN;
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -213,8 +212,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 1 /* ro */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (do_progress) {
@@ -227,21 +225,21 @@ main(int argc, char * argv[])
if (res) {
ret = res;
if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "Request Sense command not supported\n");
+ pr2serr("Request Sense command not supported\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "bad field in Request Sense cdb\n");
+ pr2serr("bad field in Request Sense cdb\n");
else if (SG_LIB_CAT_ABORTED_COMMAND == res)
- fprintf(stderr, "Request Sense, aborted command\n");
+ pr2serr("Request Sense, aborted command\n");
else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Request Sense command: %s\n", b);
+ pr2serr("Request Sense command: %s\n", b);
}
break;
}
/* "Additional sense length" same in descriptor and fixed */
resp_len = requestSenseBuff[7] + 8;
if (verbose > 1) {
- fprintf(stderr, "Parameter data in hex\n");
+ pr2serr("Parameter data in hex\n");
dStrHexErr((const char *)requestSenseBuff, resp_len, 1);
}
progress = -1;
@@ -250,8 +248,8 @@ main(int argc, char * argv[])
if (progress < 0) {
ret = res;
if (verbose > 1)
- fprintf(stderr, "No progress indication found, "
- "iteration %d\n", k + 1);
+ pr2serr("No progress indication found, iteration %d\n",
+ k + 1);
/* N.B. exits first time there isn't a progress indication */
break;
} else
@@ -284,23 +282,23 @@ main(int argc, char * argv[])
else if (do_hex)
dStrHex((const char *)requestSenseBuff, resp_len, 1);
else if (1 == num_rs) {
- fprintf(stderr, "Decode parameter data as sense data:\n");
+ pr2serr("Decode parameter data as sense data:\n");
sg_print_sense(NULL, requestSenseBuff, resp_len, 0);
if (verbose > 1) {
- fprintf(stderr, "\nParameter data in hex\n");
+ pr2serr("\nParameter data in hex\n");
dStrHexErr((const char *)requestSenseBuff, resp_len, 1);
}
}
continue;
} else if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "Request Sense command not supported\n");
+ pr2serr("Request Sense command not supported\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "bad field in Request Sense cdb\n");
+ pr2serr("bad field in Request Sense cdb\n");
else if (SG_LIB_CAT_ABORTED_COMMAND == res)
- fprintf(stderr, "Request Sense, aborted command\n");
+ pr2serr("Request Sense, aborted command\n");
else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Request Sense command: %s\n", b);
+ pr2serr("Request Sense command: %s\n", b);
}
break;
}
@@ -343,7 +341,7 @@ main(int argc, char * argv[])
finish:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_reset.c b/src/sg_reset.c
index 708ac019..59c54987 100644
--- a/src/sg_reset.c
+++ b/src/sg_reset.c
@@ -1,5 +1,5 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 1999-2014 D. Gilbert
+ * Copyright (C) 1999-2015 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)
@@ -13,6 +13,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
@@ -28,7 +29,7 @@
#define ME "sg_reset: "
-static const char * version_str = "0.59 20141024";
+static const char * version_str = "0.60 20151219";
#ifndef SG_SCSI_RESET
#define SG_SCSI_RESET 0x2284
@@ -62,12 +63,30 @@ static struct option long_options[] = {
{0, 0, 0, 0},
};
+#ifdef __GNUC__
+static int pr2serr(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2serr(const char * fmt, ...);
+#endif
+
+
+static int
+pr2serr(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(stderr, fmt, args);
+ va_end(args);
+ return n;
+}
static void
usage(int compat_mode)
{
- fprintf(stderr, "Usage: "
- "sg_reset [--bus] [--device] [--help] [--host] [--no-esc] "
+ pr2serr("Usage: sg_reset [--bus] [--device] [--help] [--host] [--no-esc] "
"[--target]\n"
" [--verbose] [--version] DEVICE\n"
" where:\n"
@@ -75,16 +94,13 @@ usage(int compat_mode)
"targets\n"
" --device|-d device (logical unit) reset\n");
if (compat_mode) {
- fprintf(stderr,
- " --help|-z print usage information then exit\n"
+ pr2serr(" --help|-z print usage information then exit\n"
" --host|-h|-H host (bus adapter: HBA) reset\n");
} else {
- fprintf(stderr,
- " --help|-h print usage information then exit\n"
+ pr2serr(" --help|-h print usage information then exit\n"
" --host|-H host (bus adapter: HBA) reset\n");
}
- fprintf(stderr,
- " --no-esc|-N overrides default action and only does "
+ pr2serr(" --no-esc|-N overrides default action and only does "
"reset requested\n"
" --target|-t target reset. The target holds the DEVICE "
"and perhaps\n"
@@ -156,13 +172,13 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'z':
usage(!!cp);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage(!!cp);
return SG_LIB_SYNTAX_ERROR;
}
@@ -175,14 +191,13 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage(!!cp);
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "Missing DEVICE name. Use '--help' to see usage.\n");
+ pr2serr("Missing DEVICE name. Use '--help' to see usage.\n");
return SG_LIB_SYNTAX_ERROR;
}
@@ -191,14 +206,13 @@ int main(int argc, char * argv[])
if ((!!do_device_reset + !!do_target_reset + !!do_bus_reset +
!!do_host_reset) > 1) {
- fprintf(stderr, "Can only request one type of reset per "
- "invocation\n");
+ pr2serr("Can only request one type of reset per invocation\n");
return 1;
}
sg_fd = open(device_name, O_RDWR | O_NONBLOCK);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: ", device_name);
+ pr2serr(ME "open error: %s: ", device_name);
perror("");
return 1;
}
@@ -227,42 +241,38 @@ int main(int argc, char * argv[])
if (no_escalate)
k += SG_SCSI_RESET_NO_ESCALATE;
if (verbose > 2)
- fprintf(stderr, " third argument to ioctl(SG_SCSI_RESET) is "
- "0x%x\n", k);
+ pr2serr(" third argument to ioctl(SG_SCSI_RESET) is 0x%x\n", k);
res = ioctl(sg_fd, SG_SCSI_RESET, &k);
if (res < 0) {
hold_errno = errno;
switch (errno) {
case EBUSY:
- fprintf(stderr, ME "BUSY, may be resetting now\n");
+ pr2serr(ME "BUSY, may be resetting now\n");
break;
case ENODEV:
- fprintf(stderr, ME "'no device' error, may be temporary while "
- "device is resetting\n");
+ pr2serr(ME "'no device' error, may be temporary while device is "
+ "resetting\n");
break;
case EAGAIN:
- fprintf(stderr, ME "try again later, may be resetting now\n");
+ pr2serr(ME "try again later, may be resetting now\n");
break;
case EIO:
- fprintf(stderr, ME "reset (for value=0x%x) may not be "
- "available\n", k);
+ pr2serr(ME "reset (for value=0x%x) may not be available\n", k);
break;
case EPERM:
case EACCES:
- fprintf(stderr, ME "reset requires CAP_SYS_ADMIN (root) "
- "permission\n");
+ pr2serr(ME "reset requires CAP_SYS_ADMIN (root) permission\n");
break;
case EINVAL:
- fprintf(stderr, ME "SG_SCSI_RESET not supported (for "
- "value=0x%x)\n", k);
+ pr2serr(ME "SG_SCSI_RESET not supported (for value=0x%x)\n", k);
default:
perror(ME "SG_SCSI_RESET failed");
break;
}
if (verbose > 1)
- fprintf(stderr, ME "ioctl(SG_SCSI_RESET) returned %d, errno=%d\n",
- res, hold_errno);
+ pr2serr(ME "ioctl(SG_SCSI_RESET) returned %d, errno=%d\n", res,
+ hold_errno);
close(sg_fd);
return 1;
}
diff --git a/src/sg_reset_wp.c b/src/sg_reset_wp.c
index 8d1acc8c..1e24ebab 100644
--- a/src/sg_reset_wp.c
+++ b/src/sg_reset_wp.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -24,6 +23,7 @@
#include "sg_pt.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -32,7 +32,7 @@
* device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.03 20151126";
+static const char * version_str = "1.04 20151219";
#define SG_ZONING_OUT_CMDLEN 16
#define RESET_WRITE_POINTER_SA 0x4
@@ -53,26 +53,6 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
@@ -182,7 +162,7 @@ main(int argc, char * argv[])
case 'z':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--zone=ID'\n");
+ pr2serr("bad argument to '--zone=ID'\n");
return SG_LIB_SYNTAX_ERROR;
}
zid = (uint64_t)ll;
diff --git a/src/sg_rmsn.c b/src/sg_rmsn.c
index e481b76e..42c9b6f4 100644
--- a/src/sg_rmsn.c
+++ b/src/sg_rmsn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005-2014 Douglas Gilbert.
+ * Copyright (c) 2005-2015 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.
@@ -18,6 +18,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program was originally written for the Linux OS SCSI subsystem.
*
@@ -26,7 +28,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.10 20140516";
+static const char * version_str = "1.11 20151219";
#define SERIAL_NUM_SANITY_LEN (16 * 1024)
@@ -42,19 +44,18 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_rmsn [--help] [--raw] [--readonly] [--verbose] [--version]\n"
- " DEVICE\n"
- " where:\n"
- " --help|-h print out usage message\n"
- " --raw|-r output serial number to stdout "
- "(potentially binary)\n"
- " --readonly|-R open DEVICE read-only (def: open it "
- "read-write)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI READ MEDIA SERIAL NUMBER command\n"
- );
+ pr2serr("Usage: sg_rmsn [--help] [--raw] [--readonly] [--verbose] "
+ "[--version]\n"
+ " DEVICE\n"
+ " where:\n"
+ " --help|-h print out usage message\n"
+ " --raw|-r output serial number to stdout "
+ "(potentially binary)\n"
+ " --readonly|-R open DEVICE read-only (def: open it "
+ "read-write)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI READ MEDIA SERIAL NUMBER command\n");
}
int main(int argc, char * argv[])
@@ -91,10 +92,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -106,15 +107,14 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -127,8 +127,7 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -138,30 +137,27 @@ int main(int argc, char * argv[])
1, verbose);
ret = res;
if (0 == res) {
- sn_len = (rmsn_buff[0] << 24) + (rmsn_buff[1] << 16) +
- (rmsn_buff[2] << 8) + rmsn_buff[3];
+ sn_len = sg_get_unaligned_be32(rmsn_buff + 0);
if (! raw)
printf("Reported serial number length = %d\n", sn_len);
if (0 == sn_len) {
- fprintf(stderr, " This implies the media has no serial "
- "number\n");
+ pr2serr(" This implies the media has no serial number\n");
goto err_out;
}
if (sn_len > SERIAL_NUM_SANITY_LEN) {
- fprintf(stderr, " That length (%d) seems too long for a "
- "serial number\n", sn_len);
+ pr2serr(" That length (%d) seems too long for a serial "
+ "number\n", sn_len);
goto err_out;
}
sn_len += 4;
ucp = (unsigned char *)malloc(sn_len);
if (NULL == ucp) {
- fprintf(stderr, " Out of memory (ram)\n");
+ pr2serr(" Out of memory (ram)\n");
goto err_out;
}
res = sg_ll_read_media_serial_num(sg_fd, ucp, sn_len, 1, verbose);
if (0 == res) {
- sn_len = (ucp[0] << 24) + (ucp[1] << 16) + (ucp[2] << 8) +
- ucp[3];
+ sn_len = sg_get_unaligned_be32(ucp + 0);
if (raw) {
if (sn_len > 0) {
n = fwrite(ucp + 4, 1, sn_len, stdout);
@@ -178,9 +174,9 @@ int main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Read Media Serial Number: %s\n", b);
+ pr2serr("Read Media Serial Number: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for more information\n");
+ pr2serr(" try '-v' for more information\n");
}
err_out:
@@ -188,7 +184,7 @@ err_out:
free(ucp);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_rtpg.c b/src/sg_rtpg.c
index 8ed11ff4..a88dcbae 100644
--- a/src/sg_rtpg.c
+++ b/src/sg_rtpg.c
@@ -18,6 +18,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
*
@@ -26,7 +28,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.19 20140515";
+static const char * version_str = "1.20 20151219";
#define REPORT_TGT_GRP_BUFF_LEN 1024
@@ -56,21 +58,20 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_rtpg [--decode] [--extended] [--help] [--hex] [--raw] "
- "[--readonly]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --decode|-d decode status and asym. access state\n"
- " --extended|-e use extended header parameter data format\n"
- " --help|-h print out usage message\n"
- " --hex|-H print out response in hex\n"
- " --raw|-r output response in binary to stdout\n"
- " --readonly|-R open DEVICE read-only (def: read-write)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI REPORT TARGET PORT GROUPS command\n"
- );
+ pr2serr("Usage: sg_rtpg [--decode] [--extended] [--help] [--hex] "
+ "[--raw] [--readonly]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --decode|-d decode status and asym. access state\n"
+ " --extended|-e use extended header parameter data "
+ "format\n"
+ " --help|-h print out usage message\n"
+ " --hex|-H print out response in hex\n"
+ " --raw|-r output response in binary to stdout\n"
+ " --readonly|-R open DEVICE read-only (def: read-write)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI REPORT TARGET PORT GROUPS command\n");
}
@@ -178,10 +179,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "Version: %s\n", version_str);
+ pr2serr("Version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -193,15 +194,14 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -214,8 +214,7 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -227,14 +226,11 @@ int main(int argc, char * argv[])
extended, 1, verbose);
ret = res;
if (0 == res) {
- report_len = (reportTgtGrpBuff[0] << 24) +
- (reportTgtGrpBuff[1] << 16) +
- (reportTgtGrpBuff[2] << 8) +
- reportTgtGrpBuff[3] + 4;
+ report_len = sg_get_unaligned_be32(reportTgtGrpBuff + 0) + 4;
if (report_len > (int)sizeof(reportTgtGrpBuff)) {
/* trunc = 1; */
- fprintf(stderr, " <<report too long for internal buffer,"
- " output truncated\n");
+ pr2serr(" <<report too long for internal buffer, output "
+ "truncated\n");
report_len = (int)sizeof(reportTgtGrpBuff);
}
if (raw) {
@@ -253,7 +249,7 @@ int main(int argc, char * argv[])
ucp = reportTgtGrpBuff + 4;
if (extended) {
if (0x10 != (ucp[0] & 0x70)) {
- fprintf(stderr, " <<invalid extended header format\n");
+ pr2serr(" <<invalid extended header format\n");
goto err_out;
}
printf(" Implicit transition time: %d\n", ucp[1]);
@@ -263,7 +259,7 @@ int main(int argc, char * argv[])
k += off, ucp += off) {
printf(" target port group id : 0x%x , Pref=%d, Rtpg_fmt=%d\n",
- (ucp[2] << 8) + ucp[3], !!(ucp[0] & 0x80),
+ sg_get_unaligned_be16(ucp + 2), !!(ucp[0] & 0x80),
(ucp[0] >> 4) & 0x07);
printf(" target port group asymmetric access state : ");
printf("0x%02x", ucp[0] & 0x0f);
@@ -296,26 +292,26 @@ int main(int argc, char * argv[])
if (0 == j)
printf(" Relative target port ids:\n");
printf(" 0x%02x\n",
- (ucp[8 + j + 2] << 8) + ucp[8 + j + 3]);
+ sg_get_unaligned_be16(ucp + 8 + j + 2));
}
off = 8 + j;
}
} else if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "Report Target Port Groups command not supported\n");
+ pr2serr("Report Target Port Groups command not supported\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
- fprintf(stderr, "bad field in Report Target Port Groups cdb "
- "including unsupported service action\n");
+ pr2serr("bad field in Report Target Port Groups cdb including "
+ "unsupported service action\n");
else {
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Report Target Port Groups: %s\n", b);
+ pr2serr("Report Target Port Groups: %s\n", b);
}
err_out:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_safte.c b/src/sg_safte.c
index a5005d73..8615bd77 100644
--- a/src/sg_safte.c
+++ b/src/sg_safte.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Hannes Reinecke and Douglas Gilbert.
+ * Copyright (c) 2004-2015 Hannes Reinecke and 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.
@@ -19,6 +19,8 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
*
@@ -26,7 +28,7 @@
* to the 'SCSI Accessed Fault-Tolerant Enclosures' (SAF-TE) spec.
*/
-static const char * version_str = "0.25 20140516";
+static const char * version_str = "0.26 20151219";
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -73,14 +75,14 @@ read_safte_configuration(int sg_fd, unsigned char *rb_buff,
int res;
if (rb_len < buf_capacity) {
- fprintf(stderr,"SCSI BUFFER size too small (%d/%d bytes)\n",
- rb_len, buf_capacity);
+ pr2serr("SCSI BUFFER size too small (%d/%d bytes)\n", rb_len,
+ buf_capacity);
return SG_LIB_CAT_ILLEGAL_REQ;
}
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=0 "
- "to fetch configuration\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=0 to fetch "
+ "configuration\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 0, 0,
rb_buff, rb_len, 1, verbose);
if (res && res != SG_LIB_CAT_RECOVERED)
@@ -131,8 +133,8 @@ do_safte_encl_status(int sg_fd, int do_hex, int do_raw, int verbose)
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=1 "
- "to read enclosure status\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=1 to read "
+ "enclosure status\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 1, 0,
rb_buff, rb_len, 0, verbose);
if (res && res != SG_LIB_CAT_RECOVERED)
@@ -271,8 +273,8 @@ do_safte_usage_statistics(int sg_fd, int do_hex, int do_raw, int verbose)
rb_buff = (unsigned char *)malloc(rb_len);
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=2 "
- "to read usage statistics\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=2 to read "
+ "usage statistics\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 2, 0,
rb_buff, rb_len, 0, verbose);
if (res) {
@@ -295,11 +297,9 @@ do_safte_usage_statistics(int sg_fd, int do_hex, int do_raw, int verbose)
return 0;
}
printf("Usage Statistics:\n");
- minutes = (rb_buff[0] << 24) + (rb_buff[1] << 16) +
- (rb_buff[2] << 8) + rb_buff[3];
+ minutes = sg_get_unaligned_be32(rb_buff + 0);
printf("\tPower on Minutes: %u\n", minutes);
- minutes = (rb_buff[4] << 24) + (rb_buff[5] << 16) +
- (rb_buff[6] << 8) + rb_buff[7];
+ minutes = sg_get_unaligned_be32(rb_buff + 4);
printf("\tPower on Cycles: %u\n", minutes);
free(rb_buff);
@@ -318,8 +318,8 @@ do_safte_slot_insertions(int sg_fd, int do_hex, int do_raw, int verbose)
rb_buff = (unsigned char *)malloc(rb_len);
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=3 "
- "to read device insertions\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=3 to read "
+ "device insertions\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 3, 0,
rb_buff, rb_len, 0, verbose);
if (res ) {
@@ -343,7 +343,7 @@ do_safte_slot_insertions(int sg_fd, int do_hex, int do_raw, int verbose)
}
printf("Slot insertions:\n");
for (i = 0; i < safte_cfg.slots; i++) {
- slot_status = (rb_buff[i * 2] << 8) + rb_buff[i * 2];
+ slot_status = sg_get_unaligned_be16(rb_buff + (i * 2));
printf("\tSlot %d: %d insertions", i, slot_status);
}
free(rb_buff);
@@ -362,8 +362,8 @@ do_safte_slot_status(int sg_fd, int do_hex, int do_raw, int verbose)
rb_buff = (unsigned char *)malloc(rb_len);
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=4 "
- "to read device slot status\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=4 to read "
+ "device slot status\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 4, 0,
rb_buff, rb_len, 0, verbose);
if (res && res != SG_LIB_CAT_RECOVERED) {
@@ -411,8 +411,8 @@ do_safte_global_flags(int sg_fd, int do_hex, int do_raw, int verbose)
rb_buff = (unsigned char *)malloc(rb_len);
if (verbose > 1)
- fprintf(stderr, "Use READ BUFFER,mode=vendor_specific,buff_id=5 "
- "to read global flags\n");
+ pr2serr("Use READ BUFFER,mode=vendor_specific,buff_id=5 to read "
+ "global flags\n");
res = sg_ll_read_buffer(sg_fd, RWB_MODE_VENDOR, 5, 0,
rb_buff, rb_len, 0, verbose);
if (res ) {
@@ -467,8 +467,7 @@ do_safte_global_flags(int sg_fd, int do_hex, int do_raw, int verbose)
static
void usage()
{
- fprintf(stderr,
- "Usage: sg_safte [--config] [--devstatus] [--encstatus] "
+ pr2serr("Usage: sg_safte [--config] [--devstatus] [--encstatus] "
"[--flags] [--help]\n"
" [--hex] [--insertions] [--raw] [--usage] "
"[--verbose]\n"
@@ -570,10 +569,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
exit(0);
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -585,15 +584,14 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -623,8 +621,8 @@ main(int argc, char * argv[])
else
printf(" Peripheral device type: 0x%x\n", peri_type);
} else {
- fprintf(stderr, "sg_safte: %s doesn't respond to a SCSI "
- "INQUIRY\n", device_name);
+ pr2serr("sg_safte: %s doesn't respond to a SCSI INQUIRY\n",
+ device_name);
return SG_LIB_CAT_OTHER;
}
}
@@ -721,13 +719,13 @@ err_out:
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "%s failed: %s\n", op_name, b);
+ pr2serr("%s failed: %s\n", op_name, b);
break;
}
ret = res;
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c
index 56a64e3e..bb9e866a 100644
--- a/src/sg_sanitize.c
+++ b/src/sg_sanitize.c
@@ -26,8 +26,9 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.99 20151207";
+static const char * version_str = "1.00 20151219";
/* Not all environments support the Unix sleep() */
#if defined(MSC_VER) || defined(__MINGW32__)
@@ -103,12 +104,11 @@ struct opts_t {
};
-
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_sanitize [--ause] [--block] [--count=OC] [--crypto] [--early]\n"
+ pr2serr("Usage: sg_sanitize [--ause] [--block] [--count=OC] [--crypto] "
+ "[--early]\n"
" [--fail] [--help] [--invert] [--ipl=LEN] "
"[--overwrite]\n"
" [--pattern=PF] [--quick] [--test=TE] "
@@ -194,18 +194,18 @@ do_sanitize(int sg_fd, const struct opts_t * op, const void * param_lstp,
sg_put_unaligned_be16((uint16_t)param_lst_len, sanCmdBlk + 7);
if (op->verbose > 1) {
- fprintf(stderr, " Sanitize cmd: ");
+ pr2serr(" Sanitize cmd: ");
for (k = 0; k < SANITIZE_OP_LEN; ++k)
- fprintf(stderr, "%02x ", sanCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", sanCmdBlk[k]);
+ pr2serr("\n");
}
if ((op->verbose > 2) && (param_lst_len > 0)) {
- fprintf(stderr, " Parameter list contents:\n");
+ pr2serr(" Parameter list contents:\n");
dStrHexErr((const char *)param_lstp, param_lst_len, 1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Sanitize: out of memory\n");
+ pr2serr("Sanitize: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, sanCmdBlk, sizeof(sanCmdBlk));
@@ -231,7 +231,7 @@ do_sanitize(int sg_fd, const struct opts_t * op, const void * param_lstp,
slen = get_scsi_pt_sense_len(ptvp);
valid = sg_get_sense_info_fld(sense_b, slen, &ull);
if (valid)
- fprintf(stderr, "Medium or hardware error starting at "
+ pr2serr("Medium or hardware error starting at "
"lba=%" PRIu64 " [0x%" PRIx64 "]\n", ull, ull);
}
ret = sense_cat;
@@ -340,20 +340,19 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
if (b[5] & 1)
printf(" << supports protection information>>\n");
} else {
- fprintf(stderr, "Short INQUIRY response: %d bytes, expect at least "
- "36\n", n);
+ pr2serr("Short INQUIRY response: %d bytes, expect at least 36\n", n);
return SG_LIB_CAT_OTHER;
}
res = sg_ll_inquiry(fd, 0, 1 /* evpd */, VPD_SUPPORTED_VPDS, b,
SAFE_STD_INQ_RESP_LEN, 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS gave res=%d\n", res);
+ pr2serr("VPD_SUPPORTED_VPDS gave res=%d\n", res);
return 0;
}
if (VPD_SUPPORTED_VPDS != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS corrupted\n");
+ pr2serr("VPD_SUPPORTED_VPDS corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -363,7 +362,7 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
if (VPD_UNIT_SERIAL_NUM == b[4 + k]) {
if (has_di) {
if (verbose)
- fprintf(stderr, "VPD_SUPPORTED_VPDS dis-ordered\n");
+ pr2serr("VPD_SUPPORTED_VPDS dis-ordered\n");
return 0;
}
++has_sn;
@@ -377,12 +376,12 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
sizeof(b), 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_UNIT_SERIAL_NUM gave res=%d\n", res);
+ pr2serr("VPD_UNIT_SERIAL_NUM gave res=%d\n", res);
return 0;
}
if (VPD_UNIT_SERIAL_NUM != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_UNIT_SERIAL_NUM corrupted\n");
+ pr2serr("VPD_UNIT_SERIAL_NUM corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -395,12 +394,12 @@ print_dev_id(int fd, unsigned char * sinq_resp, int max_rlen, int verbose)
sizeof(b), 1, verb);
if (res) {
if (verbose)
- fprintf(stderr, "VPD_DEVICE_ID gave res=%d\n", res);
+ pr2serr("VPD_DEVICE_ID gave res=%d\n", res);
return 0;
}
if (VPD_DEVICE_ID != b[1]) {
if (verbose)
- fprintf(stderr, "VPD_DEVICE_ID corrupted\n");
+ pr2serr("VPD_DEVICE_ID corrupted\n");
return 0;
}
n = sg_get_unaligned_be16(b + 2);
@@ -452,8 +451,7 @@ main(int argc, char * argv[])
case 'c':
op->count = sg_get_num(optarg);
if ((op->count < 1) || (op->count > 31)) {
- fprintf(stderr, "bad argument to '--count', expect 1 to "
- "31\n");
+ pr2serr("bad argument to '--count', expect 1 to 31\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -476,8 +474,7 @@ main(int argc, char * argv[])
case 'i':
op->ipl = sg_get_num(optarg);
if ((op->ipl < 1) || (op->ipl > 65535)) {
- fprintf(stderr, "bad argument to '--ipl', expect 1 to "
- "65535\n");
+ pr2serr("bad argument to '--ipl', expect 1 to 65535\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -496,7 +493,7 @@ main(int argc, char * argv[])
case 'T':
op->test = sg_get_num(optarg);
if ((op->test < 0) || (op->test > 3)) {
- fprintf(stderr, "bad argument to '--test', expect 0 to 3\n");
+ pr2serr("bad argument to '--test', expect 0 to 3\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -504,7 +501,7 @@ main(int argc, char * argv[])
++op->verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'w':
++op->wait;
@@ -516,7 +513,7 @@ main(int argc, char * argv[])
++op->znr;
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -528,58 +525,57 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
vb = op->verbose;
n = !!op->block + !!op->crypto + !!op->fail + !!op->overwrite;
if (1 != n) {
- fprintf(stderr, "one and only one of '--block', '--crypto', "
- "'--fail' or '--overwrite' please\n");
+ pr2serr("one and only one of '--block', '--crypto', '--fail' or "
+ "'--overwrite' please\n");
return SG_LIB_SYNTAX_ERROR;
}
if (op->overwrite) {
if (op->zero) {
if (op->pattern_fn) {
- fprintf(stderr, "confused: both '--pattern=PF' and '--zero' "
+ pr2serr("confused: both '--pattern=PF' and '--zero' "
"options\n");
return SG_LIB_SYNTAX_ERROR;
}
op->ipl = 4;
} else {
if (NULL == op->pattern_fn) {
- fprintf(stderr, "'--overwrite' requires '--pattern=PF' "
- "or '--zero' option\n");
+ pr2serr("'--overwrite' requires '--pattern=PF' or '--zero' "
+ "option\n");
return SG_LIB_SYNTAX_ERROR;
}
got_stdin = (0 == strcmp(op->pattern_fn, "-")) ? 1 : 0;
if (! got_stdin) {
memset(&a_stat, 0, sizeof(a_stat));
if (stat(op->pattern_fn, &a_stat) < 0) {
- fprintf(stderr, "pattern file: unable to stat(%s): %s\n",
+ pr2serr("pattern file: unable to stat(%s): %s\n",
op->pattern_fn, safe_strerror(errno));
return SG_LIB_FILE_ERROR;
}
if (op->ipl <= 0) {
op->ipl = (int)a_stat.st_size;
if (op->ipl > MAX_XFER_LEN) {
- fprintf(stderr, "pattern file length exceeds 65535 "
- "bytes, need '--ipl=LEN' option\n");
+ pr2serr("pattern file length exceeds 65535 bytes, "
+ "need '--ipl=LEN' option\n");
return SG_LIB_FILE_ERROR;
}
}
}
if (op->ipl < 1) {
- fprintf(stderr, "'--overwrite' requires '--ipl=LEN' "
- "option if can't get PF length\n");
+ pr2serr("'--overwrite' requires '--ipl=LEN' option if can't "
+ "get PF length\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -587,7 +583,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, vb);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
+ pr2serr(ME "open error: %s: %s\n", device_name,
safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -600,8 +596,8 @@ main(int argc, char * argv[])
param_lst_len = op->ipl + 4;
wBuff = (unsigned char*)calloc(op->ipl + 4, 1);
if (NULL == wBuff) {
- fprintf(stderr, "unable to allocate %d bytes of memory with "
- "calloc()\n", op->ipl + 4);
+ pr2serr("unable to allocate %d bytes of memory with calloc()\n",
+ op->ipl + 4);
ret = SG_LIB_SYNTAX_ERROR;
goto err_out;
}
@@ -636,9 +632,9 @@ main(int argc, char * argv[])
goto err_out;
}
if (res < op->ipl) {
- fprintf(stderr, "tried to read %d bytes from %s, got %d "
- "bytes\n", op->ipl, op->pattern_fn, res);
- fprintf(stderr, " so pad with 0x0 bytes and continue\n");
+ pr2serr("tried to read %d bytes from %s, got %d bytes\n",
+ op->ipl, op->pattern_fn, res);
+ pr2serr(" so pad with 0x0 bytes and continue\n");
}
if (! got_stdin)
close(infd);
@@ -669,7 +665,7 @@ main(int argc, char * argv[])
ret = do_sanitize(sg_fd, op, wBuff, param_lst_len);
if (ret) {
sg_get_category_sense_str(ret, sizeof(b), b, vb);
- fprintf(stderr, "Sanitize failed: %s\n", b);
+ pr2serr("Sanitize failed: %s\n", b);
}
if ((0 == ret) && (0 == op->early) && (0 == op->wait)) {
@@ -681,28 +677,28 @@ main(int argc, char * argv[])
if (res) {
ret = res;
if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "Request Sense command not supported\n");
+ pr2serr("Request Sense command not supported\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res) {
- fprintf(stderr, "bad field in Request Sense cdb\n");
+ pr2serr("bad field in Request Sense cdb\n");
if (1 == op->desc) {
- fprintf(stderr, "Descriptor type sense may not be "
- "supported, try again with fixed type\n");
+ pr2serr("Descriptor type sense may not be supported, "
+ "try again with fixed type\n");
op->desc = 0;
continue;
}
} else {
sg_get_category_sense_str(res, sizeof(b), b, vb);
- fprintf(stderr, "Request Sense: %s\n", b);
+ pr2serr("Request Sense: %s\n", b);
if (0 == vb)
- fprintf(stderr, " try the '-v' option for "
- "more information\n");
+ pr2serr(" try the '-v' option for more "
+ "information\n");
}
break;
}
/* "Additional sense length" same in descriptor and fixed */
resp_len = requestSenseBuff[7] + 8;
if (vb > 2) {
- fprintf(stderr, "Parameter data in hex\n");
+ pr2serr("Parameter data in hex\n");
dStrHexErr((const char *)requestSenseBuff, resp_len, 1);
}
progress = -1;
@@ -711,8 +707,8 @@ main(int argc, char * argv[])
if (progress < 0) {
ret = res;
if (vb > 1)
- fprintf(stderr, "No progress indication found, "
- "iteration %d\n", k + 1);
+ pr2serr("No progress indication found, iteration %d\n",
+ k + 1);
/* N.B. exits first time there isn't a progress indication */
break;
} else
@@ -726,7 +722,7 @@ err_out:
free(wBuff);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_sat_identify.c b/src/sg_sat_identify.c
index 9fa2a7fa..338c894a 100644
--- a/src/sg_sat_identify.c
+++ b/src/sg_sat_identify.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2014 Douglas Gilbert.
+ * Copyright (c) 2006-2015 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.
@@ -20,6 +20,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
/* This program uses a ATA PASS-THROUGH SCSI command to package an
* ATA IDENTIFY (PACKAGE) DEVICE command. It is based on the SCSI to
@@ -64,30 +65,29 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_sat_identify [--ck_cond] [--extend] [--help] [--hex] "
- "[--ident]\n"
- " [--len=16|12] [--packet] [--raw] "
- "[--readonly]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --ck_cond|-c sets ck_cond bit in cdb (def: 0)\n"
- " --extend|-e sets extend bit in cdb (def: 0)\n"
- " --help|-h print out usage message then exit\n"
- " --hex|-H output response in hex\n"
- " --ident|-i output WWN prefixed by 0x, if not available "
- "output\n"
- " 0x0000000000000000\n"
- " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
- "(default: 16)\n"
- " --packet|-p do IDENTIFY PACKET DEVICE (def: IDENTIFY "
- "DEVICE) command\n"
- " --raw|-r output response in binary to stdout\n"
- " --readonly|-R open DEVICE read-only (def: read-write)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a ATA IDENTIFY (PACKET) DEVICE command via a SAT "
- "layer\n");
+ pr2serr("Usage: sg_sat_identify [--ck_cond] [--extend] [--help] [--hex] "
+ "[--ident]\n"
+ " [--len=16|12] [--packet] [--raw] "
+ "[--readonly]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --ck_cond|-c sets ck_cond bit in cdb (def: 0)\n"
+ " --extend|-e sets extend bit in cdb (def: 0)\n"
+ " --help|-h print out usage message then exit\n"
+ " --hex|-H output response in hex\n"
+ " --ident|-i output WWN prefixed by 0x, if not "
+ "available output\n"
+ " 0x0000000000000000\n"
+ " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
+ "(default: 16)\n"
+ " --packet|-p do IDENTIFY PACKET DEVICE (def: IDENTIFY "
+ "DEVICE) command\n"
+ " --raw|-r output response in binary to stdout\n"
+ " --readonly|-R open DEVICE read-only (def: read-write)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a ATA IDENTIFY (PACKET) DEVICE command via a SAT "
+ "layer\n");
}
static void dStrRaw(const char* str, int len)
@@ -159,7 +159,7 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
if (0 == res) {
ok = 1;
if (verbose > 2)
- fprintf(stderr, "command completed with SCSI GOOD status\n");
+ pr2serr("command completed with SCSI GOOD status\n");
} else if ((res > 0) && (res & SAM_STAT_CHECK_CONDITION)) {
if (verbose > 1)
sg_print_sense("ATA pass through", sense_buffer, sb_sz,
@@ -170,13 +170,13 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
if ((0x20 == ssh.asc) && (0x0 == ssh.ascq)) {
ret = SG_LIB_CAT_INVALID_OP;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d) not "
- "supported\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d) not supported\n",
+ cdb_len);
} else {
ret = SG_LIB_CAT_ILLEGAL_REQ;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), bad "
- "field in cdb\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), bad field in cdb\n",
+ cdb_len);
}
return ret;
case SPC_SK_NO_SENSE:
@@ -186,8 +186,8 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
if (0x72 == ssh.response_code) {
if (SAT_ATA_RETURN_DESC != ata_return_desc[0]) {
if (verbose)
- fprintf(stderr, "did not find ATA Return "
- "(sense) Descriptor\n");
+ pr2serr("did not find ATA Return (sense) "
+ "Descriptor\n");
return SG_LIB_CAT_RECOVERED;
}
got_ard = 1;
@@ -197,9 +197,9 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
break;
} else {
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), "
- "unexpected response_code=0x%x\n",
- ssh.response_code, cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), unexpected "
+ "response_code=0x%x\n", ssh.response_code,
+ cdb_len);
return SG_LIB_CAT_RECOVERED;
}
} else if (SPC_SK_RECOVERED_ERROR == ssh.sense_key)
@@ -211,72 +211,70 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
}
case SPC_SK_UNIT_ATTENTION:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), Unit Attention "
- "detected\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), Unit Attention detected\n",
+ cdb_len);
return SG_LIB_CAT_UNIT_ATTENTION;
case SPC_SK_NOT_READY:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), device not "
- "ready\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), device not ready\n",
+ cdb_len);
return SG_LIB_CAT_NOT_READY;
case SPC_SK_MEDIUM_ERROR:
case SPC_SK_HARDWARE_ERROR:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), medium or "
- "hardware error\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), medium or hardware "
+ "error\n", cdb_len);
return SG_LIB_CAT_MEDIUM_HARD;
case SPC_SK_ABORTED_COMMAND:
if (0x10 == ssh.asc) {
- fprintf(stderr, "Aborted command: protection "
- "information\n");
+ pr2serr("Aborted command: protection information\n");
return SG_LIB_CAT_PROTECTION;
} else {
- fprintf(stderr, "Aborted command: try again with%s '-p' "
- "option\n", (do_packet ? "out" : ""));
+ pr2serr("Aborted command: try again with%s '-p' option\n",
+ (do_packet ? "out" : ""));
return SG_LIB_CAT_ABORTED_COMMAND;
}
case SPC_SK_DATA_PROTECT:
- fprintf(stderr, "ATA PASS-THROUGH (%d): data protect, read "
- "only media?\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d): data protect, read only "
+ "media?\n", cdb_len);
return SG_LIB_CAT_DATA_PROTECT;
default:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), some sense "
- "data, use '-v' for more information\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), some sense data, use "
+ "'-v' for more information\n", cdb_len);
return SG_LIB_CAT_SENSE;
}
} else {
- fprintf(stderr, "CHECK CONDITION without response code ??\n");
+ pr2serr("CHECK CONDITION without response code ??\n");
return SG_LIB_CAT_SENSE;
}
if (0x72 != (sense_buffer[0] & 0x7f)) {
- fprintf(stderr, "expected descriptor sense format, response "
- "code=0x%x\n", sense_buffer[0]);
+ pr2serr("expected descriptor sense format, response code=0x%x\n",
+ sense_buffer[0]);
return SG_LIB_CAT_MALFORMED;
}
} else if (res > 0) {
if (SAM_STAT_RESERVATION_CONFLICT == res) {
- fprintf(stderr, "SCSI status: RESERVATION CONFLICT\n");
+ pr2serr("SCSI status: RESERVATION CONFLICT\n");
return SG_LIB_CAT_RES_CONFLICT;
} else {
- fprintf(stderr, "Unexpected SCSI status=0x%x\n", res);
+ pr2serr("Unexpected SCSI status=0x%x\n", res);
return SG_LIB_CAT_MALFORMED;
}
} else {
- fprintf(stderr, "ATA pass through (%d) failed\n", cdb_len);
+ pr2serr("ATA pass through (%d) failed\n", cdb_len);
if (verbose < 2)
- fprintf(stderr, " try adding '-v' for more information\n");
+ pr2serr(" try adding '-v' for more information\n");
return -1;
}
if ((SAT_ATA_RETURN_DESC == ata_return_desc[0]) && (0 == got_ard))
- fprintf(stderr, "Seem to have got ATA Result Descriptor but "
- "it was not indicated\n");
+ pr2serr("Seem to have got ATA Result Descriptor but it was not "
+ "indicated\n");
if (got_ard) {
if (ata_return_desc[3] & 0x4) {
- fprintf(stderr, "error indication in returned FIS: aborted "
- "command\n");
- fprintf(stderr, " try again with%s '-p' option\n",
+ pr2serr("error indication in returned FIS: aborted command\n");
+ pr2serr(" try again with%s '-p' option\n",
(do_packet ? "out" : ""));
return SG_LIB_CAT_ABORTED_COMMAND;
}
@@ -284,9 +282,8 @@ static int do_identify_dev(int sg_fd, int do_packet, int cdb_len,
}
if (got_fixsense) {
if (0x4 & sense_buffer[3]) { /* Error is MSB of Info field */
- fprintf(stderr, "error indication in returned FIS: aborted "
- "command\n");
- fprintf(stderr, " try again with%s '-p' option\n",
+ pr2serr("error indication in returned FIS: aborted command\n");
+ pr2serr(" try again with%s '-p' option\n",
(do_packet ? "out" : ""));
return SG_LIB_CAT_ABORTED_COMMAND;
}
@@ -369,7 +366,7 @@ int main(int argc, char * argv[])
case 'l':
cdb_len = sg_get_num(optarg);
if (! ((cdb_len == 12) || (cdb_len == 16))) {
- fprintf(stderr, "argument to '--len' should be 12 or 16\n");
+ pr2serr("argument to '--len' should be 12 or 16\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -386,10 +383,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -401,15 +398,14 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return 1;
}
@@ -421,8 +417,8 @@ int main(int argc, char * argv[])
}
if ((sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose)) < 0) {
- fprintf(stderr, "error opening file: %s: %s\n",
- device_name, safe_strerror(-sg_fd));
+ pr2serr("error opening file: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -431,7 +427,7 @@ int main(int argc, char * argv[])
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_sat_phy_event.c b/src/sg_sat_phy_event.c
index e465c96d..f294a72a 100644
--- a/src/sg_sat_phy_event.c
+++ b/src/sg_sat_phy_event.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2014 Douglas Gilbert.
+ * Copyright (c) 2006-2015 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.
@@ -20,8 +20,9 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.05 20141030";
+static const char * version_str = "1.06 20151219";
/* This program uses a ATA PASS-THROUGH SCSI command. This usage is
* defined in the SCSI to ATA Translation (SAT) drafts and standards.
@@ -100,28 +101,27 @@ static struct phy_event_t phy_event_arr[] = { /* SATA 2.5 section 13.7.2 */
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_sat_phy_event [--ck_cond] [--extend] [--help] [--hex] "
- "[--ignore]\n"
- " [--len=16|12] [--raw] [--reset] "
- "[--verbose]\n"
- " [--version] DEVICE\n"
- " where:\n"
- " --ck_cond|-c sets ck_cond bit in cdb (def: 0)\n"
- " --extend|-e sets extend bit in cdb (def: 0)\n"
- " --help|-h print this usage message then exit\n"
- " --hex|-H output response in hex bytes, use twice for\n"
- " hex words\n"
- " --ignore|-i ignore identifier names, output id value "
- "instead\n"
- " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
- "(default: 16)\n"
- " --raw|-r output response in binary to stdout\n"
- " --reset|-R reset counters (after read)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string then exit\n\n"
- "Sends an ATA READ LOG EXT command via a SAT pass through to "
- "fetch\nlog page 11h which contains SATA phy event counters\n");
+ pr2serr("Usage: sg_sat_phy_event [--ck_cond] [--extend] [--help] [--hex] "
+ "[--ignore]\n"
+ " [--len=16|12] [--raw] [--reset] "
+ "[--verbose]\n"
+ " [--version] DEVICE\n"
+ " where:\n"
+ " --ck_cond|-c sets ck_cond bit in cdb (def: 0)\n"
+ " --extend|-e sets extend bit in cdb (def: 0)\n"
+ " --help|-h print this usage message then exit\n"
+ " --hex|-H output response in hex bytes, use twice for\n"
+ " hex words\n"
+ " --ignore|-i ignore identifier names, output id value "
+ "instead\n"
+ " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
+ "(default: 16)\n"
+ " --raw|-r output response in binary to stdout\n"
+ " --reset|-R reset counters (after read)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string then exit\n\n"
+ "Sends an ATA READ LOG EXT command via a SAT pass through to "
+ "fetch\nlog page 11h which contains SATA phy event counters\n");
}
static const char *
@@ -213,7 +213,7 @@ do_read_log_ext(int sg_fd, int log_addr, int page_in_log, int feature,
if (0 == res) {
ok = 1;
if (verbose > 2)
- fprintf(stderr, "command completed with SCSI GOOD status\n");
+ pr2serr("command completed with SCSI GOOD status\n");
} else if ((res > 0) && (res & SAM_STAT_CHECK_CONDITION)) {
if (verbose > 1)
sg_print_sense("ATA pass through", sense_buffer, sb_sz,
@@ -224,13 +224,13 @@ do_read_log_ext(int sg_fd, int log_addr, int page_in_log, int feature,
if ((0x20 == ssh.asc) && (0x0 == ssh.ascq)) {
ret = SG_LIB_CAT_INVALID_OP;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d) not "
- "supported\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d) not supported\n",
+ cdb_len);
} else {
ret = SG_LIB_CAT_ILLEGAL_REQ;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), bad "
- "field in cdb\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), bad field in cdb\n",
+ cdb_len);
}
return ret;
case SPC_SK_NO_SENSE:
@@ -239,8 +239,8 @@ do_read_log_ext(int sg_fd, int log_addr, int page_in_log, int feature,
(ASCQ_ATA_PT_INFO_AVAILABLE == ssh.ascq)) {
if (SAT_ATA_RETURN_DESC != ata_return_desc[0]) {
if (verbose)
- fprintf(stderr, "did not find ATA Return "
- "(sense) Descriptor\n");
+ pr2serr("did not find ATA Return (sense) "
+ "Descriptor\n");
return SG_LIB_CAT_RECOVERED;
}
got_ard = 1;
@@ -254,70 +254,68 @@ do_read_log_ext(int sg_fd, int log_addr, int page_in_log, int feature,
}
case SPC_SK_UNIT_ATTENTION:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), Unit Attention "
- "detected\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), Unit Attention detected\n",
+ cdb_len);
return SG_LIB_CAT_UNIT_ATTENTION;
case SPC_SK_NOT_READY:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), device not "
- "ready\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), device not ready\n",
+ cdb_len);
return SG_LIB_CAT_NOT_READY;
case SPC_SK_MEDIUM_ERROR:
case SPC_SK_HARDWARE_ERROR:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), medium or "
- "hardware error\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), medium or hardware "
+ "error\n", cdb_len);
return SG_LIB_CAT_MEDIUM_HARD;
case SPC_SK_ABORTED_COMMAND:
if (0x10 == ssh.asc) {
- fprintf(stderr, "Aborted command: protection "
- "information\n");
+ pr2serr("Aborted command: protection information\n");
return SG_LIB_CAT_PROTECTION;
} else {
- fprintf(stderr, "Aborted command\n");
+ pr2serr("Aborted command\n");
return SG_LIB_CAT_ABORTED_COMMAND;
}
case SPC_SK_DATA_PROTECT:
- fprintf(stderr, "ATA PASS-THROUGH (%d): data protect, read "
- "only media?\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d): data protect, read only "
+ "media?\n", cdb_len);
return SG_LIB_CAT_DATA_PROTECT;
default:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), some sense "
- "data, use '-v' for more information\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), some sense data, use "
+ "'-v' for more information\n", cdb_len);
return SG_LIB_CAT_SENSE;
}
} else {
- fprintf(stderr, "CHECK CONDITION without response code ??\n");
+ pr2serr("CHECK CONDITION without response code ??\n");
return SG_LIB_CAT_SENSE;
}
if (0x72 != (sense_buffer[0] & 0x7f)) {
- fprintf(stderr, "expected descriptor sense format, response "
- "code=0x%x\n", sense_buffer[0]);
+ pr2serr("expected descriptor sense format, response code=0x%x\n",
+ sense_buffer[0]);
return SG_LIB_CAT_MALFORMED;
}
} else if (res > 0) {
if (SAM_STAT_RESERVATION_CONFLICT == res) {
- fprintf(stderr, "SCSI status: RESERVATION CONFLICT\n");
+ pr2serr("SCSI status: RESERVATION CONFLICT\n");
return SG_LIB_CAT_RES_CONFLICT;
} else {
- fprintf(stderr, "Unexpected SCSI status=0x%x\n", res);
+ pr2serr("Unexpected SCSI status=0x%x\n", res);
return SG_LIB_CAT_MALFORMED;
}
} else {
- fprintf(stderr, "ATA pass through (%d) failed\n", cdb_len);
+ pr2serr("ATA pass through (%d) failed\n", cdb_len);
if (verbose < 2)
- fprintf(stderr, " try adding '-v' for more information\n");
+ pr2serr(" try adding '-v' for more information\n");
return -1;
}
if ((SAT_ATA_RETURN_DESC == ata_return_desc[0]) && (0 == got_ard))
- fprintf(stderr, "Seem to have got ATA Result Descriptor but "
- "it was not indicated\n");
+ pr2serr("Seem to have got ATA Result Descriptor but it was not "
+ "indicated\n");
if (got_ard) {
if (ata_return_desc[3] & 0x4) {
- fprintf(stderr, "error indication in returned FIS: aborted "
- "command\n");
+ pr2serr("error indication in returned FIS: aborted command\n");
return SG_LIB_CAT_ABORTED_COMMAND;
}
ok = 1;
@@ -383,7 +381,7 @@ int main(int argc, char * argv[])
case 'l':
cdb_len = sg_get_num(optarg);
if (! ((cdb_len == 12) || (cdb_len == 16))) {
- fprintf(stderr, "argument to '--len' should be 12 or 16\n");
+ pr2serr("argument to '--len' should be 12 or 16\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -397,10 +395,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
exit(0);
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -412,14 +410,13 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (0 == device_name) {
- fprintf(stderr, "no DEVICE name detected\n");
+ pr2serr("no DEVICE name detected\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -470,7 +467,7 @@ int main(int argc, char * argv[])
res = close(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_sat_read_gplog.c b/src/sg_sat_read_gplog.c
index 03a4e39c..6c992aa8 100644
--- a/src/sg_sat_read_gplog.c
+++ b/src/sg_sat_read_gplog.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <getopt.h>
@@ -21,6 +20,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* This program uses a ATA PASS-THROUGH SCSI command. This usage is
* defined in the SCSI to ATA Translation (SAT) drafts and standards.
@@ -79,26 +79,6 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
diff --git a/src/sg_sat_set_features.c b/src/sg_sat_set_features.c
index fd4011dc..1a969372 100644
--- a/src/sg_sat_set_features.c
+++ b/src/sg_sat_set_features.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2014 Douglas Gilbert.
+ * Copyright (c) 2006-2015 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.
@@ -19,6 +19,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
/* This program uses a ATA PASS-THROUGH SCSI command. This usage is
* defined in the SCSI to ATA Translation (SAT) drafts and standards.
@@ -46,7 +47,7 @@
#define DEF_TIMEOUT 20
-static const char * version_str = "1.10 20141106";
+static const char * version_str = "1.11 20151219";
static struct option long_options[] = {
{"count", required_argument, 0, 'c'},
@@ -66,39 +67,38 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_sat_set_features [--count=CO] [--ck_cond] [--extended] "
- "[--feature=FEA]\n"
- " [--help] [--lba=LBA] [--len=16|12] "
- "[--readonly]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --count=CO | -c CO count field contents (def: 0)\n"
- " --ck_cond | -C set ck_cond field in pass-through "
- "(def: 0)\n"
- " --extended | -e enable extended lba values\n"
- " --feature=FEA|-f FEA feature field contents\n"
- " (def: 0 (which is reserved))\n"
- " --help | -h output this usage message\n"
- " --lba=LBA | -L LBA LBA field contents (def: 0)\n"
- " meaning depends on sub-command "
- "(feature)\n"
- " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
- "(def: 16)\n"
- " --verbose | -v increase verbosity\n"
- " --readonly | -r open DEVICE read-only (def: "
- "read-write)\n"
- " recommended if DEVICE is ATA disk\n"
- " --version | -V print version string and exit\n\n"
- "Sends an ATA SET FEATURES command via a SAT pass through.\n"
- "Primary feature code is placed in '--feature=FEA' with "
- "'--count=CO' and\n"
- "'--lba=LBA' being auxiliaries for some features. The arguments "
- "CO, FEA\n"
- "and LBA are decimal unless prefixed by '0x' or have a trailing "
- "'h'.\n"
- "Example enabling write cache: 'sg_sat_set_feature --feature=2 "
- "/dev/sdc'\n");
+ pr2serr("Usage: sg_sat_set_features [--count=CO] [--ck_cond] [--extended] "
+ "[--feature=FEA]\n"
+ " [--help] [--lba=LBA] [--len=16|12] "
+ "[--readonly]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --count=CO | -c CO count field contents (def: 0)\n"
+ " --ck_cond | -C set ck_cond field in pass-through "
+ "(def: 0)\n"
+ " --extended | -e enable extended lba values\n"
+ " --feature=FEA|-f FEA feature field contents\n"
+ " (def: 0 (which is reserved))\n"
+ " --help | -h output this usage message\n"
+ " --lba=LBA | -L LBA LBA field contents (def: 0)\n"
+ " meaning depends on sub-command "
+ "(feature)\n"
+ " --len=16|12 | -l 16|12 cdb length: 16 or 12 bytes "
+ "(def: 16)\n"
+ " --verbose | -v increase verbosity\n"
+ " --readonly | -r open DEVICE read-only (def: "
+ "read-write)\n"
+ " recommended if DEVICE is ATA disk\n"
+ " --version | -V print version string and exit\n\n"
+ "Sends an ATA SET FEATURES command via a SAT pass through.\n"
+ "Primary feature code is placed in '--feature=FEA' with "
+ "'--count=CO' and\n"
+ "'--lba=LBA' being auxiliaries for some features. The arguments "
+ "CO, FEA\n"
+ "and LBA are decimal unless prefixed by '0x' or have a trailing "
+ "'h'.\n"
+ "Example enabling write cache: 'sg_sat_set_feature --feature=2 "
+ "/dev/sdc'\n");
}
static int
@@ -165,7 +165,7 @@ do_set_features(int sg_fd, int feature, int count, uint64_t lba,
}
if (0 == res) {
if (verbose > 2)
- fprintf(stderr, "command completed with SCSI GOOD status\n");
+ pr2serr("command completed with SCSI GOOD status\n");
} else if ((res > 0) && (res & SAM_STAT_CHECK_CONDITION)) {
if (verbose > 1)
sg_print_sense("ATA pass through", sense_buffer, sb_sz,
@@ -176,13 +176,13 @@ do_set_features(int sg_fd, int feature, int count, uint64_t lba,
if ((0x20 == ssh.asc) && (0x0 == ssh.ascq)) {
ret = SG_LIB_CAT_INVALID_OP;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d) not "
- "supported\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d) not supported\n",
+ cdb_len);
} else {
ret = SG_LIB_CAT_ILLEGAL_REQ;
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), bad "
- "field in cdb\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), bad field in cdb\n",
+ cdb_len);
}
return ret;
case SPC_SK_NO_SENSE:
@@ -191,8 +191,8 @@ do_set_features(int sg_fd, int feature, int count, uint64_t lba,
(ASCQ_ATA_PT_INFO_AVAILABLE == ssh.ascq)) {
if (SAT_ATA_RETURN_DESC != ata_return_desc[0]) {
if (verbose)
- fprintf(stderr, "did not find ATA Return "
- "(sense) Descriptor\n");
+ pr2serr("did not find ATA Return (sense) "
+ "Descriptor\n");
return SG_LIB_CAT_RECOVERED;
}
got_ard = 1;
@@ -206,70 +206,68 @@ do_set_features(int sg_fd, int feature, int count, uint64_t lba,
}
case SPC_SK_UNIT_ATTENTION:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), Unit Attention "
- "detected\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), Unit Attention detected\n",
+ cdb_len);
return SG_LIB_CAT_UNIT_ATTENTION;
case SPC_SK_NOT_READY:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), device not "
- "ready\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), device not ready\n",
+ cdb_len);
return SG_LIB_CAT_NOT_READY;
case SPC_SK_MEDIUM_ERROR:
case SPC_SK_HARDWARE_ERROR:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), medium or "
- "hardware error\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), medium or hardware "
+ "error\n", cdb_len);
return SG_LIB_CAT_MEDIUM_HARD;
case SPC_SK_ABORTED_COMMAND:
if (0x10 == ssh.asc) {
- fprintf(stderr, "Aborted command: protection "
- "information\n");
+ pr2serr("Aborted command: protection information\n");
return SG_LIB_CAT_PROTECTION;
} else {
- fprintf(stderr, "Aborted command\n");
+ pr2serr("Aborted command\n");
return SG_LIB_CAT_ABORTED_COMMAND;
}
case SPC_SK_DATA_PROTECT:
- fprintf(stderr, "ATA PASS-THROUGH (%d): data protect, read "
- "only media?\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d): data protect, read only "
+ "media?\n", cdb_len);
return SG_LIB_CAT_DATA_PROTECT;
default:
if (verbose < 2)
- fprintf(stderr, "ATA PASS-THROUGH (%d), some sense "
- "data, use '-v' for more information\n", cdb_len);
+ pr2serr("ATA PASS-THROUGH (%d), some sense data, use "
+ "'-v' for more information\n", cdb_len);
return SG_LIB_CAT_SENSE;
}
} else {
- fprintf(stderr, "CHECK CONDITION without response code ??\n");
+ pr2serr("CHECK CONDITION without response code ??\n");
return SG_LIB_CAT_SENSE;
}
if (0x72 != (sense_buffer[0] & 0x7f)) {
- fprintf(stderr, "expected descriptor sense format, response "
- "code=0x%x\n", sense_buffer[0]);
+ pr2serr("expected descriptor sense format, response code=0x%x\n",
+ sense_buffer[0]);
return SG_LIB_CAT_MALFORMED;
}
} else if (res > 0) {
if (SAM_STAT_RESERVATION_CONFLICT == res) {
- fprintf(stderr, "SCSI status: RESERVATION CONFLICT\n");
+ pr2serr("SCSI status: RESERVATION CONFLICT\n");
return SG_LIB_CAT_RES_CONFLICT;
} else {
- fprintf(stderr, "Unexpected SCSI status=0x%x\n", res);
+ pr2serr("Unexpected SCSI status=0x%x\n", res);
return SG_LIB_CAT_MALFORMED;
}
} else {
- fprintf(stderr, "ATA pass through (%d) failed\n", cdb_len);
+ pr2serr("ATA pass through (%d) failed\n", cdb_len);
if (verbose < 2)
- fprintf(stderr, " try adding '-v' for more information\n");
+ pr2serr(" try adding '-v' for more information\n");
return -1;
}
if ((SAT_ATA_RETURN_DESC == ata_return_desc[0]) && (0 == got_ard))
- fprintf(stderr, "Seem to have got ATA Result Descriptor but "
- "it was not indicated\n");
+ pr2serr("Seem to have got ATA Result Descriptor but it was not "
+ "indicated\n");
if (got_ard) {
if (ata_return_desc[3] & 0x4) {
- fprintf(stderr, "error indication in returned FIS: aborted "
- "command\n");
+ pr2serr("error indication in returned FIS: aborted command\n");
return SG_LIB_CAT_ABORTED_COMMAND;
}
}
@@ -303,7 +301,7 @@ main(int argc, char * argv[])
case 'c':
count = sg_get_num(optarg);
if ((count < 0) || (count > 255)) {
- fprintf(stderr, "bad argument for '--count'\n");
+ pr2serr("bad argument for '--count'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -316,7 +314,7 @@ main(int argc, char * argv[])
case 'f':
feature = sg_get_num(optarg);
if ((feature < 0) || (feature > 255)) {
- fprintf(stderr, "bad argument for '--feature'\n");
+ pr2serr("bad argument for '--feature'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -327,14 +325,14 @@ main(int argc, char * argv[])
case 'l':
cdb_len = sg_get_num(optarg);
if (! ((cdb_len == 12) || (cdb_len == 16))) {
- fprintf(stderr, "argument to '--len' should be 12 or 16\n");
+ pr2serr("argument to '--len' should be 12 or 16\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'L': /* up to 32 bits, allow for 48 bits (less -1) */
lba = sg_get_llnum(optarg);
if ((uint64_t)-1 == lba) {
- fprintf(stderr, "bad argument for '--lba'\n");
+ pr2serr("bad argument for '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (lba > 0xffffffff)
@@ -347,10 +345,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -362,15 +360,14 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return 1;
}
@@ -378,13 +375,12 @@ main(int argc, char * argv[])
if ((lba > 0xffffff) && (12 == cdb_len)) {
cdb_len = 16;
if (verbose)
- fprintf(stderr, "Since lba > 0xffffff, forcing cdb length to "
- "16\n");
+ pr2serr("Since lba > 0xffffff, forcing cdb length to 16\n");
}
if ((sg_fd = sg_cmds_open_device(device_name, rdonly, verbose)) < 0) {
- fprintf(stderr, "error opening file: %s: %s\n",
- device_name, safe_strerror(-sg_fd));
+ pr2serr("error opening file: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -393,7 +389,7 @@ main(int argc, char * argv[])
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_scan_linux.c b/src/sg_scan_linux.c
index 8e557a20..9c52737e 100644
--- a/src/sg_scan_linux.c
+++ b/src/sg_scan_linux.c
@@ -1,5 +1,5 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 1999 - 2013 D. Gilbert
+ * Copyright (C) 1999 - 2015 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)
@@ -48,9 +48,10 @@
#include "sg_lib.h"
#include "sg_io_linux.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "4.10 20130507";
+static const char * version_str = "4.11 20151219";
#define ME "sg_scan: "
@@ -226,7 +227,7 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
exit(0);
case 'w':
writeable = 1;
@@ -244,7 +245,7 @@ int main(int argc, char * argv[])
if (plen <= 0)
continue;
if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -300,8 +301,8 @@ int main(int argc, char * argv[])
else if ((ENODEV == errno) || (ENOENT == errno) ||
(ENXIO == errno)) {
if (verbose)
- fprintf(stderr, "Unable to open: %s, errno=%d\n",
- file_namep, errno);
+ pr2serr("Unable to open: %s, errno=%d\n", file_namep,
+ errno);
++num_errors;
++num_silent;
continue;
diff --git a/src/sg_scan_win32.c b/src/sg_scan_win32.c
index faaa7ce4..a45b0389 100644
--- a/src/sg_scan_win32.c
+++ b/src/sg_scan_win32.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2014 Douglas Gilbert.
+ * Copyright (c) 2006-2015 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.
@@ -24,6 +24,7 @@
#include <errno.h>
#include "sg_lib.h"
+#include "sg_pr2serr.h"
#ifdef _WIN32_WINNT
#if _WIN32_WINNT < 0x0602
@@ -174,11 +175,9 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr,
- "Usage: sg_scan [--bus] [--help] [--letter=VL] [--scsi] "
+ pr2serr("Usage: sg_scan [--bus] [--help] [--letter=VL] [--scsi] "
"[--verbose] [--version]\n");
- fprintf(stderr,
- " --bus|-b output bus type\n"
+ pr2serr(" --bus|-b output bus type\n"
" --help|-h output this usage message then exit\n"
" --letter=VL|-l VL volume letter (e.g. 'F' for F:) "
"to match\n"
@@ -279,7 +278,7 @@ query_dev_property(HANDLE hdevice,
&num_out, NULL)) {
if (verbose > 2) {
err = GetLastError();
- fprintf(stderr, " IOCTL_STORAGE_QUERY_PROPERTY(Devprop) failed, "
+ pr2serr(" IOCTL_STORAGE_QUERY_PROPERTY(Devprop) failed, "
"Error=%u %s\n", (unsigned int)err,
get_err_str(err, sizeof(b), b));
}
@@ -287,8 +286,8 @@ query_dev_property(HANDLE hdevice,
}
if (verbose > 3)
- fprintf(stderr, " IOCTL_STORAGE_QUERY_PROPERTY(DevProp) "
- "num_out=%u\n", (unsigned int)num_out);
+ pr2serr(" IOCTL_STORAGE_QUERY_PROPERTY(DevProp) num_out=%u\n",
+ (unsigned int)num_out);
return 0;
}
@@ -307,12 +306,12 @@ query_dev_uid(HANDLE hdevice, union STORAGE_DEVICE_UID_DATA * data)
&query, sizeof(query), NULL, 0, &num_out, NULL)) {
if (verbose > 2) {
err = GetLastError();
- fprintf(stderr, " IOCTL_STORAGE_QUERY_PROPERTY(DevUid(exists)) "
- "failed, Error=%u %s\n", (unsigned int)err,
+ pr2serr(" IOCTL_STORAGE_QUERY_PROPERTY(DevUid(exists)) failed, "
+ "Error=%u %s\n", (unsigned int)err,
get_err_str(err, sizeof(b), b));
}
if (verbose > 3)
- fprintf(stderr, " num_out=%u\n", (unsigned int)num_out);
+ pr2serr(" num_out=%u\n", (unsigned int)num_out);
/* interpret any error to mean this property doesn't exist */
return 0;
}
@@ -323,14 +322,14 @@ query_dev_uid(HANDLE hdevice, union STORAGE_DEVICE_UID_DATA * data)
&num_out, NULL)) {
if (verbose > 2) {
err = GetLastError();
- fprintf(stderr, " IOCTL_STORAGE_QUERY_PROPERTY(DevUid) failed, "
- "Error=%u %s\n", (unsigned int)err,
+ pr2serr(" IOCTL_STORAGE_QUERY_PROPERTY(DevUid) failed, Error=%u "
+ "%s\n", (unsigned int)err,
get_err_str(err, sizeof(b), b));
}
return -ENOSYS;
}
if (verbose > 3)
- fprintf(stderr, " IOCTL_STORAGE_QUERY_PROPERTY(DevUid) num_out=%u\n",
+ pr2serr(" IOCTL_STORAGE_QUERY_PROPERTY(DevUid) num_out=%u\n",
(unsigned int)num_out);
return 0;
}
@@ -430,20 +429,19 @@ enum_scsi_adapters(void)
}
} else {
err = GetLastError();
- fprintf(stderr, "%s: IOCTL_SCSI_GET_INQUIRY_DATA failed "
- "err=%u\n\t%s", adapter_name, (unsigned int)err,
+ pr2serr("%s: IOCTL_SCSI_GET_INQUIRY_DATA failed err=%u\n\t%s",
+ adapter_name, (unsigned int)err,
get_err_str(err, sizeof(b), b));
}
CloseHandle(fh);
} else {
err = GetLastError();
if (ERROR_SHARING_VIOLATION == err)
- fprintf(stderr, "%s: in use by other process (sharing "
- "violation [34])\n", adapter_name);
+ pr2serr("%s: in use by other process (sharing violation "
+ "[34])\n", adapter_name);
else if (verbose > 3)
- fprintf(stderr, "%s: CreateFile failed err=%u\n\t%s",
- adapter_name, (unsigned int)err,
- get_err_str(err, sizeof(b), b));
+ pr2serr("%s: CreateFile failed err=%u\n\t%s", adapter_name,
+ (unsigned int)err, get_err_str(err, sizeof(b), b));
if (++hole_count >= MAX_HOLE_COUNT)
break;
}
@@ -460,7 +458,7 @@ enum_volumes(char letter)
struct storage_elem tmp_se;
if (verbose > 2)
- fprintf(stderr, "%s: enter\n", __FUNCTION__ );
+ pr2serr("%s: enter\n", __FUNCTION__ );
for (k = 0; k < 24; ++k) {
memset(&tmp_se, 0, sizeof(tmp_se));
snprintf(adapter_name, sizeof (adapter_name), "\\\\.\\%c:", 'C' + k);
@@ -470,14 +468,12 @@ enum_volumes(char letter)
OPEN_EXISTING, 0, NULL);
if (fh != INVALID_HANDLE_VALUE) {
if (query_dev_property(fh, &tmp_se.qp_descriptor) < 0)
- fprintf(stderr, "%s: query_dev_property failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_property failed\n", __FUNCTION__ );
else
tmp_se.qp_descriptor_valid = 1;
if (query_dev_uid(fh, &tmp_se.qp_uid) < 0) {
if (verbose > 2)
- fprintf(stderr, "%s: query_dev_uid failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_uid failed\n", __FUNCTION__ );
} else
tmp_se.qp_uid_valid = 1;
if (('\0' == letter) || (letter == tmp_se.name[0]))
@@ -500,7 +496,7 @@ enum_pds(void)
struct storage_elem tmp_se;
if (verbose > 2)
- fprintf(stderr, "%s: enter\n", __FUNCTION__ );
+ pr2serr("%s: enter\n", __FUNCTION__ );
for (k = 0; k < MAX_PHYSICALDRIVE_NUM; ++k) {
memset(&tmp_se, 0, sizeof(tmp_se));
snprintf(adapter_name, sizeof (adapter_name),
@@ -511,14 +507,12 @@ enum_pds(void)
OPEN_EXISTING, 0, NULL);
if (fh != INVALID_HANDLE_VALUE) {
if (query_dev_property(fh, &tmp_se.qp_descriptor) < 0)
- fprintf(stderr, "%s: query_dev_property failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_property failed\n", __FUNCTION__ );
else
tmp_se.qp_descriptor_valid = 1;
if (query_dev_uid(fh, &tmp_se.qp_uid) < 0) {
if (verbose > 2)
- fprintf(stderr, "%s: query_dev_uid failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_uid failed\n", __FUNCTION__ );
} else
tmp_se.qp_uid_valid = 1;
hole_count = 0;
@@ -527,12 +521,11 @@ enum_pds(void)
} else {
err = GetLastError();
if (ERROR_SHARING_VIOLATION == err)
- fprintf(stderr, "%s: in use by other process (sharing "
- "violation [34])\n", adapter_name);
+ pr2serr("%s: in use by other process (sharing violation "
+ "[34])\n", adapter_name);
else if (verbose > 3)
- fprintf(stderr, "%s: CreateFile failed err=%u\n\t%s",
- adapter_name, (unsigned int)err,
- get_err_str(err, sizeof(b), b));
+ pr2serr("%s: CreateFile failed err=%u\n\t%s", adapter_name,
+ (unsigned int)err, get_err_str(err, sizeof(b), b));
if (++hole_count >= MAX_HOLE_COUNT)
break;
}
@@ -552,7 +545,7 @@ enum_cdroms(void)
struct storage_elem tmp_se;
if (verbose > 2)
- fprintf(stderr, "%s: enter\n", __FUNCTION__ );
+ pr2serr("%s: enter\n", __FUNCTION__ );
for (k = 0; k < MAX_CDROM_NUM; ++k) {
memset(&tmp_se, 0, sizeof(tmp_se));
snprintf(adapter_name, sizeof (adapter_name), "\\\\.\\CDROM%d", k);
@@ -562,14 +555,12 @@ enum_cdroms(void)
OPEN_EXISTING, 0, NULL);
if (fh != INVALID_HANDLE_VALUE) {
if (query_dev_property(fh, &tmp_se.qp_descriptor) < 0)
- fprintf(stderr, "%s: query_dev_property failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_property failed\n", __FUNCTION__ );
else
tmp_se.qp_descriptor_valid = 1;
if (query_dev_uid(fh, &tmp_se.qp_uid) < 0) {
if (verbose > 2)
- fprintf(stderr, "%s: query_dev_uid failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_uid failed\n", __FUNCTION__ );
} else
tmp_se.qp_uid_valid = 1;
hole_count = 0;
@@ -578,12 +569,11 @@ enum_cdroms(void)
} else {
err = GetLastError();
if (ERROR_SHARING_VIOLATION == err)
- fprintf(stderr, "%s: in use by other process (sharing "
- "violation [34])\n", adapter_name);
+ pr2serr("%s: in use by other process (sharing violation "
+ "[34])\n", adapter_name);
else if (verbose > 3)
- fprintf(stderr, "%s: CreateFile failed err=%u\n\t%s",
- adapter_name, (unsigned int)err,
- get_err_str(err, sizeof(b), b));
+ pr2serr("%s: CreateFile failed err=%u\n\t%s", adapter_name,
+ (unsigned int)err, get_err_str(err, sizeof(b), b));
if (++hole_count >= MAX_HOLE_COUNT)
break;
}
@@ -603,7 +593,7 @@ enum_tapes(void)
struct storage_elem tmp_se;
if (verbose > 2)
- fprintf(stderr, "%s: enter\n", __FUNCTION__ );
+ pr2serr("%s: enter\n", __FUNCTION__ );
for (k = 0; k < MAX_TAPE_NUM; ++k) {
memset(&tmp_se, 0, sizeof(tmp_se));
snprintf(adapter_name, sizeof (adapter_name), "\\\\.\\TAPE%d", k);
@@ -613,14 +603,12 @@ enum_tapes(void)
OPEN_EXISTING, 0, NULL);
if (fh != INVALID_HANDLE_VALUE) {
if (query_dev_property(fh, &tmp_se.qp_descriptor) < 0)
- fprintf(stderr, "%s: query_dev_property failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_property failed\n", __FUNCTION__ );
else
tmp_se.qp_descriptor_valid = 1;
if (query_dev_uid(fh, &tmp_se.qp_uid) < 0) {
if (verbose > 2)
- fprintf(stderr, "%s: query_dev_uid failed\n",
- __FUNCTION__ );
+ pr2serr("%s: query_dev_uid failed\n", __FUNCTION__ );
} else
tmp_se.qp_uid_valid = 1;
hole_count = 0;
@@ -629,12 +617,11 @@ enum_tapes(void)
} else {
err = GetLastError();
if (ERROR_SHARING_VIOLATION == err)
- fprintf(stderr, "%s: in use by other process (sharing "
- "violation [34])\n", adapter_name);
+ pr2serr("%s: in use by other process (sharing violation "
+ "[34])\n", adapter_name);
else if (verbose > 3)
- fprintf(stderr, "%s: CreateFile failed err=%u\n\t%s",
- adapter_name, (unsigned int)err,
- get_err_str(err, sizeof(b), b));
+ pr2serr("%s: CreateFile failed err=%u\n\t%s", adapter_name,
+ (unsigned int)err, get_err_str(err, sizeof(b), b));
if (++hole_count >= MAX_HOLE_COUNT)
break;
}
@@ -744,8 +731,8 @@ main(int argc, char * argv[])
case 'l':
vol_letter = toupper(optarg[0]);
if ((vol_letter < 'C') || (vol_letter > 'Z')) {
- fprintf(stderr, "'--letter=' expects a letter in the "
- "'C' to 'Z' range\n");
+ pr2serr("'--letter=' expects a letter in the 'C' to 'Z' "
+ "range\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -757,10 +744,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -768,8 +755,7 @@ main(int argc, char * argv[])
if (optind < argc) {
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -780,7 +766,7 @@ main(int argc, char * argv[])
ret = sg_do_wscan(vol_letter, show_bt, scsi_scan);
free(storage_arr);
} else {
- fprintf(stderr, "Failed to allocate storage_arr on heap\n");
+ pr2serr("Failed to allocate storage_arr on heap\n");
ret = SG_LIB_SYNTAX_ERROR;
}
return ret;
diff --git a/src/sg_senddiag.c b/src/sg_senddiag.c
index 83013a0e..5e5de565 100644
--- a/src/sg_senddiag.c
+++ b/src/sg_senddiag.c
@@ -25,9 +25,10 @@
#include "sg_cmds_extra.h"
#include "sg_pt.h" /* needed for scsi_pt_win32_direct() */
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.46 20150427";
+static const char * version_str = "0.47 20151219";
#define ME "sg_senddiag: "
@@ -184,8 +185,8 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'm':
n = sg_get_num(optarg);
if ((n < 0) || (n > 0xffff)) {
- fprintf(stderr, "bad argument to '--maxlen=' or greater "
- "than 65535 [0xffff]\n");
+ pr2serr("bad argument to '--maxlen=' or greater than 65535 "
+ "[0xffff]\n");
return SG_LIB_SYNTAX_ERROR;
}
op->maxlen = n;
@@ -201,8 +202,8 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'P':
n = sg_get_num(optarg);
if ((n < 0) || (n > 0xff)) {
- fprintf(stderr, "bad argument to '--page=' or greater "
- "than 255 [0xff]\n");
+ pr2serr("bad argument to '--page=' or greater than 255 "
+ "[0xff]\n");
return SG_LIB_SYNTAX_ERROR;
}
op->page_code = n;
@@ -214,7 +215,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 's':
n = sg_get_num(optarg);
if ((n < 0) || (n > 7)) {
- fprintf(stderr, "bad argument to '--selftest='\n");
+ pr2serr("bad argument to '--selftest='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -233,7 +234,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
++op->do_version;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (op->do_help)
break;
usage();
@@ -247,8 +248,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -345,15 +345,15 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("-old", cp, 5))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == op->device_name)
op->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not expecting: "
- "%s\n", op->device_name, cp);
+ pr2serr("too many arguments, got: %s, not expecting: %s\n",
+ op->device_name, cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -414,7 +414,7 @@ do_modes_0a(int sg_fd, void * resp, int mx_resp_len, int noisy, int mode6,
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Mode sense (%s): %s\n", (mode6 ? "6" : "10"), b);
+ pr2serr("Mode sense (%s): %s\n", (mode6 ? "6" : "10"), b);
}
return res;
}
@@ -469,8 +469,8 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
if (1 == sscanf(carry_over, "%x", &h))
mp_arr[off - 1] = h; /* back up and overwrite */
else {
- fprintf(stderr, "build_diag_page: carry_over error "
- "['%s'] around line %d\n", carry_over, j + 1);
+ pr2serr("build_diag_page: carry_over error ['%s'] "
+ "around line %d\n", carry_over, j + 1);
return 1;
}
lcp = line + 1;
@@ -489,16 +489,16 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
continue;
k = strspn(lcp, "0123456789aAbBcCdDeEfF ,\t");
if ((k < in_len) && ('#' != lcp[k])) {
- fprintf(stderr, "build_diag_page: syntax error at "
- "line %d, pos %d\n", j + 1, m + k + 1);
+ pr2serr("build_diag_page: syntax error at line %d, pos %d\n",
+ j + 1, m + k + 1);
return 1;
}
for (k = 0; k < 1024; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "build_diag_page: hex number "
- "larger than 0xff in line %d, pos %d\n",
- j + 1, (int)(lcp - line + 1));
+ pr2serr("build_diag_page: hex number larger than "
+ "0xff in line %d, pos %d\n", j + 1,
+ (int)(lcp - line + 1));
return 1;
}
if (split_line && (1 == strlen(lcp))) {
@@ -506,8 +506,7 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
carry_over[0] = *lcp;
}
if ((off + k) >= max_arr_len) {
- fprintf(stderr, "build_diag_page: array length "
- "exceeded\n");
+ pr2serr("build_diag_page: array length exceeded\n");
return 1;
}
mp_arr[off + k] = h;
@@ -522,9 +521,8 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
--k;
break;
}
- fprintf(stderr, "build_diag_page: error in "
- "line %d, at pos %d\n", j + 1,
- (int)(lcp - line + 1));
+ pr2serr("build_diag_page: error in line %d, at pos %d\n",
+ j + 1, (int)(lcp - line + 1));
return 1;
}
}
@@ -534,14 +532,14 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
} else { /* hex string on command line */
k = strspn(inp, "0123456789aAbBcCdDeEfF, ");
if (in_len != k) {
- fprintf(stderr, "build_diag_page: error at pos %d\n", k + 1);
+ pr2serr("build_diag_page: error at pos %d\n", k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "build_diag_page: hex number larger "
- "than 0xff at pos %d\n", (int)(lcp - inp + 1));
+ pr2serr("build_diag_page: hex number larger than 0xff at "
+ "pos %d\n", (int)(lcp - inp + 1));
return 1;
}
mp_arr[k] = h;
@@ -555,14 +553,14 @@ build_diag_page(const char * inp, unsigned char * mp_arr, int * mp_arr_len,
cp = c2p;
lcp = cp + 1;
} else {
- fprintf(stderr, "build_diag_page: error at pos %d\n",
+ pr2serr("build_diag_page: error at pos %d\n",
(int)(lcp - inp + 1));
return 1;
}
}
*mp_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_diag_page: array length exceeded\n");
+ pr2serr("build_diag_page: array length exceeded\n");
return 1;
}
}
@@ -654,7 +652,7 @@ main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
rsp_buff_size = op->maxlen;
@@ -664,7 +662,7 @@ main(int argc, char * argv[])
list_page_codes();
return 0;
}
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
if (op->opt_new)
usage();
else
@@ -674,7 +672,7 @@ main(int argc, char * argv[])
if (op->do_raw) {
read_in = (unsigned char *)calloc(op->maxlen, 1);
if (NULL == read_in) {
- fprintf(stderr, "unable to allocate %d bytes\n", op->maxlen);
+ pr2serr("unable to allocate %d bytes\n", op->maxlen);
return SG_LIB_CAT_OTHER;
}
if (build_diag_page(op->raw_arg, read_in, &read_in_len, op->maxlen)) {
@@ -735,7 +733,7 @@ main(int argc, char * argv[])
#ifdef SG_LIB_WIN32
#ifdef SG_LIB_WIN32_DIRECT
if (op->do_verbose > 4)
- fprintf(stderr, "Initial win32 SPT interface state: %s\n",
+ pr2serr("Initial win32 SPT interface state: %s\n",
scsi_pt_win32_spt_state() ? "direct" : "indirect");
if (op->maxlen >= 16384)
scsi_pt_win32_direct(SG_LIB_WIN32_DIRECT /* SPT pt interface */);
@@ -744,13 +742,13 @@ main(int argc, char * argv[])
if ((sg_fd = sg_cmds_open_device(op->device_name, 0 /* rw */,
op->do_verbose)) < 0) {
- fprintf(stderr, ME "error opening file: %s: %s\n", op->device_name,
+ pr2serr(ME "error opening file: %s: %s\n", op->device_name,
safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
rsp_buff = (unsigned char *)calloc(op->maxlen, 1);
if (NULL == rsp_buff) {
- fprintf(stderr, "unable to allocate %d bytes (2)\n", op->maxlen);
+ pr2serr("unable to allocate %d bytes (2)\n", op->maxlen);
return SG_LIB_CAT_OTHER;
}
if (op->do_extdur) {
@@ -813,8 +811,7 @@ main(int argc, char * argv[])
}
} else {
ret = res;
- fprintf(stderr, "RECEIVE DIAGNOSTIC RESULTS command "
- "failed\n");
+ pr2serr("RECEIVE DIAGNOSTIC RESULTS command failed\n");
goto err_out9;
}
} else {
@@ -849,17 +846,16 @@ main(int argc, char * argv[])
err_out:
if (SG_LIB_CAT_UNIT_ATTENTION == res)
- fprintf(stderr, "SEND DIAGNOSTIC, unit attention\n");
+ pr2serr("SEND DIAGNOSTIC, unit attention\n");
else if (SG_LIB_CAT_ABORTED_COMMAND == res)
- fprintf(stderr, "SEND DIAGNOSTIC, aborted command\n");
+ pr2serr("SEND DIAGNOSTIC, aborted command\n");
else if (SG_LIB_CAT_NOT_READY == res)
- fprintf(stderr, "SEND DIAGNOSTIC, device not "
- "ready\n");
+ pr2serr("SEND DIAGNOSTIC, device not ready\n");
else
- fprintf(stderr, "SEND DIAGNOSTIC command, failed\n");
+ pr2serr("SEND DIAGNOSTIC command, failed\n");
err_out9:
if (op->do_verbose < 2)
- fprintf(stderr, " try again with '-vv' for more information\n");
+ pr2serr(" try again with '-vv' for more information\n");
res = sg_cmds_close_device(sg_fd);
if ((res < 0) && (0 == ret))
return SG_LIB_FILE_ERROR;
diff --git a/src/sg_ses.c b/src/sg_ses.c
index e5fdbc6c..c04a5797 100644
--- a/src/sg_ses.c
+++ b/src/sg_ses.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -24,13 +23,14 @@
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
#include "sg_pt.h" /* needed for scsi_pt_win32_direct() */
+#include "sg_pr2serr.h"
/*
* This program issues SCSI SEND DIAGNOSTIC and RECEIVE DIAGNOSTIC RESULTS
* commands tailored for SES (enclosure) devices.
*/
-static const char * version_str = "2.05 20151210"; /* ses3r08->11 */
+static const char * version_str = "2.06 20151219"; /* ses3r08->11 */
#define MX_ALLOC_LEN ((64 * 1024) - 4) /* max allowable for big enclosures */
#define MX_ELEM_HDR 1024
@@ -687,26 +687,6 @@ static void enumerate_diag_pages(void);
static int saddr_non_zero(const unsigned char * ucp);
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
-
static void
usage(int help_num)
{
diff --git a/src/sg_ses_microcode.c b/src/sg_ses_microcode.c
index f49a346e..546d0563 100644
--- a/src/sg_ses_microcode.c
+++ b/src/sg_ses_microcode.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Douglas Gilbert.
+ * Copyright (c) 2014-2015 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.
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <ctype.h>
#include <string.h>
#include <getopt.h>
@@ -30,13 +29,14 @@
#endif
#endif
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/*
* This utility issues the SCSI SEND DIAGNOSTIC and RECEIVE DIAGNOSTIC
* RESULTS commands in order to send microcode to the given SES device.
*/
-static const char * version_str = "1.02 20141029"; /* ses3r07 */
+static const char * version_str = "1.03 20151219"; /* ses3r07 */
#define ME "sg_ses_microcode: "
#define MAX_XFER_LEN (128 * 1024 * 1024)
@@ -79,26 +79,6 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
@@ -793,9 +773,9 @@ fini:
((MODE_DNLD_STATUS == op->mc_mode) ?
"" : "SEND DIAGNOSTIC or "));
else if (ret > 0)
- fprintf(stderr, "Failed, exit status %d\n", ret);
+ pr2serr("Failed, exit status %d\n", ret);
else if (ret < 0)
- fprintf(stderr, "Some error occurred\n");
+ pr2serr("Some error occurred\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_start.c b/src/sg_start.c
index 58c7e1bf..49c92ab0 100644
--- a/src/sg_start.c
+++ b/src/sg_start.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1999-2013 D. Gilbert
+ * Copyright (C) 1999-2015 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)
@@ -29,9 +29,10 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.59 20130507"; /* sbc3r14; mmc6r01a */
+static const char * version_str = "0.60 20151219"; /* sbc3r14; mmc6r01a */
static struct option long_options[] = {
{"eject", 0, 0, 'e'},
@@ -75,7 +76,7 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr, "Usage: sg_start [--eject] [--fl=FL] [--help] "
+ pr2serr("Usage: sg_start [--eject] [--fl=FL] [--help] "
"[--immed] [--load] [--loej]\n"
" [--mod=PC_MOD] [--noflush] [--pc=PC] "
"[--readonly]\n"
@@ -121,7 +122,7 @@ usage()
static void
usage_old()
{
- fprintf(stderr, "Usage: sg_start [0] [1] [--eject] [--fl=FL] "
+ pr2serr("Usage: sg_start [0] [1] [--eject] [--fl=FL] "
"[-i] [--imm=0|1]\n"
" [--load] [--loej] [--mod=PC_MOD] "
"[--noflush] [--pc=PC]\n"
@@ -184,7 +185,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'f':
n = sg_get_num(optarg);
if ((n < 0) || (n > 3)) {
- fprintf(stderr, "bad argument to '--fl='\n");
+ pr2serr("bad argument to '--fl='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -209,7 +210,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'm':
n = sg_get_num(optarg);
if ((n < 0) || (n > 15)) {
- fprintf(stderr, "bad argument to '--mod='\n");
+ pr2serr("bad argument to '--mod='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -226,7 +227,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'p':
n = sg_get_num(optarg);
if ((n < 0) || (n > 15)) {
- fprintf(stderr, "bad argument to '--pc='\n");
+ pr2serr("bad argument to '--pc='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -248,7 +249,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
++op->do_version;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (op->do_help)
break;
usage();
@@ -269,7 +270,7 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
if (NULL == op->device_name)
op->device_name = argv[optind];
else {
- fprintf(stderr, "Unexpected extra argument: %s\n", argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
++err;
}
}
@@ -346,7 +347,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("fl=", cp, 3)) {
num = sscanf(cp + 3, "%x", &u);
if (1 != num) {
- fprintf(stderr, "Bad value after 'fl=' option\n");
+ pr2serr("Bad value after 'fl=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -356,7 +357,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("imm=", cp, 4)) {
num = sscanf(cp + 4, "%x", &u);
if ((1 != num) || (u > 1)) {
- fprintf(stderr, "Bad value after 'imm=' option\n");
+ pr2serr("Bad value after 'imm=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -372,7 +373,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
else if (0 == strncmp("pc=", cp, 3)) {
num = sscanf(cp + 3, "%x", &u);
if ((1 != num) || (u > 15)) {
- fprintf(stderr, "Bad value after after 'pc=' option\n");
+ pr2serr("Bad value after after 'pc=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -380,7 +381,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("mod=", cp, 4)) {
num = sscanf(cp + 3, "%x", &u);
if (1 != num) {
- fprintf(stderr, "Bad value after 'mod=' option\n");
+ pr2serr("Bad value after 'mod=' option\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -400,7 +401,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp(cp, "old", 3))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -417,13 +418,13 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == op->device_name)
op->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not "
+ pr2serr("too many arguments, got: %s, not "
"expecting: %s\n", op->device_name, cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
if (ambigu) {
- fprintf(stderr, "please, only one of 0, 1, --eject, "
+ pr2serr("please, only one of 0, 1, --eject, "
"--load, --start or --stop\n");
usage_old();
return SG_LIB_SYNTAX_ERROR;
@@ -479,16 +480,16 @@ main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
if (op->do_start && op->do_stop) {
- fprintf(stderr, "Ambiguous to give both '--start' and '--stop'\n");
+ pr2serr("Ambiguous to give both '--start' and '--stop'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (op->do_load && op->do_eject) {
- fprintf(stderr, "Ambiguous to give both '--load' and '--eject'\n");
+ pr2serr("Ambiguous to give both '--load' and '--eject'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (op->do_load)
@@ -502,7 +503,7 @@ main(int argc, char * argv[])
/* default action is to start when no other active options */
if (0 == op->device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
if (op->opt_new)
usage();
else
@@ -512,13 +513,13 @@ main(int argc, char * argv[])
if (op->do_fl >= 0) {
if (op->do_start == 0) {
- fprintf(stderr, "Giving '--fl=FL' with '--stop' (or "
- "'--eject') is invalid\n");
+ pr2serr("Giving '--fl=FL' with '--stop' (or '--eject') is "
+ "invalid\n");
return SG_LIB_SYNTAX_ERROR;
}
if (op->do_pc > 0) {
- fprintf(stderr, "Giving '--fl=FL' with '--pc=PC' "
- "when PC is non-zero is invalid\n");
+ pr2serr("Giving '--fl=FL' with '--pc=PC' when PC is non-zero "
+ "is invalid\n");
return SG_LIB_SYNTAX_ERROR;
}
}
@@ -526,8 +527,8 @@ main(int argc, char * argv[])
fd = sg_cmds_open_device(op->device_name, op->do_readonly,
op->do_verbose);
if (fd < 0) {
- fprintf(stderr, "Error trying to open %s: %s\n",
- op->device_name, safe_strerror(-fd));
+ pr2serr("Error trying to open %s: %s\n", op->device_name,
+ safe_strerror(-fd));
return SG_LIB_FILE_ERROR;
}
@@ -551,9 +552,9 @@ main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
- fprintf(stderr, "%s\n", b);
+ pr2serr("%s\n", b);
}
- fprintf(stderr, "START STOP UNIT command failed\n");
+ pr2serr("START STOP UNIT command failed\n");
}
res = sg_cmds_close_device(fd);
if ((res < 0) && (0 == ret))
diff --git a/src/sg_stpg.c b/src/sg_stpg.c
index de0f6aba..d19b0ae3 100644
--- a/src/sg_stpg.c
+++ b/src/sg_stpg.c
@@ -17,6 +17,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -25,7 +26,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.9 20151204";
+static const char * version_str = "1.10 20151219";
#define TGT_GRP_BUFF_LEN 1024
#define MX_ALLOC_LEN (0xc000 + 0x80)
@@ -89,39 +90,36 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_stpg [--active] [--help] [--hex] [--offline] [--optimized] "
- "[--raw]\n"
- " [--standby] [--state=S,S...] [--tp=P,P...] "
- "[--unavailable]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --active|-a set asymm. access state to "
- "active/non-optimized\n"
- " --help|-h print out usage message\n"
- " --hex|-H print out report response in hex, then "
- "exit\n"
- " --offline|-l set asymm. access state to offline, takes "
- "relative\n"
- " target port id, rather than target port "
- "group id\n"
- " --optimized|-o set asymm. access state to "
- "active/optimized\n"
- " --raw|-r output report response in binary to "
- "stdout, then exit\n"
- " --standby|-s set asymm. access state to standby\n"
- " --state=S,S.. |-S S,S... list of states (values or "
- "acronyms)\n"
- " --tp=P,P.. |-t P,P... list of target port group "
- "identifiers,\n"
- " or relative target port "
- "identifiers\n"
- " --unavailable|-u set asymm. access state to unavailable\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI SET TARGET PORT GROUPS command\n"
- );
-
+ pr2serr("Usage: sg_stpg [--active] [--help] [--hex] [--offline] "
+ "[--optimized] [--raw]\n"
+ " [--standby] [--state=S,S...] [--tp=P,P...] "
+ "[--unavailable]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --active|-a set asymm. access state to "
+ "active/non-optimized\n"
+ " --help|-h print out usage message\n"
+ " --hex|-H print out report response in hex, then "
+ "exit\n"
+ " --offline|-l set asymm. access state to offline, takes "
+ "relative\n"
+ " target port id, rather than target port "
+ "group id\n"
+ " --optimized|-o set asymm. access state to "
+ "active/optimized\n"
+ " --raw|-r output report response in binary to "
+ "stdout, then exit\n"
+ " --standby|-s set asymm. access state to standby\n"
+ " --state=S,S.. |-S S,S... list of states (values or "
+ "acronyms)\n"
+ " --tp=P,P.. |-t P,P... list of target port group "
+ "identifiers,\n"
+ " or relative target port "
+ "identifiers\n"
+ " --unavailable|-u set asymm. access state to unavailable\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI SET TARGET PORT GROUPS command\n");
}
static void
@@ -148,8 +146,8 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg)
ucp = buff + off;
i_len = ucp[3];
if ((off + i_len + 4) > len) {
- fprintf(stderr, " VPD page error: designator length longer "
- "than\n remaining response length=%d\n", (len - off));
+ pr2serr(" VPD page error: designator length longer than\n "
+ "remaining response length=%d\n", (len - off));
return SG_LIB_CAT_MALFORMED;
}
ip = ucp + 4;
@@ -160,8 +158,8 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg)
switch (desig_type) {
case 4: /* Relative target port */
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
- fprintf(stderr, " << expected binary code_set, target "
- "port association, length 4>>\n");
+ pr2serr(" << expected binary code_set, target port "
+ "association, length 4>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -169,8 +167,8 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg)
break;
case 5: /* (primary) Target port group */
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
- fprintf(stderr, " << expected binary code_set, target "
- "port association, length 4>>\n");
+ pr2serr(" << expected binary code_set, target port "
+ "association, length 4>>\n");
dStrHexErr((const char *)ip, i_len, 0);
break;
}
@@ -181,7 +179,7 @@ decode_target_port(unsigned char * buff, int len, int *d_id, int *d_tpg)
}
}
if (-1 == *d_id || -1 == *d_tpg) {
- fprintf(stderr, "VPD page error: no target port group information\n");
+ pr2serr("VPD page error: no target port group information\n");
return SG_LIB_CAT_MALFORMED;
}
return 0;
@@ -299,7 +297,7 @@ build_port_arr(const char * inp, int * port_arr, int * port_arr_len,
*port_arr_len = 0;
k = strspn(inp, "0123456789aAbBcCdDeEfFhHxX,");
if (in_len != k) {
- fprintf(stderr, "build_port_arr: error at pos %d\n", k + 1);
+ pr2serr("build_port_arr: error at pos %d\n", k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
@@ -311,14 +309,14 @@ build_port_arr(const char * inp, int * port_arr, int * port_arr_len,
break;
lcp = cp + 1;
} else {
- fprintf(stderr, "build_port_arr: error at pos %d\n",
+ pr2serr("build_port_arr: error at pos %d\n",
(int)(lcp - inp + 1));
return 1;
}
}
*port_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_port_arr: array length exceeded\n");
+ pr2serr("build_port_arr: array length exceeded\n");
return 1;
}
return 0;
@@ -347,7 +345,7 @@ build_state_arr(const char * inp, int * state_arr, int * state_arr_len,
*state_arr_len = 0;
k = strspn(inp, "0123456789aAbBcCdDeEfFhHnNoOsSuUxX,");
if (in_len != k) {
- fprintf(stderr, "build_state_arr: error at pos %d\n", k + 1);
+ pr2serr("build_state_arr: error at pos %d\n", k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
@@ -373,8 +371,8 @@ build_state_arr(const char * inp, int * state_arr, int * state_arr_len,
state_arr[k] = 3;
break;
default:
- fprintf(stderr, "build_state_arr: expected 'ao', 'an', 'o', "
- "'s' or 'u' at pos %d\n", (int)(lcp - inp + 1));
+ pr2serr("build_state_arr: expected 'ao', 'an', 'o', 's' or "
+ "'u' at pos %d\n", (int)(lcp - inp + 1));
return 1;
}
}
@@ -383,11 +381,11 @@ build_state_arr(const char * inp, int * state_arr, int * state_arr_len,
if (((v >= 0) && (v <= 3)) || (14 ==v))
state_arr[k] = v;
else if (-1 == v) {
- fprintf(stderr, "build_state_arr: error at pos %d\n",
+ pr2serr("build_state_arr: error at pos %d\n",
(int)(lcp - inp + 1));
return 1;
} else {
- fprintf(stderr, "build_state_arr: expect 0,1,2,3 or 14\n");
+ pr2serr("build_state_arr: expect 0,1,2,3 or 14\n");
return 1;
}
}
@@ -398,7 +396,7 @@ build_state_arr(const char * inp, int * state_arr, int * state_arr_len,
}
*state_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_state_arr: array length exceeded\n");
+ pr2serr("build_state_arr: array length exceeded\n");
return 1;
}
return 0;
@@ -476,10 +474,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "Version: %s\n", version_str);
+ pr2serr("Version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -491,8 +489,7 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -513,8 +510,8 @@ main(int argc, char * argv[])
}
}
if ((state >= 0) && (state_arr_len > 0)) {
- fprintf(stderr, "either use individual state option or '--state=' "
- "but not both\n");
+ pr2serr("either use individual state option or '--state=' but not "
+ "both\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -525,14 +522,13 @@ main(int argc, char * argv[])
state_arr_len = 0;
}
if (state_arr_len > port_arr_len) {
- fprintf(stderr, "'state=' list longer than expected\n");
+ pr2serr("'state=' list longer than expected\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((port_arr_len > 0) && (0 == state_arr_len)) {
if (-1 == state) {
- fprintf(stderr, "target port list given but no state "
- "indicated\n");
+ pr2serr("target port list given but no state indicated\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -546,20 +542,19 @@ main(int argc, char * argv[])
state_arr_len = port_arr_len;
}
if (port_arr_len != state_arr_len) {
- fprintf(stderr, "'state=' and '--tp=' lists mismatched\n");
+ pr2serr("'state=' and '--tp=' lists mismatched\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -569,17 +564,17 @@ main(int argc, char * argv[])
if (0 == res) {
report_len = sg_get_unaligned_be16(rsp_buff + 2) + 4;
if (VPD_DEVICE_ID != rsp_buff[1]) {
- fprintf(stderr, "invalid VPD response; probably a STANDARD "
- "INQUIRY response\n");
+ pr2serr("invalid VPD response; probably a STANDARD INQUIRY "
+ "response\n");
if (verbose) {
- fprintf(stderr, "First 32 bytes of bad response\n");
+ pr2serr("First 32 bytes of bad response\n");
dStrHexErr((const char *)rsp_buff, 32, 0);
}
return SG_LIB_CAT_MALFORMED;
}
if (report_len > MX_ALLOC_LEN) {
- fprintf(stderr, "response length too long: %d > %d\n",
- report_len, MX_ALLOC_LEN);
+ pr2serr("response length too long: %d > %d\n", report_len,
+ MX_ALLOC_LEN);
return SG_LIB_CAT_MALFORMED;
} else if (report_len > DEF_VPD_DEVICE_ID_LEN) {
if (sg_ll_inquiry(sg_fd, 0, 1, VPD_DEVICE_ID, rsp_buff,
@@ -603,8 +598,8 @@ main(int argc, char * argv[])
report_len = sg_get_unaligned_be32(reportTgtGrpBuff + 0) + 4;
if (report_len > (int)sizeof(reportTgtGrpBuff)) {
/* trunc = 1; */
- fprintf(stderr, " <<report too long for internal buffer,"
- " output truncated\n");
+ pr2serr(" <<report too long for internal buffer, output "
+ "truncated\n");
report_len = (int)sizeof(reportTgtGrpBuff);
}
if (raw) {
@@ -641,9 +636,9 @@ main(int argc, char * argv[])
}
} else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Report Target Port Groups: %s\n", b);
+ pr2serr("Report Target Port Groups: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for more information\n");
+ pr2serr(" try '-v' for more information\n");
}
if (0 != res)
goto err_out;
@@ -674,15 +669,15 @@ main(int argc, char * argv[])
goto err_out;
else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Set Target Port Groups: %s\n", b);
+ pr2serr("Set Target Port Groups: %s\n", b);
if (0 == verbose)
- fprintf(stderr, " try '-v' for more information\n");
+ pr2serr(" try '-v' for more information\n");
}
err_out:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_sync.c b/src/sg_sync.c
index a847e5d4..0a9600fa 100644
--- a/src/sg_sync.c
+++ b/src/sg_sync.c
@@ -17,6 +17,7 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
*
@@ -26,7 +27,7 @@
* (e.g. disks).
*/
-static const char * version_str = "1.13 20151208";
+static const char * version_str = "1.14 20151219";
#define SYNCHRONIZE_CACHE16_CMD 0x91
#define SYNCHRONIZE_CACHE16_CMDLEN 16
@@ -50,37 +51,35 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_sync [--16] [--count=COUNT] [--group=GN] [--help] "
- "[--immed]\n"
- " [--lba=LBA] [--sync-nv] [--timeout=SECS] "
- "[--verbose]\n"
- " [--version] DEVICE\n"
- " where:\n"
- " --16|-S calls SYNCHRONIZE CACHE(16) (def: is "
- "10 byte\n"
- " variant)\n"
- " --count=COUNT|-c COUNT number of blocks to sync (def: 0 "
- "which\n"
- " implies rest of device)\n"
- " --group=GN|-g GN set group number field to GN (def: 0)\n"
- " --help|-h print out usage message\n"
- " --immed|-i command returns immediately when set "
- "else wait\n"
- " for 'sync' to complete\n"
- " --lba=LBA|-l LBA logical block address to start sync "
- "operation\n"
- " from (def: 0)\n"
- " --sync-nv|-s synchronize to non-volatile storage "
- "(if distinct\n"
- " from medium). Obsolete in sbc3r35d.\n"
- " --timeout=SECS|-t SECS command timeout in seconds, only "
- "active\n"
- " if '--16' given (def: 60 seconds)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n\n"
- "Performs a SCSI SYNCHRONIZE CACHE(10 or 16) command\n"
- );
+ pr2serr("Usage: sg_sync [--16] [--count=COUNT] [--group=GN] [--help] "
+ "[--immed]\n"
+ " [--lba=LBA] [--sync-nv] [--timeout=SECS] "
+ "[--verbose]\n"
+ " [--version] DEVICE\n"
+ " where:\n"
+ " --16|-S calls SYNCHRONIZE CACHE(16) (def: is "
+ "10 byte\n"
+ " variant)\n"
+ " --count=COUNT|-c COUNT number of blocks to sync (def: 0 "
+ "which\n"
+ " implies rest of device)\n"
+ " --group=GN|-g GN set group number field to GN (def: 0)\n"
+ " --help|-h print out usage message\n"
+ " --immed|-i command returns immediately when set "
+ "else wait\n"
+ " for 'sync' to complete\n"
+ " --lba=LBA|-l LBA logical block address to start sync "
+ "operation\n"
+ " from (def: 0)\n"
+ " --sync-nv|-s synchronize to non-volatile storage "
+ "(if distinct\n"
+ " from medium). Obsolete in sbc3r35d.\n"
+ " --timeout=SECS|-t SECS command timeout in seconds, only "
+ "active\n"
+ " if '--16' given (def: 60 seconds)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Performs a SCSI SYNCHRONIZE CACHE(10 or 16) command\n");
}
static int
@@ -104,14 +103,14 @@ ll_sync_cache_16(int sg_fd, int sync_nv, int immed, int group,
sg_put_unaligned_be32((uint32_t)num_lb, scCmdBlk + 10);
if (verbose) {
- fprintf(stderr, " synchronize cache(16) cdb: ");
+ pr2serr(" synchronize cache(16) cdb: ");
for (k = 0; k < SYNCHRONIZE_CACHE16_CMDLEN; ++k)
- fprintf(stderr, "%02x ", scCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", scCmdBlk[k]);
+ pr2serr("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "synchronize cache(16): out of memory\n");
+ pr2serr("synchronize cache(16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, scCmdBlk, sizeof(scCmdBlk));
@@ -166,7 +165,7 @@ int main(int argc, char * argv[])
case 'c':
count = sg_get_llnum(optarg);
if ((count < 0) || (count > UINT_MAX)) {
- fprintf(stderr, "bad argument to '--count'\n");
+ pr2serr("bad argument to '--count'\n");
return SG_LIB_SYNTAX_ERROR;
}
num_lb = (unsigned int)count;
@@ -174,7 +173,7 @@ int main(int argc, char * argv[])
case 'g':
group = sg_get_num(optarg);
if ((group < 0) || (group > 31)) {
- fprintf(stderr, "bad argument to '--group'\n");
+ pr2serr("bad argument to '--group'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -188,7 +187,7 @@ int main(int argc, char * argv[])
case 'l':
lba = sg_get_llnum(optarg);
if (lba < 0) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -201,7 +200,7 @@ int main(int argc, char * argv[])
case 't':
to_secs = sg_get_num(optarg);
if (to_secs < 0) {
- fprintf(stderr, "bad argument to '--timeout'\n");
+ pr2serr("bad argument to '--timeout'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -209,10 +208,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, "version: %s\n", version_str);
+ pr2serr("version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -224,21 +223,20 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, "open error: %s: %s\n", device_name,
+ pr2serr("open error: %s: %s\n", device_name,
safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -254,12 +252,12 @@ int main(int argc, char * argv[])
char b[80];
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Synchronize cache failed: %s\n", b);
+ pr2serr("Synchronize cache failed: %s\n", b);
}
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_test_rwbuf.c b/src/sg_test_rwbuf.c
index dbab7260..13d98e38 100644
--- a/src/sg_test_rwbuf.c
+++ b/src/sg_test_rwbuf.c
@@ -38,9 +38,10 @@
#include "sg_lib.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.08 20151208";
+static const char * version_str = "1.09 20151220";
#define BPI (signed)(sizeof(int))
@@ -103,10 +104,10 @@ int find_out_about_buffer (int sg_fd)
io_hdr.timeout = 60000; /* 60000 millisecs == 60 seconds */
if (verbose) {
- fprintf(stderr, " read buffer [mode desc] cdb: ");
+ pr2serr(" read buffer [mode desc] cdb: ");
for (k = 0; k < (int)sizeof(rbCmdBlk); ++k)
- fprintf(stderr, "%02x ", rbCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rbCmdBlk[k]);
+ pr2serr("\n");
}
if (ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
perror(ME "SG_IO READ BUFFER descriptor error");
@@ -236,10 +237,10 @@ int read_buffer (int sg_fd, unsigned size)
io_hdr.pack_id = 2;
io_hdr.timeout = 60000; /* 60000 millisecs == 60 seconds */
if (verbose) {
- fprintf(stderr, " read buffer [mode data] cdb: ");
+ pr2serr(" read buffer [mode data] cdb: ");
for (k = 0; k < (int)sizeof(rbCmdBlk); ++k)
- fprintf(stderr, "%02x ", rbCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rbCmdBlk[k]);
+ pr2serr("\n");
}
if (ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
@@ -293,10 +294,10 @@ int write_buffer (int sg_fd, unsigned size)
io_hdr.pack_id = 1;
io_hdr.timeout = 60000; /* 60000 millisecs == 60 seconds */
if (verbose) {
- fprintf(stderr, " write buffer [mode data] cdb: ");
+ pr2serr(" write buffer [mode data] cdb: ");
for (k = 0; k < (int)sizeof(wbCmdBlk); ++k)
- fprintf(stderr, "%02x ", wbCmdBlk[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", wbCmdBlk[k]);
+ pr2serr("\n");
}
if (ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
@@ -380,21 +381,21 @@ int main (int argc, char * argv[])
case 'r':
addread = sg_get_num(optarg);
if (-1 == addread) {
- fprintf(stderr, "bad argument to '--addrd'\n");
+ pr2serr("bad argument to '--addrd'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 's':
size = sg_get_num(optarg);
if (-1 == size) {
- fprintf(stderr, "bad argument to '--size'\n");
+ pr2serr("bad argument to '--size'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 't':
times = sg_get_num(optarg);
if (-1 == times) {
- fprintf(stderr, "bad argument to '--times'\n");
+ pr2serr("bad argument to '--times'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -402,13 +403,12 @@ int main (int argc, char * argv[])
verbose++;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n",
- version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'w':
addwrite = sg_get_num(optarg);
if (-1 == addwrite) {
- fprintf(stderr, "bad argument to '--addwr'\n");
+ pr2serr("bad argument to '--addwr'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -427,22 +427,21 @@ int main (int argc, char * argv[])
if (-1 == size) {
size = sg_get_num(argv[optind]);
if (-1 == size) {
- fprintf(stderr, "bad <sz>\n");
+ pr2serr("bad <sz>\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (++optind < argc) {
addwrite = sg_get_num(argv[optind]);
if (-1 == addwrite) {
- fprintf(stderr, "bad [addwr]\n");
+ pr2serr("bad [addwr]\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (++optind < argc) {
addread = sg_get_num(argv[optind]);
if (-1 == addread) {
- fprintf(stderr,
- "bad [addrd]\n");
+ pr2serr("bad [addrd]\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -452,20 +451,20 @@ int main (int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument"
- ": %s\n", argv[optind]);
+ pr2serr("Unexpected extra argument" ": %s\n",
+ argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "no device name given\n");
+ pr2serr("no device name given\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((size <= 0) && (! do_quick)) {
- fprintf(stderr, "must give '--size' or '--quick' options "
- "or <sz> argument\n");
+ pr2serr("must give '--size' or '--quick' options or <sz> "
+ "argument\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -485,8 +484,7 @@ int main (int argc, char * argv[])
goto err_out;
}
if (size > buf_capacity) {
- fprintf (stderr, ME "sz=%i > buf_capacity=%i\n",
- size, buf_capacity);
+ pr2serr (ME "sz=%i > buf_capacity=%i\n", size, buf_capacity);
ret = SG_LIB_CAT_OTHER;
goto err_out;
}
diff --git a/src/sg_timestamp.c b/src/sg_timestamp.c
index 22674901..2de784b5 100644
--- a/src/sg_timestamp.c
+++ b/src/sg_timestamp.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
@@ -25,6 +24,7 @@
#include "sg_pt.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -33,7 +33,7 @@
* to the given SCSI device. Based on spc5r07.pdf .
*/
-static const char * version_str = "1.00 20151201";
+static const char * version_str = "1.01 20151219";
#define REP_TIMESTAMP_CMDLEN 12
#define SET_TIMESTAMP_CMDLEN 12
@@ -76,26 +76,6 @@ static const char * ts_origin_arr[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
diff --git a/src/sg_turs.c b/src/sg_turs.c
index 3c69c004..1d6cc425 100644
--- a/src/sg_turs.c
+++ b/src/sg_turs.c
@@ -3,7 +3,7 @@
* data transfer (and no REQUEST SENSE command iff the unit is ready)
* then this can be used for timing per SCSI command overheads.
*
- * Copyright (C) 2000-2014 D. Gilbert
+ * Copyright (C) 2000-2015 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)
@@ -28,9 +28,10 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "3.30 20140514";
+static const char * version_str = "3.31 20151220";
#if defined(MSC_VER) || defined(__MINGW32__)
#define HAVE_MS_SLEEP
@@ -129,7 +130,7 @@ static int process_cl_new(struct opts_t * op, int argc, char * argv[])
case 'n':
n = sg_get_num(optarg);
if (n < 0) {
- fprintf(stderr, "bad argument to '--number='\n");
+ pr2serr("bad argument to '--number='\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -153,7 +154,7 @@ static int process_cl_new(struct opts_t * op, int argc, char * argv[])
++op->do_version;
break;
default:
- fprintf(stderr, "unrecognised option code %c [0x%x]\n", c, c);
+ pr2serr("unrecognised option code %c [0x%x]\n", c, c);
if (op->do_help)
break;
usage();
@@ -167,8 +168,7 @@ static int process_cl_new(struct opts_t * op, int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -228,15 +228,15 @@ static int process_cl_old(struct opts_t * op, int argc, char * argv[])
} else if (0 == strncmp("-old", cp, 4))
;
else if (jmp_out) {
- fprintf(stderr, "Unrecognized option: %s\n", cp);
+ pr2serr("Unrecognized option: %s\n", cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == op->device_name)
op->device_name = cp;
else {
- fprintf(stderr, "too many arguments, got: %s, not expecting: "
- "%s\n", op->device_name, cp);
+ pr2serr("too many arguments, got: %s, not expecting: %s\n",
+ op->device_name, cp);
usage_old();
return SG_LIB_SYNTAX_ERROR;
}
@@ -288,20 +288,20 @@ int main(int argc, char * argv[])
return 0;
}
if (op->do_version) {
- fprintf(stderr, "Version string: %s\n", version_str);
+ pr2serr("Version string: %s\n", version_str);
return 0;
}
if (NULL == op->device_name) {
- fprintf(stderr, "No DEVICE argument given\n");
+ pr2serr("No DEVICE argument given\n");
usage_for(op);
return SG_LIB_SYNTAX_ERROR;
}
if ((sg_fd = sg_cmds_open_device(op->device_name, 1 /* ro */,
op->do_verbose)) < 0) {
- fprintf(stderr, "sg_turs: error opening file: %s: %s\n",
- op->device_name, safe_strerror(-sg_fd));
+ pr2serr("sg_turs: error opening file: %s: %s\n", op->device_name,
+ safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (op->do_progress) {
diff --git a/src/sg_unmap.c b/src/sg_unmap.c
index fd7a5eaa..cdaba327 100644
--- a/src/sg_unmap.c
+++ b/src/sg_unmap.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -24,6 +23,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -31,7 +31,7 @@
* logical blocks.
*/
-static const char * version_str = "1.08 20151205";
+static const char * version_str = "1.09 20151219";
#define DEF_TIMEOUT_SECS 60
@@ -56,25 +56,6 @@ static struct option long_options[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
diff --git a/src/sg_verify.c b/src/sg_verify.c
index c0a551fe..47c3d8c3 100644
--- a/src/sg_verify.c
+++ b/src/sg_verify.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Douglas Gilbert.
+ * Copyright (c) 2004-2015 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.
@@ -20,6 +20,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
/* A utility program for the Linux OS SCSI subsystem.
*
@@ -63,61 +64,59 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_verify [--16] [--bpc=BPC] [--count=COUNT] [--dpo] "
- "[--ebytchk=BCH]\n"
- " [--group=GN] [--help] [--in=IF] "
- "[--lba=LBA] [--ndo=NDO]\n"
- " [--quiet] [--readonly] [--verbose] "
- "[--version]\n"
- " [--vrprotect=VRP] DEVICE\n"
- " where:\n"
- " --16|-S use VERIFY(16) (def: use "
- "VERIFY(10) )\n"
- " --bpc=BPC|-b BPC max blocks per verify command "
- "(def: 128)\n"
- " --count=COUNT|-c COUNT count of blocks to verify "
- "(def: 1).\n"
- " If BCH=3 then COUNT must "
- "be 1 .\n"
- " --dpo|-d disable page out (cache retention "
- "priority)\n"
- " --ebytchk=BCH|-E BCH sets BYTCHK value, either 1, 2 "
- "or 3 (def: 0).\n"
- " BCH overrides BYTCHK=1 set by "
- "'--ndo='. If\n"
- " BCH is 3 then NDO must be the LBA "
- "size\n"
- " (plus protection size if DIF "
- "active)\n"
- " --group=GN|-g GN set group number field to GN (def: 0)\n"
- " --help|-h print out usage message\n"
- " --in=IF|-i IF input from file called IF (def: "
- "stdin)\n"
- " only active if --bytchk=N given\n"
- " --lba=LBA|-l LBA logical block address to start "
- "verify (def: 0)\n"
- " --ndo=NDO|-n NDO NDO is number of bytes placed in "
- "data-out buffer.\n"
- " These are fetched from IF (or "
- "stdin) and used\n"
- " to verify the device data against. "
- "Forces\n"
- " --bpc=COUNT. Sets BYTCHK (byte check) "
- "to 1\n"
- " --quiet|-q suppress miscompare report to stderr, "
- "still\n"
- " causes an exit status of 14\n"
- " --readonly|-r open DEVICE read-only (def: open it "
- "read-write)\n"
- " --verbose|-v increase verbosity\n"
- " --version|-V print version string and exit\n"
- " --vrprotect=VRP|-P VRP set vrprotect field to VRP "
- "(def: 0)\n"
- "Performs one or more SCSI VERIFY(10) or SCSI VERIFY(16) "
- "commands. sbc3r34\nmade the BYTCHK field two bits wide "
- "(it was a single bit).\n"
- );
+ pr2serr("Usage: sg_verify [--16] [--bpc=BPC] [--count=COUNT] [--dpo] "
+ "[--ebytchk=BCH]\n"
+ " [--group=GN] [--help] [--in=IF] "
+ "[--lba=LBA] [--ndo=NDO]\n"
+ " [--quiet] [--readonly] [--verbose] "
+ "[--version]\n"
+ " [--vrprotect=VRP] DEVICE\n"
+ " where:\n"
+ " --16|-S use VERIFY(16) (def: use "
+ "VERIFY(10) )\n"
+ " --bpc=BPC|-b BPC max blocks per verify command "
+ "(def: 128)\n"
+ " --count=COUNT|-c COUNT count of blocks to verify "
+ "(def: 1).\n"
+ " If BCH=3 then COUNT must "
+ "be 1 .\n"
+ " --dpo|-d disable page out (cache retention "
+ "priority)\n"
+ " --ebytchk=BCH|-E BCH sets BYTCHK value, either 1, 2 "
+ "or 3 (def: 0).\n"
+ " BCH overrides BYTCHK=1 set by "
+ "'--ndo='. If\n"
+ " BCH is 3 then NDO must be the LBA "
+ "size\n"
+ " (plus protection size if DIF "
+ "active)\n"
+ " --group=GN|-g GN set group number field to GN (def: 0)\n"
+ " --help|-h print out usage message\n"
+ " --in=IF|-i IF input from file called IF (def: "
+ "stdin)\n"
+ " only active if --bytchk=N given\n"
+ " --lba=LBA|-l LBA logical block address to start "
+ "verify (def: 0)\n"
+ " --ndo=NDO|-n NDO NDO is number of bytes placed in "
+ "data-out buffer.\n"
+ " These are fetched from IF (or "
+ "stdin) and used\n"
+ " to verify the device data against. "
+ "Forces\n"
+ " --bpc=COUNT. Sets BYTCHK (byte check) "
+ "to 1\n"
+ " --quiet|-q suppress miscompare report to stderr, "
+ "still\n"
+ " causes an exit status of 14\n"
+ " --readonly|-r open DEVICE read-only (def: open it "
+ "read-write)\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n"
+ " --vrprotect=VRP|-P VRP set vrprotect field to VRP "
+ "(def: 0)\n"
+ "Performs one or more SCSI VERIFY(10) or SCSI VERIFY(16) "
+ "commands. sbc3r34\nmade the BYTCHK field two bits wide "
+ "(it was a single bit).\n");
}
int
@@ -162,7 +161,7 @@ main(int argc, char * argv[])
case 'b':
bpc = sg_get_num(optarg);
if (bpc < 1) {
- fprintf(stderr, "bad argument to '--bpc'\n");
+ pr2serr("bad argument to '--bpc'\n");
return SG_LIB_SYNTAX_ERROR;
}
++bpc_given;
@@ -170,7 +169,7 @@ main(int argc, char * argv[])
case 'c':
count = sg_get_llnum(optarg);
if (count < 0) {
- fprintf(stderr, "bad argument to '--count'\n");
+ pr2serr("bad argument to '--count'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -180,14 +179,14 @@ main(int argc, char * argv[])
case 'E':
bytchk = sg_get_num(optarg);
if ((bytchk < 1) || (bytchk > 3)) {
- fprintf(stderr, "bad argument to '--ebytchk'\n");
+ pr2serr("bad argument to '--ebytchk'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'g':
group = sg_get_num(optarg);
if ((group < 0) || (group > 31)) {
- fprintf(stderr, "bad argument to '--group'\n");
+ pr2serr("bad argument to '--group'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -201,7 +200,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
lba = (uint64_t)ll;
@@ -210,19 +209,19 @@ main(int argc, char * argv[])
case 'B': /* undocumented, old --bytchk=NDO option */
ndo = sg_get_num(optarg);
if (ndo < 1) {
- fprintf(stderr, "bad argument to '--ndo'\n");
+ pr2serr("bad argument to '--ndo'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'P':
vrprotect = sg_get_num(optarg);
if (-1 == vrprotect) {
- fprintf(stderr, "bad argument to '--vrprotect'\n");
+ pr2serr("bad argument to '--vrprotect'\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((vrprotect < 0) || (vrprotect > 7)) {
- fprintf(stderr, "'--vrprotect' requires a value from 0 to "
- "7 (inclusive)\n");
+ pr2serr("'--vrprotect' requires a value from 0 to 7 "
+ "(inclusive)\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -239,10 +238,10 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -254,8 +253,7 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -264,35 +262,35 @@ main(int argc, char * argv[])
if (0 == bytchk)
bytchk = 1;
if (bpc_given && (bpc != count))
- fprintf(stderr, "'bpc' argument ignored, using --bpc=%"
- PRIu64 "\n", count);
+ pr2serr("'bpc' argument ignored, using --bpc=%" PRIu64 "\n",
+ count);
if (count > 0x7fffffffLL) {
- fprintf(stderr, "count exceed 31 bits, way too large\n");
+ pr2serr("count exceed 31 bits, way too large\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((3 == bytchk) && (1 != count)) {
- fprintf(stderr, "count must be 1 when bytchk=3\n");
+ pr2serr("count must be 1 when bytchk=3\n");
return SG_LIB_SYNTAX_ERROR;
}
bpc = (int)count;
} else if (bytchk > 0) {
- fprintf(stderr, "when the 'ebytchk=BCH' option is given, "
- "then '--bytchk=NDO' must also be given\n");
+ pr2serr("when the 'ebytchk=BCH' option is given, then '--bytchk=NDO' "
+ "must also be given\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((bpc > 0xffff) && (0 == verify16)) {
- fprintf(stderr, "'%s' exceeds 65535, so use VERIFY(16)\n",
+ pr2serr("'%s' exceeds 65535, so use VERIFY(16)\n",
(ndo > 0) ? "count" : "bpc");
++verify16;
}
if (((lba + count - 1) > 0xffffffffLLU) && (0 == verify16)) {
- fprintf(stderr, "'lba' exceed 32 bits, so use VERIFY(16)\n");
+ pr2serr("'lba' exceed 32 bits, so use VERIFY(16)\n");
++verify16;
}
if ((group > 0) && (0 == verify16))
- fprintf(stderr, "group number ignored with VERIFY(10) command, "
- "use the --16 option\n");
+ pr2serr("group number ignored with VERIFY(10) command, use the --16 "
+ "option\n");
orig_count = count;
orig_lba = lba;
@@ -300,7 +298,7 @@ main(int argc, char * argv[])
if (ndo > 0) {
ref_data = (char *)malloc(ndo);
if (NULL == ref_data) {
- fprintf(stderr, "failed to allocate %d byte buffer\n", ndo);
+ pr2serr("failed to allocate %d byte buffer\n", ndo);
return SG_LIB_FILE_ERROR;
}
if ((NULL == file_name) || (0 == strcmp(file_name, "-"))) {
@@ -319,11 +317,11 @@ main(int argc, char * argv[])
perror("sg_set_binary_mode");
}
if (verbose && got_stdin)
- fprintf(stderr, "about to wait on STDIN\n");
+ pr2serr("about to wait on STDIN\n");
for (nread = 0; nread < ndo; nread += res) {
res = read(infd, ref_data + nread, ndo - nread);
if (res <= 0) {
- fprintf(stderr, "reading from %s failed at file offset=%d\n",
+ pr2serr("reading from %s failed at file offset=%d\n",
(got_stdin ? "stdin" : file_name), nread);
ret = SG_LIB_FILE_ERROR;
goto err_out;
@@ -334,15 +332,14 @@ main(int argc, char * argv[])
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
ret = SG_LIB_SYNTAX_ERROR;
goto err_out;
}
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
ret = SG_LIB_FILE_ERROR;
goto err_out;
}
@@ -364,30 +361,30 @@ main(int argc, char * argv[])
ret = res;
switch (res) {
case SG_LIB_CAT_ILLEGAL_REQ:
- fprintf(stderr, "bad field in %s cdb, near lba=0x%" PRIx64
- "\n", vc, lba);
+ pr2serr("bad field in %s cdb, near lba=0x%" PRIx64 "\n", vc,
+ lba);
break;
case SG_LIB_CAT_MEDIUM_HARD:
- fprintf(stderr, "%s medium or hardware error near "
- "lba=0x%" PRIx64 "\n", vc, lba);
+ pr2serr("%s medium or hardware error near lba=0x%" PRIx64 "\n",
+ vc, lba);
break;
case SG_LIB_CAT_MEDIUM_HARD_WITH_INFO:
if (verify16)
- fprintf(stderr, "%s medium or hardware error, reported "
- "lba=0x%" PRIx64 "\n", vc, info64);
+ pr2serr("%s medium or hardware error, reported lba=0x%"
+ PRIx64 "\n", vc, info64);
else
- fprintf(stderr, "%s medium or hardware error, reported "
- "lba=0x%x\n", vc, info);
+ pr2serr("%s medium or hardware error, reported lba=0x%x\n",
+ vc, info);
break;
case SG_LIB_CAT_MISCOMPARE:
if ((0 == quiet) || verbose)
- fprintf(stderr, "%s reported MISCOMPARE\n", vc);
+ pr2serr("%s reported MISCOMPARE\n", vc);
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "%s: %s\n", vc, b);
- fprintf(stderr, " failed near lba=%" PRIu64 " [0x%" PRIx64
- "]\n", lba, lba);
+ pr2serr("%s: %s\n", vc, b);
+ pr2serr(" failed near lba=%" PRIu64 " [0x%" PRIx64 "]\n",
+ lba, lba);
break;
}
break;
@@ -395,13 +392,13 @@ main(int argc, char * argv[])
}
if (verbose && (0 == ret) && (orig_count > 1))
- fprintf(stderr, "Verified %" PRId64 " [0x%" PRIx64 "] blocks from "
- "lba %" PRIu64 " [0x%" PRIx64 "]\n without error\n",
- orig_count, (uint64_t)orig_count, orig_lba, orig_lba);
+ pr2serr("Verified %" PRId64 " [0x%" PRIx64 "] blocks from lba %" PRIu64
+ " [0x%" PRIx64 "]\n without error\n", orig_count,
+ (uint64_t)orig_count, orig_lba, orig_lba);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
ret = SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index 6bf11f97..a37f0daf 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -26,6 +25,7 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* This utility program was originally written for the Linux OS SCSI subsystem.
@@ -227,26 +227,6 @@ static struct svpd_values_name_t standard_vpd_pg[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
diff --git a/src/sg_vpd_vendor.c b/src/sg_vpd_vendor.c
index f2eada3a..79f1304a 100644
--- a/src/sg_vpd_vendor.c
+++ b/src/sg_vpd_vendor.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
@@ -23,6 +22,8 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* This is a companion file to sg_vpd.c . It contains logic to output and
decode vendor specific VPD pages
@@ -188,26 +189,6 @@ static struct svpd_values_name_t vendor_vpd_pg[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static int
is_like_pdt(int actual_pdt, const struct svpd_values_name_t * vnp)
{
@@ -389,31 +370,22 @@ decode_vpd_c0_hp3par(unsigned char * buff, int len)
printf(" XCopy supported: %s\n", (buff[5] & 0x20) ? "yes" : "no");
if (rev > 3) {
- printf(" VV ID: %" PRIu64 "\n", ((uint64_t) buff[28] << 56) +
- ((uint64_t) buff[29] << 48) + ((uint64_t) buff[30] << 40) +
- ((uint64_t) buff[31] << 32) + ((uint64_t) buff[32] << 24) +
- (buff[33] << 16) + (buff[34] << 8) + buff[35]);
-
+ printf(" VV ID: %" PRIu64 "\n", sg_get_unaligned_be64(buff + 28));
offset = 44;
printf(" Volume name: %s\n", &buff[offset]);
- printf(" Domain ID: %d\n", (buff[36] << 24) + (buff[37] << 16) +
- (buff[38] << 8) + buff[39]);
+ printf(" Domain ID: %d\n", sg_get_unaligned_be32(buff + 36));
- offset += (buff[offset - 4] << 24) + (buff[offset - 3] << 16) +
- (buff[offset - 2] << 8) + buff[offset - 1] + 4;
+ offset += sg_get_unaligned_be32(buff + offset - 4) + 4;
printf(" Domain Name: %s\n", &buff[offset]);
- offset += (buff[offset - 4] << 24) + (buff[offset - 3] << 16) +
- (buff[offset - 2] << 8) + buff[offset - 1] + 4;
+ offset += sg_get_unaligned_be32(buff + offset - 4) + 4;
printf(" User CPG: %s\n", &buff[offset]);
- offset += (buff[offset - 4] << 24) + (buff[offset - 3] << 16) +
- (buff[offset - 2] << 8) + buff[offset - 1] + 4;
+ offset += sg_get_unaligned_be32(buff + offset - 4) + 4;
printf(" Snap CPG: %s\n", &buff[offset]);
- offset += (buff[offset - 4] << 24) + (buff[offset - 3] << 16) +
- (buff[offset - 2] << 8) + buff[offset - 1];
+ offset += sg_get_unaligned_be32(buff + offset - 4);
printf(" VV policies: %s,%s,%s,%s\n",
(buff[offset + 3] & 0x01) ? "stale_ss" : "no_stale_ss",
@@ -424,20 +396,13 @@ decode_vpd_c0_hp3par(unsigned char * buff, int len)
}
if (buff[5] & 0x04) {
- printf(" Allocation unit: %d\n", (buff[8] << 24) + (buff[9] << 16) +
- (buff[10] << 8) + buff[11]);
+ printf(" Allocation unit: %d\n", sg_get_unaligned_be32(buff + 8));
printf(" Data pool size: %" PRIu64 "\n",
- (((uint64_t)buff[12]) << 56) + (((uint64_t)buff[13]) << 48) +
- (((uint64_t)buff[14]) << 40) + (((uint64_t)buff[15]) << 32) +
- (((uint64_t)buff[16]) << 24) + (buff[17] << 16) +
- (buff[18] << 8) + buff[19]);
+ sg_get_unaligned_be64(buff + 12));
printf(" Space allocated: %" PRIu64 "\n",
- (((uint64_t)buff[20]) << 56) + (((uint64_t)buff[21]) << 48) +
- (((uint64_t)buff[22]) << 40) + (((uint64_t)buff[23]) << 32) +
- (((uint64_t)buff[24]) << 24) + (buff[25] << 16) +
- (buff[26] << 8) + buff[27]);
+ sg_get_unaligned_be64(buff + 20));
}
return;
}
@@ -642,7 +607,7 @@ decode_rdac_vpd_c0(unsigned char * buff, int len)
return;
}
printf(" Number of channels: %x\n", buff[8]);
- memsize = buff[10] << 8 | buff[11];
+ memsize = sg_get_unaligned_be16(buff + 10);
printf(" Processor Memory Size: %d\n", memsize);
memset(name, 0, 65);
memcpy(name, buff + 16, 64);
@@ -906,13 +871,13 @@ decode_rdac_vpd_c8(unsigned char * buff, int len)
printf(" Volume Unique Identifier: %s\n", uuid);
#ifndef SG_LIB_MINGW
- tstamp = (buff[24] << 24) + (buff[25] << 16) + (buff[26] << 8) + buff[27];
+ tstamp = sg_get_unaligned_be32(buff + 24);
printf(" Creation Number: %d, Timestamp: %s",
- (buff[22] << 8) + buff[23], ctime(&tstamp));
+ sg_get_unaligned_be16(buff + 22), ctime(&tstamp));
#else
printf(" Creation Number: %d, Timestamp value: %u",
- (buff[22] << 8) + buff[23],
- (buff[24] << 24) + (buff[25] << 16) + (buff[26] << 8) + buff[27]);
+ sg_get_unaligned_be16(buff + 22),
+ sg_get_unaligned_be32(buff + 24));
#endif
memset(label, 0, 61);
label_len = buff[28];
@@ -958,7 +923,7 @@ decode_rdac_vpd_c8(unsigned char * buff, int len)
break;
case TPROTO_ISCSI: /* iSCSI */
printf("iSCSI\n");
- n = (buff[177] << 8) + buff[178];
+ n = sg_get_unaligned_be32(buff + 177);
memcpy(port_id, &buff[179], n);
n = 179 + n;
break;
diff --git a/src/sg_wr_mode.c b/src/sg_wr_mode.c
index 58ed4c86..7f9513bb 100644
--- a/src/sg_wr_mode.c
+++ b/src/sg_wr_mode.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2014 Douglas Gilbert.
+ * Copyright (c) 2004-2015 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.
@@ -18,6 +18,8 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -25,7 +27,7 @@
* mode page on the given device.
*/
-static const char * version_str = "1.14 20140518";
+static const char * version_str = "1.15 20151220";
#define ME "sg_wr_mode: "
@@ -51,41 +53,40 @@ static struct option long_options[] = {
static void usage()
{
- fprintf(stderr, "Usage: "
- "sg_wr_mode [--contents=H,H...] [--dbd] [--force] [--help]\n"
- " [--len=10|6] [--mask=M,M...] "
- "[--page=PG[,SPG]] [--save]\n"
- " [--verbose] [--version] DEVICE\n"
- " where:\n"
- " --contents=H,H... | -c H,H... comma separated string "
- "of hex numbers\n"
- " that is mode page contents "
- "to write\n"
- " --contents=- | -c - read stdin for mode page contents"
- " to write\n"
- " --dbd | -d disable block descriptors (DBD bit"
- " in cdb)\n"
- " --force | -f force the contents to be written\n"
- " --help | -h print out usage message\n"
- " --len=10|6 | -l 10|6 use 10 byte (def) or 6 byte "
- "variants of\n"
- " SCSI MODE SENSE/SELECT commands\n"
- " --mask=M,M... | -m M,M... comma separated "
- "string of hex\n"
- " numbers that mask contents"
- " to write\n"
- " --page=PG | -p PG page_code to be written (in hex)\n"
- " --page=PG,SPG | -p PG,SPG page and subpage code to "
- "be\n"
- " written (in hex)\n"
- " --save | -s set 'save page' (SP) bit; default "
- "don't so\n"
- " only 'current' values changed\n"
- " --verbose | -v increase verbosity\n"
- " --version | -V print version string and exit\n\n"
- "writes given mode page with SCSI MODE SELECT (10 or 6) "
- "command\n"
- );
+ pr2serr("Usage: sg_wr_mode [--contents=H,H...] [--dbd] [--force] "
+ "[--help]\n"
+ " [--len=10|6] [--mask=M,M...] "
+ "[--page=PG[,SPG]] [--save]\n"
+ " [--verbose] [--version] DEVICE\n"
+ " where:\n"
+ " --contents=H,H... | -c H,H... comma separated string "
+ "of hex numbers\n"
+ " that is mode page contents "
+ "to write\n"
+ " --contents=- | -c - read stdin for mode page contents"
+ " to write\n"
+ " --dbd | -d disable block descriptors (DBD bit"
+ " in cdb)\n"
+ " --force | -f force the contents to be written\n"
+ " --help | -h print out usage message\n"
+ " --len=10|6 | -l 10|6 use 10 byte (def) or 6 byte "
+ "variants of\n"
+ " SCSI MODE SENSE/SELECT commands\n"
+ " --mask=M,M... | -m M,M... comma separated "
+ "string of hex\n"
+ " numbers that mask contents"
+ " to write\n"
+ " --page=PG | -p PG page_code to be written (in hex)\n"
+ " --page=PG,SPG | -p PG,SPG page and subpage code to "
+ "be\n"
+ " written (in hex)\n"
+ " --save | -s set 'save page' (SP) bit; default "
+ "don't so\n"
+ " only 'current' values changed\n"
+ " --verbose | -v increase verbosity\n"
+ " --version | -V print version string and exit\n\n"
+ "writes given mode page with SCSI MODE SELECT (10 or 6) "
+ "command\n");
}
@@ -140,8 +141,8 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
if (1 == sscanf(carry_over, "%x", &h))
mp_arr[off - 1] = h; /* back up and overwrite */
else {
- fprintf(stderr, "build_mode_page: carry_over error "
- "['%s'] around line %d\n", carry_over, j + 1);
+ pr2serr("build_mode_page: carry_over error ['%s'] "
+ "around line %d\n", carry_over, j + 1);
return 1;
}
lcp = line + 1;
@@ -160,16 +161,16 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
continue;
k = strspn(lcp, "0123456789aAbBcCdDeEfF ,\t");
if ((k < in_len) && ('#' != lcp[k])) {
- fprintf(stderr, "build_mode_page: syntax error at "
+ pr2serr("build_mode_page: syntax error at "
"line %d, pos %d\n", j + 1, m + k + 1);
return 1;
}
for (k = 0; k < 1024; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "build_mode_page: hex number "
- "larger than 0xff in line %d, pos %d\n",
- j + 1, (int)(lcp - line + 1));
+ pr2serr("%s: hex number larger than 0xff in line %d, "
+ "pos %d\n", __func__, j + 1,
+ (int)(lcp - line + 1));
return 1;
}
if (split_line && (1 == strlen(lcp))) {
@@ -177,8 +178,7 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
carry_over[0] = *lcp;
}
if ((off + k) >= max_arr_len) {
- fprintf(stderr, "build_mode_page: array length "
- "exceeded\n");
+ pr2serr("%s: array length exceeded\n", __func__);
return 1;
}
mp_arr[off + k] = h;
@@ -193,9 +193,8 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
--k;
break;
}
- fprintf(stderr, "build_mode_page: error in "
- "line %d, at pos %d\n", j + 1,
- (int)(lcp - line + 1));
+ pr2serr("%s: error in line %d, at pos %d\n", __func__,
+ j + 1, (int)(lcp - line + 1));
return 1;
}
}
@@ -205,14 +204,14 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
} else { /* hex string on command line */
k = strspn(inp, "0123456789aAbBcCdDeEfF, ");
if (in_len != k) {
- fprintf(stderr, "build_mode_page: error at pos %d\n", k + 1);
+ pr2serr("%s: error at pos %d\n", __func__, k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "build_mode_page: hex number larger "
- "than 0xff at pos %d\n", (int)(lcp - inp + 1));
+ pr2serr("%s: hex number larger than 0xff at pos %d\n",
+ __func__, (int)(lcp - inp + 1));
return 1;
}
mp_arr[k] = h;
@@ -226,14 +225,14 @@ static int build_mode_page(const char * inp, unsigned char * mp_arr,
cp = c2p;
lcp = cp + 1;
} else {
- fprintf(stderr, "build_mode_page: error at pos %d\n",
+ pr2serr("%s: error at pos %d\n", __func__,
(int)(lcp - inp + 1));
return 1;
}
}
*mp_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_mode_page: array length exceeded\n");
+ pr2serr("%s: array length exceeded\n", __func__);
return 1;
}
}
@@ -260,19 +259,19 @@ static int build_mask(const char * inp, unsigned char * mask_arr,
if (0 == in_len)
*mask_arr_len = 0;
if ('-' == inp[0]) { /* read from stdin */
- fprintf(stderr, "'--mask' does not accept input from stdin\n");
+ pr2serr("'--mask' does not accept input from stdin\n");
return 1;
} else { /* hex string on command line */
k = strspn(inp, "0123456789aAbBcCdDeEfF, ");
if (in_len != k) {
- fprintf(stderr, "build_mode_page: error at pos %d\n", k + 1);
+ pr2serr("%s: error at pos %d\n", __func__, k + 1);
return 1;
}
for (k = 0; k < max_arr_len; ++k) {
if (1 == sscanf(lcp, "%x", &h)) {
if (h > 0xff) {
- fprintf(stderr, "build_mode_page: hex number larger "
- "than 0xff at pos %d\n", (int)(lcp - inp + 1));
+ pr2serr("%s: hex number larger than 0xff at pos %d\n",
+ __func__, (int)(lcp - inp + 1));
return 1;
}
mask_arr[k] = h;
@@ -286,14 +285,14 @@ static int build_mask(const char * inp, unsigned char * mask_arr,
cp = c2p;
lcp = cp + 1;
} else {
- fprintf(stderr, "build_mode_page: error at pos %d\n",
+ pr2serr("%s: error at pos %d\n", __func__,
(int)(lcp - inp + 1));
return 1;
}
}
*mask_arr_len = k + 1;
if (k == max_arr_len) {
- fprintf(stderr, "build_mode_page: array length exceeded\n");
+ pr2serr("%s: array length exceeded\n", __func__);
return 1;
}
}
@@ -338,7 +337,7 @@ int main(int argc, char * argv[])
memset(read_in, 0, sizeof(read_in));
if (0 != build_mode_page(optarg, read_in, &read_in_len,
sizeof(read_in))) {
- fprintf(stderr, "bad argument to '--contents'\n");
+ pr2serr("bad argument to '--contents'\n");
return SG_LIB_SYNTAX_ERROR;
}
got_contents = 1;
@@ -358,7 +357,7 @@ int main(int argc, char * argv[])
if ((1 == num) && ((6 == res) || (10 == res)))
mode_6 = (6 == res) ? 1 : 0;
else {
- fprintf(stderr, "length (of cdb) must be 6 or 10\n");
+ pr2serr("length (of cdb) must be 6 or 10\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -366,7 +365,7 @@ int main(int argc, char * argv[])
memset(mask_in, 0xff, sizeof(mask_in));
if (0 != build_mask(optarg, mask_in, &mask_in_len,
sizeof(mask_in))) {
- fprintf(stderr, "bad argument to '--mask'\n");
+ pr2serr("bad argument to '--mask'\n");
return SG_LIB_SYNTAX_ERROR;
}
got_mask = 1;
@@ -375,22 +374,20 @@ int main(int argc, char * argv[])
if (NULL == strchr(optarg, ',')) {
num = sscanf(optarg, "%x", &u);
if ((1 != num) || (u > 62)) {
- fprintf(stderr, "Bad page code value after '--page' "
- "switch\n");
+ pr2serr("Bad page code value after '--page' switch\n");
return SG_LIB_SYNTAX_ERROR;
}
pg_code = u;
} else if (2 == sscanf(optarg, "%x,%x", &u, &uu)) {
if (uu > 254) {
- fprintf(stderr, "Bad sub page code value after '--page'"
- " switch\n");
+ pr2serr("Bad sub page code value after '--page' switch\n");
return SG_LIB_SYNTAX_ERROR;
}
pg_code = u;
sub_pg_code = uu;
} else {
- fprintf(stderr, "Bad page code, subpage code sequence after "
- "'--page' switch\n");
+ pr2serr("Bad page code, subpage code sequence after '--page' "
+ "switch\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -401,10 +398,10 @@ int main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -416,32 +413,30 @@ int main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (pg_code < 0) {
- fprintf(stderr, "need page code (see '--page=')\n");
+ pr2serr("need page code (see '--page=')\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (got_mask && force) {
- fprintf(stderr, "cannot use both '--force' and '--mask'\n");
+ pr2serr("cannot use both '--force' and '--mask'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (0 == sg_simple_inquiry(sg_fd, &inq_data, 0, verbose))
@@ -462,17 +457,17 @@ int main(int argc, char * argv[])
ret = res;
if (res) {
if (SG_LIB_CAT_INVALID_OP == res)
- fprintf(stderr, "MODE SENSE (%d) not supported, try '--len=%d'\n",
+ pr2serr("MODE SENSE (%d) not supported, try '--len=%d'\n",
(mode_6 ? 6 : 10), (mode_6 ? 10 : 6));
else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), b);
+ pr2serr("MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), b);
}
goto err_out;
}
off = sg_mode_page_offset(ref_md, alloc_len, mode_6, ebuff, EBUFF_SZ);
if (off < 0) {
- fprintf(stderr, "MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), ebuff);
+ pr2serr("MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), ebuff);
goto err_out;
}
if (mode_6) {
@@ -481,12 +476,12 @@ int main(int argc, char * argv[])
bd_len = ref_md[3];
} else {
hdr_len = 8;
- md_len = (ref_md[0] << 8) + ref_md[1] + 2;
- bd_len = (ref_md[6] << 8) + ref_md[7];
+ md_len = sg_get_unaligned_be16(ref_md + 0) + 2;
+ bd_len = sg_get_unaligned_be16(ref_md + 6);
}
if (got_contents) {
if (read_in_len < 2) {
- fprintf(stderr, "contents length=%d too short\n", read_in_len);
+ pr2serr("contents length=%d too short\n", read_in_len);
goto err_out;
}
ref_md[0] = 0; /* mode data length reserved for mode select */
@@ -495,8 +490,8 @@ int main(int argc, char * argv[])
if (0 == pdt) /* for disks mask out DPOFUA bit */
ref_md[mode_6 ? 2 : 3] &= 0xef;
if (md_len > alloc_len) {
- fprintf(stderr, "mode data length=%d exceeds allocation "
- "length=%d\n", md_len, alloc_len);
+ pr2serr("mode data length=%d exceeds allocation length=%d\n",
+ md_len, alloc_len);
goto err_out;
}
if (got_mask) {
@@ -512,28 +507,28 @@ int main(int argc, char * argv[])
}
if (! force) {
if ((! (ref_md[off] & 0x80)) && save) {
- fprintf(stderr, "PS bit in existing mode page indicates that "
- "it is not saveable\n but '--save' option given\n");
+ pr2serr("PS bit in existing mode page indicates that it is "
+ "not saveable\n but '--save' option given\n");
goto err_out;
}
read_in[0] &= 0x7f; /* mask out PS bit, reserved in mode select */
if ((md_len - off) != read_in_len) {
- fprintf(stderr, "contents length=%d but reference mode page "
+ pr2serr("contents length=%d but reference mode page "
"length=%d\n", read_in_len, md_len - off);
goto err_out;
}
if (pg_code != (read_in[0] & 0x3f)) {
- fprintf(stderr, "contents page_code=0x%x but reference "
+ pr2serr("contents page_code=0x%x but reference "
"page_code=0x%x\n", (read_in[0] & 0x3f), pg_code);
goto err_out;
}
if ((read_in[0] & 0x40) != (ref_md[off] & 0x40)) {
- fprintf(stderr, "contents flags subpage but reference page"
- "does not (or vice versa)\n");
+ pr2serr("contents flags subpage but reference page does not "
+ "(or vice versa)\n");
goto err_out;
}
if ((read_in[0] & 0x40) && (read_in[1] != sub_pg_code)) {
- fprintf(stderr, "contents subpage_code=0x%x but reference "
+ pr2serr("contents subpage_code=0x%x but reference "
"sub_page_code=0x%x\n", read_in[1], sub_pg_code);
goto err_out;
}
@@ -550,7 +545,7 @@ int main(int argc, char * argv[])
ret = res;
if (res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "MODE SELECT (%d): %s\n", (mode_6 ? 6 : 10), b);
+ pr2serr("MODE SELECT (%d): %s\n", (mode_6 ? 6 : 10), b);
goto err_out;
}
} else {
@@ -568,7 +563,7 @@ int main(int argc, char * argv[])
err_out:
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_write_buffer.c b/src/sg_write_buffer.c
index 1aecafed..0e2f1bc1 100644
--- a/src/sg_write_buffer.c
+++ b/src/sg_write_buffer.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <ctype.h>
#include <string.h>
#include <getopt.h>
@@ -24,12 +23,13 @@
#include "sg_cmds_extra.h"
#include "sg_pt.h" /* needed for scsi_pt_win32_direct() */
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/*
* This utility issues the SCSI WRITE BUFFER command to the given device.
*/
-static const char * version_str = "1.20 20150217"; /* spc5r02 */
+static const char * version_str = "1.21 20151219"; /* spc5r02 */
#define ME "sg_write_buffer: "
#define DEF_XFER_LEN (8 * 1024 * 1024)
@@ -57,26 +57,6 @@ static struct option long_options[] = {
{0, 0, 0, 0},
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
diff --git a/src/sg_write_long.c b/src/sg_write_long.c
index 356fbed5..3f92a9da 100644
--- a/src/sg_write_long.c
+++ b/src/sg_write_long.c
@@ -1,5 +1,5 @@
/* A utility program for the Linux OS SCSI subsystem.
- * Copyright (C) 2004-2014 D. Gilbert
+ * Copyright (C) 2004-2015 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)
@@ -30,8 +30,9 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.1( 20140516";
+static const char * version_str = "1.11 20151220";
#define MAX_XFER_LEN 10000
@@ -61,8 +62,7 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_write_long [--16] [--cor_dis] [--help] [--in=IF] "
+ pr2serr("Usage: sg_write_long [--16] [--cor_dis] [--help] [--in=IF] "
"[--lba=LBA]\n"
" [--pblock] [--verbose] [--version] "
"[--wr_uncor]\n"
@@ -136,7 +136,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
llba = (uint64_t)ll;
@@ -151,7 +151,7 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'w':
wr_uncor = 1;
@@ -159,12 +159,12 @@ main(int argc, char * argv[])
case 'x':
xfer_len = sg_get_num(optarg);
if (-1 == xfer_len) {
- fprintf(stderr, "bad argument to '--xfer_len'\n");
+ pr2serr("bad argument to '--xfer_len'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -176,40 +176,38 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (wr_uncor)
xfer_len = 0;
else if (xfer_len >= MAX_XFER_LEN) {
- fprintf(stderr, "xfer_len (%d) is out of range ( < %d)\n",
- xfer_len, MAX_XFER_LEN);
+ pr2serr("xfer_len (%d) is out of range ( < %d)\n", xfer_len,
+ MAX_XFER_LEN);
usage();
return SG_LIB_SYNTAX_ERROR;
}
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
if (wr_uncor) {
if ('\0' != file_name[0])
- fprintf(stderr, ">>> warning: when '--wr_uncor' given "
- "'-in=' is ignored\n");
+ pr2serr(">>> warning: when '--wr_uncor' given '-in=' is "
+ "ignored\n");
} else {
if (NULL == (rawp = malloc(MAX_XFER_LEN))) {
- fprintf(stderr, ME "out of memory\n");
+ pr2serr(ME "out of memory\n");
ret = SG_LIB_FILE_ERROR;
goto err_out;
}
@@ -240,17 +238,17 @@ main(int argc, char * argv[])
goto err_out;
}
if (res < xfer_len) {
- fprintf(stderr, "tried to read %d bytes from %s, got %d "
- "bytes\n", xfer_len, file_name, res);
- fprintf(stderr, "pad with 0xff bytes and continue\n");
+ pr2serr("tried to read %d bytes from %s, got %d bytes\n",
+ xfer_len, file_name, res);
+ pr2serr("pad with 0xff bytes and continue\n");
}
if (! got_stdin)
close(infd);
}
}
if (verbose)
- fprintf(stderr, ME "issue write long to device %s\n\t\txfer_len= %d "
- "(0x%x), lba=%" PRIu64 " (0x%" PRIx64 ")\n cor_dis=%d, "
+ pr2serr(ME "issue write long to device %s\n\t\txfer_len= %d (0x%x), "
+ "lba=%" PRIu64 " (0x%" PRIx64 ")\n cor_dis=%d, "
"wr_uncor=%d, pblock=%d\n", device_name, xfer_len, xfer_len,
llba, llba, cor_dis, wr_uncor, pblock);
@@ -267,12 +265,12 @@ main(int argc, char * argv[])
case 0:
break;
case SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO:
- fprintf(stderr, "<<< device indicates 'xfer_len' should be %d "
- ">>>\n", xfer_len - offset);
+ pr2serr("<<< device indicates 'xfer_len' should be %d >>>\n",
+ xfer_len - offset);
break;
default:
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, " SCSI WRITE LONG (%s): %s\n", ten_or, b);
+ pr2serr(" SCSI WRITE LONG (%s): %s\n", ten_or, b);
break;
}
@@ -281,7 +279,7 @@ err_out:
free(rawp);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_write_same.c b/src/sg_write_same.c
index 54a47c72..486e1ad4 100644
--- a/src/sg_write_same.c
+++ b/src/sg_write_same.c
@@ -26,8 +26,9 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.10 20151201";
+static const char * version_str = "1.11 20151220";
#define ME "sg_write_same: "
@@ -94,9 +95,8 @@ struct opts_t {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_write_same [--10] [--16] [--32] [--anchor] [--grpnum=GN] "
- "[--help]\n"
+ pr2serr("Usage: sg_write_same [--10] [--16] [--32] [--anchor] "
+ "[--grpnum=GN] [--help]\n"
" [--in=IF] [--lba=LBA] [--lbdata] "
"[--ndob] [--num=NUM]\n"
" [--pbdata] [--timeout=TO] [--unmap] "
@@ -163,12 +163,11 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
"cdb";
if (op->numblocks > 0xffff)
- fprintf(stderr, "%s since blocks exceed 65535\n", cp);
+ pr2serr("%s since blocks exceed 65535\n", cp);
else if (llba > ULONG_MAX)
- fprintf(stderr, "%s since LBA may exceed 32 bits\n", cp);
+ pr2serr("%s since LBA may exceed 32 bits\n", cp);
else
- fprintf(stderr, "%s due to ndob or unmap settings\n",
- cp);
+ pr2serr("%s due to ndob or unmap settings\n", cp);
}
}
}
@@ -232,24 +231,24 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
sg_put_unaligned_be32((uint32_t)op->numblocks, wsCmdBlk + 28);
break;
default:
- fprintf(stderr, "do_write_same: bad cdb length %d\n", cdb_len);
+ pr2serr("do_write_same: bad cdb length %d\n", cdb_len);
return -1;
}
if (op->verbose > 1) {
- fprintf(stderr, " Write same(%d) cmd: ", cdb_len);
+ pr2serr(" Write same(%d) cmd: ", cdb_len);
for (k = 0; k < cdb_len; ++k)
- fprintf(stderr, "%02x ", wsCmdBlk[k]);
- fprintf(stderr, "\n Data-out buffer length=%d\n",
+ pr2serr("%02x ", wsCmdBlk[k]);
+ pr2serr("\n Data-out buffer length=%d\n",
op->xfer_len);
}
if ((op->verbose > 3) && (op->xfer_len > 0)) {
- fprintf(stderr, " Data-out buffer contents:\n");
+ pr2serr(" Data-out buffer contents:\n");
dStrHexErr((const char *)dataoutp, op->xfer_len, 1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "Write same(%d): out of memory\n", cdb_len);
+ pr2serr("Write same(%d): out of memory\n", cdb_len);
return -1;
}
set_scsi_pt_cdb(ptvp, wsCmdBlk, cdb_len);
@@ -274,8 +273,8 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
slen = get_scsi_pt_sense_len(ptvp);
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);
}
ret = sense_cat;
break;
@@ -332,7 +331,7 @@ main(int argc, char * argv[])
case 'g':
op->grpnum = sg_get_num(optarg);
if ((op->grpnum < 0) || (op->grpnum > 31)) {
- fprintf(stderr, "bad argument to '--grpnum'\n");
+ pr2serr("bad argument to '--grpnum'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -347,7 +346,7 @@ main(int argc, char * argv[])
case 'l':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
op->lba = (uint64_t)ll;
@@ -359,7 +358,7 @@ main(int argc, char * argv[])
case 'n':
op->numblocks = sg_get_num(optarg);
if (op->numblocks < 0) {
- fprintf(stderr, "bad argument to '--num'\n");
+ pr2serr("bad argument to '--num'\n");
return SG_LIB_SYNTAX_ERROR;
}
num_given = 1;
@@ -375,8 +374,7 @@ main(int argc, char * argv[])
break;
case 'S':
if (DEF_WS_CDB_SIZE != op->pref_cdb_size) {
- fprintf(stderr, "only one '--10', '--16' or '--32' "
- "please\n");
+ pr2serr("only one '--10', '--16' or '--32' please\n");
return SG_LIB_SYNTAX_ERROR;
}
op->pref_cdb_size = 16;
@@ -384,14 +382,13 @@ main(int argc, char * argv[])
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");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'T':
if (DEF_WS_CDB_SIZE != op->pref_cdb_size) {
- fprintf(stderr, "only one '--10', '--16' or '--32' "
- "please\n");
+ pr2serr("only one '--10', '--16' or '--32' please\n");
return SG_LIB_SYNTAX_ERROR;
}
op->pref_cdb_size = 32;
@@ -403,24 +400,24 @@ main(int argc, char * argv[])
++op->verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'w':
op->wrprotect = sg_get_num(optarg);
if ((op->wrprotect < 0) || (op->wrprotect > 7)) {
- fprintf(stderr, "bad argument to '--wrprotect'\n");
+ pr2serr("bad argument to '--wrprotect'\n");
return SG_LIB_SYNTAX_ERROR;
}
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");
return SG_LIB_SYNTAX_ERROR;
}
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -432,37 +429,36 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (op->want_ws10 && (DEF_WS_CDB_SIZE != op->pref_cdb_size)) {
- fprintf(stderr, "only one '--10', '--16' or '--32' please\n");
+ pr2serr("only one '--10', '--16' or '--32' please\n");
return SG_LIB_SYNTAX_ERROR;
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
vb = op->verbose;
if ((! if_given) && (! lba_given) && (! num_given)) {
- fprintf(stderr, "As a precaution, one of '--in=', '--lba=' or "
- "'--num=' is required\n");
+ pr2serr("As a precaution, one of '--in=', '--lba=' or '--num=' is "
+ "required\n");
return SG_LIB_SYNTAX_ERROR;
}
if (op->ndob) {
if (if_given) {
- fprintf(stderr, "Can't have both --ndob and '--in='\n");
+ pr2serr("Can't have both --ndob and '--in='\n");
return SG_LIB_SYNTAX_ERROR;
}
if (0 != op->xfer_len) {
- fprintf(stderr, "With --ndob only '--xferlen=0' (or not given) "
- "is acceptable\n");
+ pr2serr("With --ndob only '--xferlen=0' (or not given) is "
+ "acceptable\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (op->ifilename[0]) {
@@ -471,8 +467,8 @@ main(int argc, char * argv[])
memset(&a_stat, 0, sizeof(a_stat));
if (stat(op->ifilename, &a_stat) < 0) {
if (vb)
- fprintf(stderr, "unable to stat(%s): %s\n",
- op->ifilename, safe_strerror(errno));
+ pr2serr("unable to stat(%s): %s\n", op->ifilename,
+ safe_strerror(errno));
return SG_LIB_FILE_ERROR;
}
if (op->xfer_len <= 0)
@@ -482,8 +478,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, vb);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -493,8 +488,7 @@ main(int argc, char * argv[])
res = sg_ll_readcap_16(sg_fd, 0 /* pmi */, 0 /* llba */, resp_buff,
RCAP16_RESP_LEN, 1, (vb ? (vb - 1): 0));
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Read capacity(16) unit attention, try "
- "again\n");
+ pr2serr("Read capacity(16) unit attention, try again\n");
res = sg_ll_readcap_16(sg_fd, 0, 0, resp_buff,
RCAP16_RESP_LEN, 1, (vb ? (vb - 1): 0));
}
@@ -509,8 +503,8 @@ main(int argc, char * argv[])
} else if ((SG_LIB_CAT_INVALID_OP == res) ||
(SG_LIB_CAT_ILLEGAL_REQ == res)) {
if (vb)
- fprintf(stderr, "Read capacity(16) not supported, try "
- "Read capacity(10)\n");
+ pr2serr("Read capacity(16) not supported, try Read "
+ "capacity(10)\n");
res = sg_ll_readcap_10(sg_fd, 0 /* pmi */, 0 /* lba */,
resp_buff, RCAP10_RESP_LEN, 1,
(vb ? (vb - 1): 0));
@@ -522,31 +516,31 @@ main(int argc, char * argv[])
op->xfer_len = block_size;
} else {
sg_get_category_sense_str(res, sizeof(b), b, vb);
- fprintf(stderr, "Read capacity(10): %s\n", b);
- fprintf(stderr, "Unable to calculate block size\n");
+ pr2serr("Read capacity(10): %s\n", b);
+ pr2serr("Unable to calculate block size\n");
}
} else if (vb) {
sg_get_category_sense_str(res, sizeof(b), b, vb);
- fprintf(stderr, "Read capacity(16): %s\n", b);
- fprintf(stderr, "Unable to calculate block size\n");
+ pr2serr("Read capacity(16): %s\n", b);
+ pr2serr("Unable to calculate block size\n");
}
}
if (op->xfer_len < 1) {
- fprintf(stderr, "unable to deduce block size, please give "
- "'--xferlen=' argument\n");
+ pr2serr("unable to deduce block size, please give '--xferlen=' "
+ "argument\n");
ret = SG_LIB_SYNTAX_ERROR;
goto err_out;
}
if (op->xfer_len > MAX_XFER_LEN) {
- fprintf(stderr, "'--xferlen=%d is out of range ( want <= %d)\n",
+ pr2serr("'--xferlen=%d is out of range ( want <= %d)\n",
op->xfer_len, MAX_XFER_LEN);
ret = SG_LIB_SYNTAX_ERROR;
goto err_out;
}
wBuff = (unsigned char*)calloc(op->xfer_len, 1);
if (NULL == wBuff) {
- fprintf(stderr, "unable to allocate %d bytes of memory with "
- "calloc()\n", op->xfer_len);
+ pr2serr("unable to allocate %d bytes of memory with calloc()\n",
+ op->xfer_len);
ret = SG_LIB_SYNTAX_ERROR;
goto err_out;
}
@@ -576,22 +570,22 @@ main(int argc, char * argv[])
goto err_out;
}
if (res < op->xfer_len) {
- fprintf(stderr, "tried to read %d bytes from %s, got %d "
- "bytes\n", op->xfer_len, op->ifilename, res);
- fprintf(stderr, " so pad with 0x0 bytes and continue\n");
+ pr2serr("tried to read %d bytes from %s, got %d bytes\n",
+ op->xfer_len, op->ifilename, res);
+ pr2serr(" so pad with 0x0 bytes and continue\n");
}
if (! got_stdin)
close(infd);
} else {
if (vb)
- fprintf(stderr, "Default data-out buffer set to %d zeros\n",
+ pr2serr("Default data-out buffer set to %d zeros\n",
op->xfer_len);
if (prot_en && (op->wrprotect > 0)) {
/* default for protection is 0xff, rest get 0x0 */
memset(wBuff + op->xfer_len - 8, 0xff, 8);
if (vb)
- fprintf(stderr, " ... apart from last 8 bytes which are "
- "set to 0xff\n");
+ pr2serr(" ... apart from last 8 bytes which are set to "
+ "0xff\n");
}
}
}
@@ -599,7 +593,7 @@ main(int argc, char * argv[])
ret = do_write_same(sg_fd, op, wBuff, &act_cdb_len);
if (ret) {
sg_get_category_sense_str(ret, sizeof(b), b, vb);
- fprintf(stderr, "Write same(%d): %s\n", act_cdb_len, b);
+ pr2serr("Write same(%d): %s\n", act_cdb_len, b);
}
err_out:
@@ -607,7 +601,7 @@ err_out:
free(wBuff);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
diff --git a/src/sg_write_verify.c b/src/sg_write_verify.c
index 67f9ce13..e5412fbb 100644
--- a/src/sg_write_verify.c
+++ b/src/sg_write_verify.c
@@ -33,8 +33,9 @@
#include "sg_pt.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.07 20151201";
+static const char * version_str = "1.08 20151220";
#define ME "sg_write_verify: "
@@ -74,8 +75,7 @@ static struct option long_options[] = {
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sg_write_verify [--16] [--bytchk=BC] [--dpo] [--group=GN] "
+ pr2serr("Usage: sg_write_verify [--16] [--bytchk=BC] [--dpo] [--group=GN] "
"[--help]\n"
" [--ilen=IL] [--in=IF] --lba=LBA "
"[--num=NUM]\n"
@@ -129,18 +129,18 @@ run_scsi_transaction(int sg_fd, const unsigned char *cdbp, int cdb_len,
snprintf(b, sizeof(b), "Write and verify(%d)", cdb_len);
if (verbose) {
- fprintf(stderr, " %s cmd: ", b);
+ pr2serr(" %s cmd: ", b);
for (k = 0; k < cdb_len; ++k)
- fprintf(stderr, "%02x ", cdbp[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", cdbp[k]);
+ pr2serr("\n");
if ((verbose > 2) && dop && do_len) {
- fprintf(stderr, " Data out buffer [%d bytes]:\n", do_len);
+ pr2serr(" Data out buffer [%d bytes]:\n", do_len);
dStrHexErr((const char *)dop, do_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(stderr, "%s: out of memory\n", b);
+ pr2serr("%s: out of memory\n", b);
return -1;
}
set_scsi_pt_cdb(ptvp, cdbp, cdb_len);
@@ -165,8 +165,8 @@ run_scsi_transaction(int sg_fd, const unsigned char *cdbp, int cdb_len,
slen = get_scsi_pt_sense_len(ptvp);
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);
}
ret = sense_cat;
break;
@@ -246,8 +246,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,
- safe_strerror(errno));
+ pr2serr(ME "open error: %s: %s\n", fn, safe_strerror(errno));
return -SG_LIB_FILE_ERROR;
}
}
@@ -303,8 +302,7 @@ main(int argc, char * argv[])
* sbc4r02 (not =2 nor =3) but that may change in the future. */
bytchk = sg_get_num(optarg);
if ((bytchk < 0) || (bytchk > 3)) {
- fprintf(stderr, "argument to '--bytchk' expected to be 0 "
- "to 3\n");
+ pr2serr("argument to '--bytchk' expected to be 0 to 3\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -314,8 +312,7 @@ main(int argc, char * argv[])
case 'g':
group = sg_get_num(optarg);
if ((group < 0) || (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");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -330,18 +327,18 @@ main(int argc, char * argv[])
case 'I':
ilen = sg_get_num(optarg);
if (-1 == ilen) {
- fprintf(stderr, "bad argument to '--ilen'\n");
+ pr2serr("bad argument to '--ilen'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
case 'l':
if (lba_given) {
- fprintf(stderr, "must have one and only one '--lba'\n");
+ pr2serr("must have one and only one '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
ll = sg_get_llnum(optarg);
if (ll < 0) {
- fprintf(stderr, "bad argument to '--lba'\n");
+ pr2serr("bad argument to '--lba'\n");
return SG_LIB_SYNTAX_ERROR;
}
llba = (uint64_t)ll;
@@ -350,7 +347,7 @@ main(int argc, char * argv[])
case 'n':
n = sg_get_num(optarg);
if (-1 == n) {
- fprintf(stderr, "bad argument to '--num'\n");
+ pr2serr("bad argument to '--num'\n");
return SG_LIB_SYNTAX_ERROR;
}
num_lb = (uint32_t)n;
@@ -365,7 +362,7 @@ main(int argc, char * argv[])
case 't':
timeout = sg_get_num(optarg);
if (timeout < 1) {
- fprintf(stderr, "bad argument to '--timeout'\n");
+ pr2serr("bad argument to '--timeout'\n");
return SG_LIB_SYNTAX_ERROR;
}
break;
@@ -373,19 +370,19 @@ main(int argc, char * argv[])
++verbose;
break;
case 'V':
- fprintf(stderr, ME "version: %s\n", version_str);
+ pr2serr(ME "version: %s\n", version_str);
return 0;
case 'w':
wrprotect = sg_get_num(optarg);
if ((wrprotect < 0) || (wrprotect > 7)) {
- fprintf(stderr, "wrprotect (%d) is out of range ( < %d)\n",
- wrprotect, 7);
+ pr2serr("wrprotect (%d) is out of range ( < %d)\n", wrprotect,
+ 7);
return SG_LIB_SYNTAX_ERROR;
}
break;
default:
- fprintf(stderr, "unrecognised option code 0x%x ??\n", c);
+ pr2serr("unrecognised option code 0x%x ??\n", c);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -397,38 +394,37 @@ main(int argc, char * argv[])
}
if (optind < argc) {
for (; optind < argc; ++optind)
- fprintf(stderr, "Unexpected extra argument: %s\n",
- argv[optind]);
+ pr2serr("Unexpected extra argument: %s\n", argv[optind]);
usage();
return SG_LIB_SYNTAX_ERROR;
}
}
if (NULL == device_name) {
- fprintf(stderr, "missing device name!\n");
+ pr2serr("missing device name!\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (! lba_given) {
- fprintf(stderr, "need a --lba=LBA option\n");
+ pr2serr("need a --lba=LBA option\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (repeat) {
if (! has_filename) {
- fprintf(stderr, "with '--repeat' need '--in=IF' option\n");
+ pr2serr("with '--repeat' need '--in=IF' option\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (ilen < 1) {
- fprintf(stderr, "with '--repeat' need '--ilen=ILEN' option\n");
+ pr2serr("with '--repeat' need '--ilen=ILEN' option\n");
usage();
return SG_LIB_SYNTAX_ERROR;
} else {
b_p_lb = ilen / num_lb;
if (b_p_lb < 64) {
- fprintf(stderr, "calculated %d bytes per logical block, "
- "too small\n", b_p_lb);
+ pr2serr("calculated %d bytes per logical block, too small\n",
+ b_p_lb);
usage();
return SG_LIB_SYNTAX_ERROR;
}
@@ -437,8 +433,7 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose);
if (sg_fd < 0) {
- fprintf(stderr, ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
+ pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
return SG_LIB_FILE_ERROR;
}
@@ -449,16 +444,15 @@ main(int argc, char * argv[])
snprintf(cmd_name, sizeof(cmd_name), "Write and verify(%d)",
(do_16 ? 16 : 10));
if (verbose && (0 == given_do_16) && do_16)
- fprintf(stderr, "Switching to %s because LBA or NUM too large\n",
- cmd_name);
+ pr2serr("Switching to %s because LBA or NUM too large\n", cmd_name);
if (verbose) {
- fprintf(stderr, "Issue %s to device %s\n\tilen=%d", cmd_name,
- device_name, ilen);
+ pr2serr("Issue %s to device %s\n\tilen=%d", cmd_name, device_name,
+ ilen);
if (ilen > 0)
- fprintf(stderr, " [0x%x]", ilen);
- fprintf(stderr, ", lba=%" PRIu64 " [0x%" PRIx64 "]\n\twrprotect=%d, "
- "dpo=%d, bytchk=%d, group=%d, repeat=%d\n", llba, llba,
- wrprotect, dpo, bytchk, group, repeat);
+ pr2serr(" [0x%x]", ilen);
+ pr2serr(", lba=%" PRIu64 " [0x%" PRIx64 "]\n\twrprotect=%d, dpo=%d, "
+ "bytchk=%d, group=%d, repeat=%d\n", llba, llba, wrprotect,
+ dpo, bytchk, group, repeat);
}
first_time = 1;
@@ -472,7 +466,7 @@ main(int argc, char * argv[])
ifd = STDIN_FILENO;
ifnp = "<stdin>";
if (verbose > 1)
- fprintf(stderr, "Reading input data from stdin\n");
+ pr2serr("Reading input data from stdin\n");
} else {
ifd = open_if(ifnp, 0);
if (ifd < 0) {
@@ -482,49 +476,49 @@ main(int argc, char * argv[])
}
if (ilen < 1) {
if (fstat(ifd, &a_stat) < 0) {
- fprintf(stderr, "Could not fstat(%s)\n", ifnp);
+ pr2serr("Could not fstat(%s)\n", ifnp);
goto err_out;
}
if (! S_ISREG(a_stat.st_mode)) {
- fprintf(stderr, "Cannot determine IF size, please "
- "give '--ilen='\n");
+ pr2serr("Cannot determine IF size, please give "
+ "'--ilen='\n");
goto err_out;
}
ilen = (int)a_stat.st_size;
if (ilen < 1) {
- fprintf(stderr, "%s file size too small\n", ifnp);
+ pr2serr("%s file size too small\n", ifnp);
goto err_out;
} else if (verbose)
- fprintf(stderr, "Using file size of %d bytes\n", ilen);
+ pr2serr("Using file size of %d bytes\n", ilen);
}
if (NULL == (wrkBuff = malloc(ilen))) {
- fprintf(stderr, ME "out of memory\n");
+ pr2serr(ME "out of memory\n");
ret = SG_LIB_CAT_OTHER;
goto err_out;
}
wvb = (unsigned char *)wrkBuff;
res = read(ifd, wvb, ilen);
if (res < 0) {
- fprintf(stderr, "Could not read from %s", ifnp);
+ pr2serr("Could not read from %s", ifnp);
goto err_out;
}
if (res < ilen) {
- fprintf(stderr, "Read only %d bytes (expected %d) from "
- "%s\n", res, ilen, ifnp);
+ pr2serr("Read only %d bytes (expected %d) from %s\n", res,
+ ilen, ifnp);
if (repeat)
- fprintf(stderr, "Will scale subsequent pieces when "
- "repeat=1, but this is first\n");
+ pr2serr("Will scale subsequent pieces when repeat=1, "
+ "but this is first\n");
goto err_out;
}
} else {
if (ilen < 1) {
if (verbose)
- fprintf(stderr, "Default write length to %d*%d=%d "
- "bytes\n", num_lb, 512, 512 * num_lb);
+ pr2serr("Default write length to %d*%d=%d bytes\n",
+ num_lb, 512, 512 * num_lb);
ilen = 512 * num_lb;
}
if (NULL == (wrkBuff = malloc(ilen))) {
- fprintf(stderr, ME "out of memory\n");
+ pr2serr(ME "out of memory\n");
ret = SG_LIB_CAT_OTHER;
goto err_out;
}
@@ -538,20 +532,19 @@ main(int argc, char * argv[])
llba += snum_lb;
res = read(ifd, wvb, ilen);
if (res < 0) {
- fprintf(stderr, "Could not read from %s", ifnp);
+ pr2serr("Could not read from %s", ifnp);
goto err_out;
} else {
if (verbose > 1)
- fprintf(stderr, "Subsequent read from %s got %d bytes\n",
- ifnp, res);
+ pr2serr("Subsequent read from %s got %d bytes\n", ifnp, res);
if (0 == res)
break;
if (res < ilen) {
snum_lb = (uint32_t)(res / b_p_lb);
n = res % b_p_lb;
if (0 != n)
- fprintf(stderr, ">>> warning: ignoring last %d "
- "bytes of %s\n", n, ifnp);
+ pr2serr(">>> warning: ignoring last %d bytes of %s\n",
+ n, ifnp);
if (snum_lb < 1)
break;
}
@@ -574,25 +567,25 @@ main(int argc, char * argv[])
err_out:
if (repeat)
- fprintf(stderr, "%d [0x%x] logical blocks written, in total\n",
- tnum_lb_wr, tnum_lb_wr);
+ pr2serr("%d [0x%x] logical blocks written, in total\n", tnum_lb_wr,
+ tnum_lb_wr);
if (wrkBuff)
free(wrkBuff);
if ((ifd >= 0) && (STDIN_FILENO != ifd))
close(ifd);
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
- fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
return SG_LIB_FILE_ERROR;
}
if (ret && (0 == verbose)) {
if (SG_LIB_CAT_INVALID_OP == ret)
- fprintf(stderr, "%s command not supported\n", cmd_name);
+ pr2serr("%s command not supported\n", cmd_name);
else if (ret > 0)
- fprintf(stderr, "%s, exit status %d\n", cmd_name, ret);
+ pr2serr("%s, exit status %d\n", cmd_name, ret);
else if (ret < 0)
- fprintf(stderr, "Some error occurred\n");
+ pr2serr("Some error occurred\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_xcopy.c b/src/sg_xcopy.c
index 320e5384..d0003583 100644
--- a/src/sg_xcopy.c
+++ b/src/sg_xcopy.c
@@ -37,7 +37,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
@@ -62,8 +61,9 @@
#include "sg_cmds_extra.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "0.49 20150227";
+static const char * version_str = "0.50 20151227";
#define ME "sg_xcopy: "
@@ -194,25 +194,7 @@ static const char * rec_copy_op_params_str = "Receive copy operating "
"parameters";
static void calc_duration_throughput(int contin);
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
static void
install_handler(int sig_num, void (*sig_handler) (int sig))
@@ -228,7 +210,6 @@ install_handler(int sig_num, void (*sig_handler) (int sig))
}
}
-
static void
print_stats(const char * str)
{
@@ -240,7 +221,6 @@ print_stats(const char * str)
out_partial);
}
-
static void
interrupt_handler(int sig)
{
@@ -257,7 +237,6 @@ interrupt_handler(int sig)
kill(getpid (), sig);
}
-
static void
siginfo_handler(int sig)
{
diff --git a/src/sg_zone.c b/src/sg_zone.c
index f8891f16..1a2647c5 100644
--- a/src/sg_zone.c
+++ b/src/sg_zone.c
@@ -9,7 +9,6 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -24,6 +23,7 @@
#include "sg_pt.h"
#include "sg_cmds_basic.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
/* A utility program originally written for the Linux OS SCSI subsystem.
*
@@ -32,7 +32,7 @@
* to the given SCSI device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.01 20151126";
+static const char * version_str = "1.02 20151219";
#define SG_ZONING_OUT_CMDLEN 16
#define CLOSE_ZONE_SA 0x1
@@ -66,26 +66,6 @@ static const char * sa_name_arr[] = {
};
-#ifdef __GNUC__
-static int pr2serr(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-#else
-static int pr2serr(const char * fmt, ...);
-#endif
-
-
-static int
-pr2serr(const char * fmt, ...)
-{
- va_list args;
- int n;
-
- va_start(args, fmt);
- n = vfprintf(stderr, fmt, args);
- va_end(args);
- return n;
-}
-
static void
usage()
{
@@ -214,7 +194,7 @@ main(int argc, char * argv[])
case 'z':
ll = sg_get_llnum(optarg);
if (-1 == ll) {
- fprintf(stderr, "bad argument to '--zone=ID'\n");
+ pr2serr("bad argument to '--zone=ID'\n");
return SG_LIB_SYNTAX_ERROR;
}
zid = (uint64_t)ll;
diff --git a/src/sgm_dd.c b/src/sgm_dd.c
index 7a6f2f7c..8a0a76f5 100644
--- a/src/sgm_dd.c
+++ b/src/sgm_dd.c
@@ -61,9 +61,10 @@
#include "sg_cmds_basic.h"
#include "sg_io_linux.h"
#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "1.42 20151215";
+static const char * version_str = "1.44 20151219";
#define DEF_BLOCK_SIZE 512
#define DEF_BLOCKS_PER_TRANSFER 128
@@ -155,10 +156,9 @@ static void
print_stats()
{
if (0 != dd_count)
- fprintf(stderr, " remaining block count=%" PRId64 "\n", dd_count);
- fprintf(stderr, "%" PRId64 "+%d records in\n", in_full - in_partial,
- in_partial);
- fprintf(stderr, "%" PRId64 "+%d records out\n", out_full - out_partial,
+ pr2serr(" remaining block count=%" PRId64 "\n", dd_count);
+ pr2serr("%" PRId64 "+%d records in\n", in_full - in_partial, in_partial);
+ pr2serr("%" PRId64 "+%d records out\n", out_full - out_partial,
out_partial);
}
@@ -179,13 +179,13 @@ calc_duration_throughput(int contin)
a = res_tm.tv_sec;
a += (0.000001 * res_tm.tv_usec);
b = (double)blk_sz * (req_count - dd_count);
- fprintf(stderr, "time to transfer data%s: %d.%06d secs",
+ pr2serr("time to transfer data%s: %d.%06d secs",
(contin ? " so far" : ""), (int)res_tm.tv_sec,
(int)res_tm.tv_usec);
if ((a > 0.00001) && (b > 511))
- fprintf(stderr, " at %.2f MB/sec\n", b / (a * 1000000.0));
+ pr2serr(" at %.2f MB/sec\n", b / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
}
}
@@ -198,7 +198,7 @@ interrupt_handler(int sig)
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (sig, &sigact, NULL);
- fprintf(stderr, "Interrupted by signal,");
+ pr2serr("Interrupted by signal,");
print_stats ();
if (do_time)
calc_duration_throughput(0);
@@ -209,7 +209,7 @@ static void
siginfo_handler(int sig)
{
if (sig) { ; } /* unused, dummy to suppress warning */
- fprintf(stderr, "Progress report, continuing ...\n");
+ pr2serr("Progress report, continuing ...\n");
print_stats();
if (do_time)
calc_duration_throughput(1);
@@ -265,49 +265,46 @@ dd_filetype_str(int ft, char * buff)
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sgm_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE]"
- " [iflag=FLAGS]\n"
- " [obs=BS] [of=OFILE] [oflag=FLAGS] "
- "[seek=SEEK] [skip=SKIP]\n"
- " [--help] [--version]\n\n");
- fprintf(stderr,
- " [bpt=BPT] [cdbsz=6|10|12|16] [dio=0|1] "
- "[fua=0|1|2|3]\n"
- " [sync=0|1] [time=0|1] [verbose=VERB]\n\n"
- " where:\n"
- " bpt is blocks_per_transfer (default is 128)\n"
- " bs must be device block size (default 512)\n"
- " cdbsz size of SCSI READ or WRITE cdb (default is 10)\n"
- " count number of blocks to copy (def: device size)\n"
- " dio 0->indirect IO on write, 1->direct IO on write\n"
- " (only when read side is sg device (using mmap))\n"
- " fua force unit access: 0->don't(def), 1->OFILE, "
- "2->IFILE,\n"
- " 3->OFILE+IFILE\n"
- " if file or device to read from (def: stdin)\n");
- fprintf(stderr,
- " iflag comma separated list from: [direct,dpo,dsync,"
- "excl,fua,\n"
- " null]\n"
- " of file or device to write to (def: stdout), "
- "OFILE of '.'\n"
- " treated as /dev/null\n"
- " oflag comma separated list from: [append,dio,direct,"
- "dpo,dsync,\n"
- " excl,fua,null]\n"
- " seek block position to start writing to OFILE\n"
- " skip block position to start reading from IFILE\n"
- " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on OFILE "
- "after copy\n"
- " time 0->no timing(def), 1->time plus calculate "
- "throughput\n"
- " verbose 0->quiet(def), 1->some noise, 2->more noise, "
- "etc\n"
- " --help print usage message then exit\n"
- " --version print version information then exit\n\n"
- "Copy from IFILE to OFILE, similar to dd command\n"
- "specialized for SCSI devices for which mmap-ed IO attempted\n");
+ pr2serr("Usage: sgm_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE]"
+ " [iflag=FLAGS]\n"
+ " [obs=BS] [of=OFILE] [oflag=FLAGS] "
+ "[seek=SEEK] [skip=SKIP]\n"
+ " [--help] [--version]\n\n");
+ pr2serr(" [bpt=BPT] [cdbsz=6|10|12|16] [dio=0|1] "
+ "[fua=0|1|2|3]\n"
+ " [sync=0|1] [time=0|1] [verbose=VERB]\n\n"
+ " where:\n"
+ " bpt is blocks_per_transfer (default is 128)\n"
+ " bs must be device block size (default 512)\n"
+ " cdbsz size of SCSI READ or WRITE cdb (default is 10)\n"
+ " count number of blocks to copy (def: device size)\n"
+ " dio 0->indirect IO on write, 1->direct IO on write\n"
+ " (only when read side is sg device (using mmap))\n"
+ " fua force unit access: 0->don't(def), 1->OFILE, "
+ "2->IFILE,\n"
+ " 3->OFILE+IFILE\n"
+ " if file or device to read from (def: stdin)\n");
+ pr2serr(" iflag comma separated list from: [direct,dpo,dsync,"
+ "excl,fua,\n"
+ " null]\n"
+ " of file or device to write to (def: stdout), "
+ "OFILE of '.'\n"
+ " treated as /dev/null\n"
+ " oflag comma separated list from: [append,dio,direct,"
+ "dpo,dsync,\n"
+ " excl,fua,null]\n"
+ " seek block position to start writing to OFILE\n"
+ " skip block position to start reading from IFILE\n"
+ " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on OFILE "
+ "after copy\n"
+ " time 0->no timing(def), 1->time plus calculate "
+ "throughput\n"
+ " verbose 0->quiet(def), 1->some noise, 2->more noise, "
+ "etc\n"
+ " --help print usage message then exit\n"
+ " --version print version information then exit\n\n"
+ "Copy from IFILE to OFILE, similar to dd command\n"
+ "specialized for SCSI devices for which mmap-ed IO attempted\n");
}
/* Return of 0 -> success, see sg_ll_read_capacity*() otherwise */
@@ -341,8 +338,8 @@ scsi_read_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
*sect_sz = sg_get_unaligned_be32(rcBuff + 4);
}
if (verbose)
- fprintf(stderr, " number of blocks=%" PRId64 " [0x%" PRIx64
- "], block size=%d\n", *num_sect, *num_sect, *sect_sz);
+ pr2serr(" number of blocks=%" PRId64 " [0x%" PRIx64 "], block "
+ "size=%d\n", *num_sect, *num_sect, *sect_sz);
return 0;
}
@@ -366,9 +363,8 @@ read_blkdev_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
}
*num_sect = ((int64_t)ull / (int64_t)*sect_sz);
if (verbose)
- fprintf(stderr, " [bgs64] number of blocks=%" PRId64 " [0x%"
- PRIx64 "], block size=%d\n", *num_sect, *num_sect,
- *sect_sz);
+ pr2serr(" [bgs64] number of blocks=%" PRId64 " [0x%" PRIx64
+ "], block size=%d\n", *num_sect, *num_sect, *sect_sz);
#else
unsigned long ul;
@@ -378,15 +374,14 @@ read_blkdev_capacity(int sg_fd, int64_t * num_sect, int * sect_sz)
}
*num_sect = (int64_t)ul;
if (verbose)
- fprintf(stderr, " [bgs] number of blocks=%" PRId64 " [0x%"
- PRIx64 "], block size=%d\n", *num_sect, *num_sect,
- *sect_sz);
+ pr2serr(" [bgs] number of blocks=%" PRId64 " [0x%" PRIx64
+ "], block size=%d\n", *num_sect, *num_sect, *sect_sz);
#endif
}
return 0;
#else
if (verbose)
- fprintf(stderr, " BLKSSZGET+BLKGETSIZE ioctl not available\n");
+ pr2serr(" BLKSSZGET+BLKGETSIZE ioctl not available\n");
*num_sect = 0;
*sect_sz = 0;
return -1;
@@ -414,18 +409,18 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be24(0x1fffff & start_block, cdbp + 1);
cdbp[4] = (256 == blocks) ? 0 : (unsigned char)blocks;
if (blocks > 256) {
- fprintf(stderr, ME "for 6 byte commands, maximum number of "
- "blocks is 256\n");
+ pr2serr(ME "for 6 byte commands, maximum number of blocks is "
+ "256\n");
return 1;
}
if ((start_block + blocks - 1) & (~0x1fffff)) {
- fprintf(stderr, ME "for 6 byte commands, can't address blocks"
- " beyond %d\n", 0x1fffff);
+ pr2serr(ME "for 6 byte commands, can't address blocks beyond "
+ "%d\n", 0x1fffff);
return 1;
}
if (dpo || fua) {
- fprintf(stderr, ME "for 6 byte commands, neither dpo nor fua"
- " bits supported\n");
+ pr2serr(ME "for 6 byte commands, neither dpo nor fua bits "
+ "supported\n");
return 1;
}
break;
@@ -436,8 +431,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32((uint32_t)start_block, cdbp + 2);
sg_put_unaligned_be16((uint16_t)blocks, cdbp + 7);
if (blocks & (~0xffff)) {
- fprintf(stderr, ME "for 10 byte commands, maximum number of "
- "blocks is %d\n", 0xffff);
+ pr2serr(ME "for 10 byte commands, maximum number of blocks is "
+ "%d\n", 0xffff);
return 1;
}
break;
@@ -456,8 +451,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32((uint32_t)blocks, cdbp + 10);
break;
default:
- fprintf(stderr, ME "expected cdb size of 6, 10, 12, or 16 but got"
- " %d\n", cdb_sz);
+ pr2serr(ME "expected cdb size of 6, 10, 12, or 16 but got %d\n",
+ cdb_sz);
return 1;
}
return 0;
@@ -475,8 +470,8 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
int k, res;
if (sg_build_scsi_cdb(rdCmd, cdbsz, blocks, from_block, 0, fua, dpo)) {
- fprintf(stderr, ME "bad rd cdb build, from_block=%" PRId64
- ", blocks=%d\n", from_block, blocks);
+ pr2serr(ME "bad rd cdb build, from_block=%" PRId64 ", blocks=%d\n",
+ from_block, blocks);
return SG_LIB_SYNTAX_ERROR;
}
memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
@@ -494,10 +489,10 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
if (do_mmap)
io_hdr.flags |= SG_FLAG_MMAP_IO;
if (verbose > 2) {
- fprintf(stderr, " read cdb: ");
+ pr2serr(" read cdb: ");
for (k = 0; k < cdbsz; ++k)
- fprintf(stderr, "%02x ", rdCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", rdCmd[k]);
+ pr2serr("\n");
}
#if 1
@@ -528,7 +523,7 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
}
#endif
if (verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
res = sg_err_category3(&io_hdr);
switch (res) {
case SG_LIB_CAT_CLEAN:
@@ -548,7 +543,7 @@ sg_read(int sg_fd, unsigned char * buff, int blocks, int64_t from_block,
}
sum_of_resids += io_hdr.resid;
#ifdef SG_DEBUG
- fprintf(stderr, "duration=%u ms\n", io_hdr.duration);
+ pr2serr("duration=%u ms\n", io_hdr.duration);
#endif
return 0;
}
@@ -565,8 +560,8 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
int k, res;
if (sg_build_scsi_cdb(wrCmd, cdbsz, blocks, to_block, 1, fua, dpo)) {
- fprintf(stderr, ME "bad wr cdb build, to_block=%" PRId64
- ", blocks=%d\n", to_block, blocks);
+ pr2serr(ME "bad wr cdb build, to_block=%" PRId64 ", blocks=%d\n",
+ to_block, blocks);
return SG_LIB_SYNTAX_ERROR;
}
@@ -587,10 +582,10 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
else if (diop && *diop)
io_hdr.flags |= SG_FLAG_DIRECT_IO;
if (verbose > 2) {
- fprintf(stderr, " write cdb: ");
+ pr2serr(" write cdb: ");
for (k = 0; k < cdbsz; ++k)
- fprintf(stderr, "%02x ", wrCmd[k]);
- fprintf(stderr, "\n");
+ pr2serr("%02x ", wrCmd[k]);
+ pr2serr("\n");
}
#if 1
@@ -621,7 +616,7 @@ sg_write(int sg_fd, unsigned char * buff, int blocks, int64_t to_block,
}
#endif
if (verbose > 2)
- fprintf(stderr, " duration=%u ms\n", io_hdr.duration);
+ pr2serr(" duration=%u ms\n", io_hdr.duration);
res = sg_err_category3(&io_hdr);
switch (res) {
case SG_LIB_CAT_CLEAN:
@@ -655,7 +650,7 @@ process_flags(const char * arg, struct flags_t * fp)
strncpy(buff, arg, sizeof(buff));
buff[sizeof(buff) - 1] = '\0';
if ('\0' == buff[0]) {
- fprintf(stderr, "no flag found\n");
+ pr2serr("no flag found\n");
return 1;
}
cp = buff;
@@ -680,7 +675,7 @@ process_flags(const char * arg, struct flags_t * fp)
else if (0 == strcmp(cp, "null"))
;
else {
- fprintf(stderr, "unrecognised flag: %s\n", cp);
+ pr2serr("unrecognised flag: %s\n", cp);
return 1;
}
cp = np;
@@ -757,14 +752,14 @@ main(int argc, char * argv[])
if (0 == strcmp(key,"bpt")) {
bpt = sg_get_num(buf);
if (-1 == bpt) {
- fprintf(stderr, ME "bad argument to 'bpt'\n");
+ pr2serr(ME "bad argument to 'bpt'\n");
return SG_LIB_SYNTAX_ERROR;
}
bpt_given = 1;
} else if (0 == strcmp(key,"bs")) {
blk_sz = sg_get_num(buf);
if (-1 == blk_sz) {
- fprintf(stderr, ME "bad argument to 'bs'\n");
+ pr2serr(ME "bad argument to 'bs'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"cdbsz")) {
@@ -778,7 +773,7 @@ main(int argc, char * argv[])
if (0 != strcmp("-1", buf)) {
dd_count = sg_get_llnum(buf);
if (-1LL == dd_count) {
- fprintf(stderr, ME "bad argument to 'count'\n");
+ pr2serr(ME "bad argument to 'count'\n");
return SG_LIB_SYNTAX_ERROR;
}
} /* treat 'count=-1' as calculate count (same as not given) */
@@ -793,47 +788,47 @@ main(int argc, char * argv[])
} else if (0 == strcmp(key,"ibs")) {
ibs = sg_get_num(buf);
if (-1 == ibs) {
- fprintf(stderr, ME "bad argument to 'ibs'\n");
+ pr2serr(ME "bad argument to 'ibs'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (strcmp(key,"if") == 0) {
if ('\0' != inf[0]) {
- fprintf(stderr, "Second 'if=' argument??\n");
+ pr2serr("Second 'if=' argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(inf, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "iflag")) {
if (process_flags(buf, &in_flags)) {
- fprintf(stderr, ME "bad argument to 'iflag'\n");
+ pr2serr(ME "bad argument to 'iflag'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (strcmp(key,"of") == 0) {
if ('\0' != outf[0]) {
- fprintf(stderr, "Second 'of=' argument??\n");
+ pr2serr("Second 'of=' argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(outf, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "oflag")) {
if (process_flags(buf, &out_flags)) {
- fprintf(stderr, ME "bad argument to 'oflag'\n");
+ pr2serr(ME "bad argument to 'oflag'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"obs")) {
obs = sg_get_num(buf);
if (-1 == obs) {
- fprintf(stderr, ME "bad argument to 'obs'\n");
+ pr2serr(ME "bad argument to 'obs'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"seek")) {
seek = sg_get_llnum(buf);
if (-1LL == seek) {
- fprintf(stderr, ME "bad argument to 'seek'\n");
+ pr2serr(ME "bad argument to 'seek'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"skip")) {
skip = sg_get_llnum(buf);
if (-1LL == skip) {
- fprintf(stderr, ME "bad argument to 'skip'\n");
+ pr2serr(ME "bad argument to 'skip'\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"sync"))
@@ -848,35 +843,34 @@ main(int argc, char * argv[])
return 0;
} else if ((0 == strncmp(key, "--vers", 6)) ||
(0 == strcmp(key, "-V"))) {
- fprintf(stderr, ME ": %s\n", version_str);
+ pr2serr(ME ": %s\n", version_str);
return 0;
}
else {
- fprintf(stderr, "Unrecognized option '%s'\n", key);
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Unrecognized option '%s'\n", key);
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
}
if (blk_sz <= 0) {
blk_sz = DEF_BLOCK_SIZE;
- fprintf(stderr, "Assume default 'bs' (block size) of %d bytes\n",
- blk_sz);
+ pr2serr("Assume default 'bs' (block size) of %d bytes\n", blk_sz);
}
if ((ibs && (ibs != blk_sz)) || (obs && (obs != blk_sz))) {
- fprintf(stderr, "If 'ibs' or 'obs' given must be same as 'bs'\n");
+ pr2serr("If 'ibs' or 'obs' given must be same as 'bs'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((skip < 0) || (seek < 0)) {
- fprintf(stderr, "skip and seek cannot be negative\n");
+ pr2serr("skip and seek cannot be negative\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((out_flags.append > 0) && (seek > 0)) {
- fprintf(stderr, "Can't use both append and seek switches\n");
+ pr2serr("Can't use both append and seek switches\n");
return SG_LIB_SYNTAX_ERROR;
}
if (bpt < 1) {
- fprintf(stderr, "bpt must be greater than 0\n");
+ pr2serr("bpt must be greater than 0\n");
return SG_LIB_SYNTAX_ERROR;
}
/* defaulting transfer size to 128*2048 for CD/DVDs is too large
@@ -886,8 +880,8 @@ main(int argc, char * argv[])
bpt = DEF_BLOCKS_PER_2048TRANSFER;
#ifdef SG_DEBUG
- fprintf(stderr, ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64 " count=%"
- PRId64 "\n", inf, skip, outf, seek, dd_count);
+ pr2serr(ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64 " count=%" PRId64
+ "\n", inf, skip, outf, seek, dd_count);
#endif
install_handler (SIGINT, interrupt_handler);
install_handler (SIGQUIT, interrupt_handler);
@@ -899,14 +893,14 @@ main(int argc, char * argv[])
if (inf[0] && ('-' != inf[0])) {
in_type = dd_filetype(inf);
if (verbose)
- fprintf(stderr, " >> Input file type: %s\n",
+ pr2serr(" >> Input file type: %s\n",
dd_filetype_str(in_type, ebuff));
if (FT_ERROR == in_type) {
- fprintf(stderr, ME "unable to access %s\n", inf);
+ pr2serr(ME "unable to access %s\n", inf);
return SG_LIB_FILE_ERROR;
} else if (FT_ST == in_type) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", inf);
+ pr2serr(ME "unable to use scsi tape device %s\n", inf);
return SG_LIB_FILE_ERROR;
} else if (FT_SG == in_type) {
flags = O_RDWR | O_NONBLOCK;
@@ -924,7 +918,7 @@ main(int argc, char * argv[])
}
res = ioctl(infd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30122)) {
- fprintf(stderr, ME "sg driver prior to 3.1.22\n");
+ pr2serr(ME "sg driver prior to 3.1.22\n");
return SG_LIB_FILE_ERROR;
}
in_res_sz = blk_sz * bpt;
@@ -975,9 +969,8 @@ main(int argc, char * argv[])
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, " >> skip: lseek64 SEEK_SET, "
- "byte offset=0x%" PRIx64 "\n",
- (uint64_t)offset);
+ pr2serr(" >> skip: lseek64 SEEK_SET, byte offset=0x%"
+ PRIx64 "\n", (uint64_t)offset);
}
}
}
@@ -985,11 +978,11 @@ main(int argc, char * argv[])
if (outf[0] && ('-' != outf[0])) {
out_type = dd_filetype(outf);
if (verbose)
- fprintf(stderr, " >> Output file type: %s\n",
+ pr2serr(" >> Output file type: %s\n",
dd_filetype_str(out_type, ebuff));
if (FT_ST == out_type) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", outf);
+ pr2serr(ME "unable to use scsi tape device %s\n", outf);
return SG_LIB_FILE_ERROR;
}
else if (FT_SG == out_type) {
@@ -1008,7 +1001,7 @@ main(int argc, char * argv[])
}
res = ioctl(outfd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30122)) {
- fprintf(stderr, ME "sg driver prior to 3.1.22\n");
+ pr2serr(ME "sg driver prior to 3.1.22\n");
return SG_LIB_FILE_ERROR;
}
if (ioctl(outfd, SG_GET_RESERVED_SIZE, &t) < 0) {
@@ -1074,16 +1067,15 @@ main(int argc, char * argv[])
return SG_LIB_FILE_ERROR;
}
if (verbose)
- fprintf(stderr, " >> seek: lseek64 SEEK_SET, "
- "byte offset=0x%" PRIx64 "\n",
- (uint64_t)offset);
+ pr2serr(" >> seek: lseek64 SEEK_SET, byte offset=0x%"
+ PRIx64 "\n", (uint64_t)offset);
}
}
}
if ((STDIN_FILENO == infd) && (STDOUT_FILENO == outfd)) {
- fprintf(stderr, "Won't default both IFILE to stdin _and_ OFILE "
- "to as stdout\n");
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Won't default both IFILE to stdin _and_ OFILE to as "
+ "stdout\n");
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (dd_count < 0) {
@@ -1091,25 +1083,25 @@ main(int argc, char * argv[])
if (FT_SG == in_type) {
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention(in), continuing\n");
+ pr2serr("Unit attention(in), continuing\n");
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
} else if (SG_LIB_CAT_ABORTED_COMMAND == res) {
- fprintf(stderr, "Aborted command(in), continuing\n");
+ pr2serr("Aborted command(in), continuing\n");
res = scsi_read_capacity(infd, &in_num_sect, &in_sect_sz);
}
if (0 != res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Read capacity (if=%s): %s\n", inf, b);
+ pr2serr("Read capacity (if=%s): %s\n", inf, b);
in_num_sect = -1;
}
} else if (FT_BLOCK == in_type) {
if (0 != read_blkdev_capacity(infd, &in_num_sect, &in_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n", inf);
+ pr2serr("Unable to read block capacity on %s\n", inf);
in_num_sect = -1;
}
if (blk_sz != in_sect_sz) {
- fprintf(stderr, "block size on %s confusion; bs=%d, from "
- "device=%d\n", inf, blk_sz, in_sect_sz);
+ pr2serr("block size on %s confusion; bs=%d, from device=%d\n",
+ inf, blk_sz, in_sect_sz);
in_num_sect = -1;
}
}
@@ -1120,35 +1112,34 @@ main(int argc, char * argv[])
if (FT_SG == out_type) {
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention(out), continuing\n");
+ pr2serr("Unit attention(out), continuing\n");
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
} else if (SG_LIB_CAT_ABORTED_COMMAND == res) {
- fprintf(stderr, "Aborted command(out), continuing\n");
+ pr2serr("Aborted command(out), continuing\n");
res = scsi_read_capacity(outfd, &out_num_sect, &out_sect_sz);
}
if (0 != res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Read capacity (of=%s): %s\n", inf, b);
+ pr2serr("Read capacity (of=%s): %s\n", inf, b);
out_num_sect = -1;
}
} else if (FT_BLOCK == out_type) {
if (0 != read_blkdev_capacity(outfd, &out_num_sect,
&out_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n",
- outf);
+ pr2serr("Unable to read block capacity on %s\n", outf);
out_num_sect = -1;
}
if (blk_sz != out_sect_sz) {
- fprintf(stderr, "block size on %s confusion: bs=%d, from "
- "device=%d\n", outf, blk_sz, out_sect_sz);
+ pr2serr("block size on %s confusion: bs=%d, from device=%d\n",
+ outf, blk_sz, out_sect_sz);
out_num_sect = -1;
}
}
if (out_num_sect > seek)
out_num_sect -= seek;
#ifdef SG_DEBUG
- fprintf(stderr, "Start of loop, count=%" PRId64 ", in_num_sect=%"
- PRId64 ", out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
+ pr2serr("Start of loop, count=%" PRId64 ", in_num_sect=%" PRId64 ", "
+ "out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
out_num_sect);
#endif
if (in_num_sect > 0) {
@@ -1163,28 +1154,28 @@ main(int argc, char * argv[])
}
if (dd_count < 0) {
- fprintf(stderr, "Couldn't calculate count, please give one\n");
+ pr2serr("Couldn't calculate count, please give one\n");
return SG_LIB_SYNTAX_ERROR;
}
if (! cdbsz_given) {
if ((FT_SG == in_type) && (MAX_SCSI_CDBSZ != scsi_cdbsz_in) &&
(((dd_count + skip) > UINT_MAX) || (bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'if')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'if')\n");
scsi_cdbsz_in = MAX_SCSI_CDBSZ;
}
if ((FT_SG == out_type) && (MAX_SCSI_CDBSZ != scsi_cdbsz_out) &&
(((dd_count + seek) > UINT_MAX) || (bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'of')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'of')\n");
scsi_cdbsz_out = MAX_SCSI_CDBSZ;
}
}
if (out_flags.dio && (FT_SG != in_type)) {
out_flags.dio = 0;
- fprintf(stderr, ">>> dio only performed on 'of' side when 'if' is"
- " an sg device\n");
+ pr2serr(">>> dio only performed on 'of' side when 'if' is an sg "
+ "device\n");
}
if (out_flags.dio) {
int fd;
@@ -1193,8 +1184,8 @@ main(int argc, char * argv[])
if ((fd = open(proc_allow_dio, O_RDONLY)) >= 0) {
if (1 == read(fd, &c, 1)) {
if ('0' == c)
- fprintf(stderr, ">>> %s set to '0' but should be set "
- "to '1' for direct IO\n", proc_allow_dio);
+ pr2serr(">>> %s set to '0' but should be set to '1' for "
+ "direct IO\n", proc_allow_dio);
}
close(fd);
}
@@ -1206,7 +1197,7 @@ main(int argc, char * argv[])
if ((FT_RAW == in_type) || (FT_RAW == out_type)) {
wrkBuff = (unsigned char *)malloc(blk_sz * bpt + psz);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory for raw\n");
+ pr2serr("Not enough user memory for raw\n");
return SG_LIB_FILE_ERROR;
}
/* perhaps use posix_memalign() instead */
@@ -1216,7 +1207,7 @@ main(int argc, char * argv[])
else {
wrkBuff = (unsigned char *)malloc(blk_sz * bpt);
if (0 == wrkBuff) {
- fprintf(stderr, "Not enough user memory\n");
+ pr2serr("Not enough user memory\n");
return SG_LIB_FILE_ERROR;
}
wrkPos = wrkBuff;
@@ -1225,8 +1216,8 @@ main(int argc, char * argv[])
blocks_per = bpt;
#ifdef SG_DEBUG
- fprintf(stderr, "Start of loop, count=%" PRId64 ", blocks_per=%d\n",
- dd_count, blocks_per);
+ pr2serr("Start of loop, count=%" PRId64 ", blocks_per=%d\n", dd_count,
+ blocks_per);
#endif
if (do_time) {
start_tm.tv_sec = 0;
@@ -1238,8 +1229,8 @@ main(int argc, char * argv[])
if (verbose && (dd_count > 0) && (0 == out_flags.dio) &&
(FT_SG == in_type) && (FT_SG == out_type))
- fprintf(stderr, "Since both 'if' and 'of' are sg devices, only do "
- "mmap-ed transfers on 'if'\n");
+ pr2serr("Since both 'if' and 'of' are sg devices, only do mmap-ed "
+ "transfers on 'if'\n");
while (dd_count > 0) {
blocks = (dd_count > blocks_per) ? blocks_per : dd_count;
@@ -1248,13 +1239,13 @@ main(int argc, char * argv[])
in_flags.fua, in_flags.dpo, 1);
if ((SG_LIB_CAT_UNIT_ATTENTION == ret) ||
(SG_LIB_CAT_ABORTED_COMMAND == ret)) {
- fprintf(stderr, "Unit attention or aborted command, "
- "continuing (r)\n");
+ pr2serr("Unit attention or aborted command, continuing "
+ "(r)\n");
ret = sg_read(infd, wrkPos, blocks, skip, blk_sz,
scsi_cdbsz_in, in_flags.fua, in_flags.dpo, 1);
}
if (0 != ret) {
- fprintf(stderr, "sg_read failed, skip=%" PRId64 "\n", skip);
+ pr2serr("sg_read failed, skip=%" PRId64 "\n", skip);
break;
}
else
@@ -1265,8 +1256,8 @@ main(int argc, char * argv[])
((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "read(unix): count=%d, res=%d\n",
- blocks * blk_sz, res);
+ pr2serr("read(unix): count=%d, res=%d\n", blocks * blk_sz,
+ res);
if (ret < 0) {
snprintf(ebuff, EBUFF_SZ, ME "reading, skip=%" PRId64 " ",
skip);
@@ -1296,15 +1287,14 @@ main(int argc, char * argv[])
out_flags.fua, out_flags.dpo, do_mmap, &dio_res);
if ((SG_LIB_CAT_UNIT_ATTENTION == ret) ||
(SG_LIB_CAT_ABORTED_COMMAND == ret)) {
- fprintf(stderr, "Unit attention or aborted command, "
- "continuing (w)\n");
+ pr2serr("Unit attention or aborted command, continuing (w)\n");
dio_res = out_flags.dio;
ret = sg_write(outfd, wrkPos, blocks, seek, blk_sz,
scsi_cdbsz_out, out_flags.fua, out_flags.dpo,
do_mmap, &dio_res);
}
if (0 != ret) {
- fprintf(stderr, "sg_write failed, seek=%" PRId64 "\n", seek);
+ pr2serr("sg_write failed, seek=%" PRId64 "\n", seek);
break;
}
else {
@@ -1320,8 +1310,8 @@ main(int argc, char * argv[])
((EINTR == errno) || (EAGAIN == errno)))
;
if (verbose > 2)
- fprintf(stderr, "write(unix): count=%d, res=%d\n",
- blocks * blk_sz, res);
+ pr2serr("write(unix): count=%d, res=%d\n", blocks * blk_sz,
+ res);
if (res < 0) {
snprintf(ebuff, EBUFF_SZ, ME "writing, seek=%" PRId64 " ",
seek);
@@ -1329,8 +1319,7 @@ main(int argc, char * argv[])
break;
}
else if (res < blocks * blk_sz) {
- fprintf(stderr, "output file probably full, seek=%" PRId64
- " ", seek);
+ pr2serr("output file probably full, seek=%" PRId64 " ", seek);
blocks = res / blk_sz;
out_full += blocks;
if ((res % blk_sz) > 0)
@@ -1350,15 +1339,15 @@ main(int argc, char * argv[])
calc_duration_throughput(0);
if (do_sync) {
if (FT_SG == out_type) {
- fprintf(stderr, ">> Synchronizing cache on %s\n", outf);
+ pr2serr(">> Synchronizing cache on %s\n", outf);
res = sg_ll_sync_cache_10(outfd, 0, 0, 0, 0, 0, 0, 0);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr, "Unit attention(out), continuing\n");
+ pr2serr("Unit attention(out), continuing\n");
res = sg_ll_sync_cache_10(outfd, 0, 0, 0, 0, 0, 0, 0);
}
if (0 != res) {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- fprintf(stderr, "Synchronize cache(out): %s\n", b);
+ pr2serr("Synchronize cache(out): %s\n", b);
}
}
}
@@ -1369,16 +1358,15 @@ main(int argc, char * argv[])
if ((STDOUT_FILENO != outfd) && (FT_DEV_NULL != out_type))
close(outfd);
if (0 != dd_count) {
- fprintf(stderr, "Some error occurred,");
+ pr2serr("Some error occurred,");
if (0 == ret)
ret = SG_LIB_CAT_OTHER;
}
print_stats();
if (sum_of_resids)
- fprintf(stderr, ">> Non-zero sum of residual counts=%d\n",
- sum_of_resids);
+ pr2serr(">> Non-zero sum of residual counts=%d\n", sum_of_resids);
if (num_dio_not_done)
- fprintf(stderr, ">> dio requested but _not_ done %d times\n",
+ pr2serr(">> dio requested but _not_ done %d times\n",
num_dio_not_done);
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sgp_dd.c b/src/sgp_dd.c
index 2a9d0a4f..9aa653e1 100644
--- a/src/sgp_dd.c
+++ b/src/sgp_dd.c
@@ -53,11 +53,12 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
-#include "sg_unaligned.h"
#include "sg_io_linux.h"
+#include "sg_unaligned.h"
+#include "sg_pr2serr.h"
-static const char * version_str = "5.50 20151207";
+static const char * version_str = "5.51 20151219";
#define DEF_BLOCK_SIZE 512
#define DEF_BLOCKS_PER_TRANSFER 128
@@ -210,13 +211,13 @@ calc_duration_throughput(int contin)
a = res_tm.tv_sec;
a += (0.000001 * res_tm.tv_usec);
b = (double)rcoll.bs * (dd_count - rcoll.out_rem_count);
- fprintf(stderr, "time to transfer data %s %d.%06d secs",
+ pr2serr("time to transfer data %s %d.%06d secs",
(contin ? "so far" : "was"), (int)res_tm.tv_sec,
(int)res_tm.tv_usec);
if ((a > 0.00001) && (b > 511))
- fprintf(stderr, ", %.2f MB/sec\n", b / (a * 1000000.0));
+ pr2serr(", %.2f MB/sec\n", b / (a * 1000000.0));
else
- fprintf(stderr, "\n");
+ pr2serr("\n");
}
static void
@@ -225,14 +226,14 @@ print_stats(const char * str)
int64_t infull, outfull;
if (0 != rcoll.out_rem_count)
- fprintf(stderr, " remaining block count=%" PRId64 "\n",
+ pr2serr(" remaining block count=%" PRId64 "\n",
rcoll.out_rem_count);
infull = dd_count - rcoll.in_rem_count;
- fprintf(stderr, "%s%" PRId64 "+%d records in\n", str,
+ pr2serr("%s%" PRId64 "+%d records in\n", str,
infull - rcoll.in_partial, rcoll.in_partial);
outfull = dd_count - rcoll.out_rem_count;
- fprintf(stderr, "%s%" PRId64 "+%d records out\n", str,
+ pr2serr("%s%" PRId64 "+%d records out\n", str,
outfull - rcoll.out_partial, rcoll.out_partial);
}
@@ -245,7 +246,7 @@ interrupt_handler(int sig)
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction(sig, &sigact, NULL);
- fprintf(stderr, "Interrupted by signal,");
+ pr2serr("Interrupted by signal,");
if (do_time)
calc_duration_throughput(0);
print_stats("");
@@ -256,7 +257,7 @@ static void
siginfo_handler(int sig)
{
if (sig) { ; } /* unused, dummy to suppress warning */
- fprintf(stderr, "Progress report, continuing ...\n");
+ pr2serr("Progress report, continuing ...\n");
if (do_time)
calc_duration_throughput(1);
print_stats(" ");
@@ -297,7 +298,7 @@ tsafe_strerror(int code, char * ebp)
* to __func__ */
#define err_exit(code,text) do { \
char strerr_buff[STRERR_BUFF_LEN]; \
- fprintf(stderr, "%s at \"%s\":%d: %s\n", \
+ pr2serr("%s at \"%s\":%d: %s\n", \
text, __func__, __LINE__, tsafe_strerror(code, strerr_buff)); \
exit(1); \
} while (0)
@@ -331,54 +332,51 @@ dd_filetype(const char * filename)
static void
usage()
{
- fprintf(stderr, "Usage: "
- "sgp_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE]"
- " [iflag=FLAGS]\n"
- " [obs=BS] [of=OFILE] [oflag=FLAGS] "
- "[seek=SEEK] [skip=SKIP]\n"
- " [--help] [--version]\n\n");
- fprintf(stderr,
- " [bpt=BPT] [cdbsz=6|10|12|16] [coe=0|1] "
- "[deb=VERB] [dio=0|1]\n"
- " [fua=0|1|2|3] [sync=0|1] [thr=THR] "
- "[time=0|1] [verbose=VERB]\n"
- " where:\n"
- " bpt is blocks_per_transfer (default is 128)\n"
- " bs must be device block size (default 512)\n"
- " cdbsz size of SCSI READ or WRITE cdb (default is 10)\n"
- " coe continue on error, 0->exit (def), "
- "1->zero + continue\n"
- " count number of blocks to copy (def: device size)\n"
- " deb for debug, 0->none (def), > 0->varying degrees of "
- "debug\n");
- fprintf(stderr,
- " dio is direct IO, 1->attempt, 0->indirect IO (def)\n"
- " fua force unit access: 0->don't(def), 1->OFILE, "
- "2->IFILE,\n"
- " 3->OFILE+IFILE\n"
- " if file or device to read from (def: stdin)\n"
- " iflag comma separated list from: [coe,dio,direct,dpo,"
- "dsync,excl,\n"
- " fua, null]\n"
- " of file or device to write to (def: stdout), "
- "OFILE of '.'\n"
- " treated as /dev/null\n"
- " oflag comma separated list from: [append,coe,dio,direct,"
- "dpo,dsync,\n"
- " excl,fua,null]\n"
- " seek block position to start writing to OFILE\n"
- " skip block position to start reading from IFILE\n"
- " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on OFILE "
- "after copy\n"
- " thr is number of threads, must be > 0, default 4, "
- "max 16\n"
- " time 0->no timing(def), 1->time plus calculate "
- "throughput\n"
- " verbose same as 'deb=VERB': increase verbosity\n"
- " --help output this usage message then exit\n"
- " --version output version string then exit\n"
- "Copy from IFILE to OFILE, similar to dd command\n"
- "specialized for SCSI devices, uses multiple POSIX threads\n");
+ pr2serr("Usage: sgp_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE]"
+ " [iflag=FLAGS]\n"
+ " [obs=BS] [of=OFILE] [oflag=FLAGS] "
+ "[seek=SEEK] [skip=SKIP]\n"
+ " [--help] [--version]\n\n");
+ pr2serr(" [bpt=BPT] [cdbsz=6|10|12|16] [coe=0|1] "
+ "[deb=VERB] [dio=0|1]\n"
+ " [fua=0|1|2|3] [sync=0|1] [thr=THR] "
+ "[time=0|1] [verbose=VERB]\n"
+ " where:\n"
+ " bpt is blocks_per_transfer (default is 128)\n"
+ " bs must be device block size (default 512)\n"
+ " cdbsz size of SCSI READ or WRITE cdb (default is 10)\n"
+ " coe continue on error, 0->exit (def), "
+ "1->zero + continue\n"
+ " count number of blocks to copy (def: device size)\n"
+ " deb for debug, 0->none (def), > 0->varying degrees "
+ "of debug\n");
+ pr2serr(" dio is direct IO, 1->attempt, 0->indirect IO (def)\n"
+ " fua force unit access: 0->don't(def), 1->OFILE, "
+ "2->IFILE,\n"
+ " 3->OFILE+IFILE\n"
+ " if file or device to read from (def: stdin)\n"
+ " iflag comma separated list from: [coe,dio,direct,dpo,"
+ "dsync,excl,\n"
+ " fua, null]\n"
+ " of file or device to write to (def: stdout), "
+ "OFILE of '.'\n"
+ " treated as /dev/null\n"
+ " oflag comma separated list from: [append,coe,dio,"
+ "direct,dpo,dsync,\n"
+ " excl,fua,null]\n"
+ " seek block position to start writing to OFILE\n"
+ " skip block position to start reading from IFILE\n"
+ " sync 0->no sync(def), 1->SYNCHRONIZE CACHE on OFILE "
+ "after copy\n"
+ " thr is number of threads, must be > 0, default 4, "
+ "max 16\n"
+ " time 0->no timing(def), 1->time plus calculate "
+ "throughput\n"
+ " verbose same as 'deb=VERB': increase verbosity\n"
+ " --help output this usage message then exit\n"
+ " --version output version string then exit\n"
+ "Copy from IFILE to OFILE, similar to dd command\n"
+ "specialized for SCSI devices, uses multiple POSIX threads\n");
}
static void
@@ -477,7 +475,7 @@ sig_listen_thread(void * v_clp)
while (1) {
sigwait(&signal_set, &sig_number);
if (SIGINT == sig_number) {
- fprintf(stderr, ME "interrupted by SIGINT\n");
+ pr2serr(ME "interrupted by SIGINT\n");
guarded_stop_both(clp);
pthread_cond_broadcast(&clp->out_sync_cv);
}
@@ -490,7 +488,7 @@ cleanup_in(void * v_clp)
{
Rq_coll * clp = (Rq_coll *)v_clp;
- fprintf(stderr, "thread cancelled while in mutex held\n");
+ pr2serr("thread cancelled while in mutex held\n");
clp->in_stop = 1;
pthread_mutex_unlock(&clp->in_mutex);
guarded_stop_out(clp);
@@ -502,7 +500,7 @@ cleanup_out(void * v_clp)
{
Rq_coll * clp = (Rq_coll *)v_clp;
- fprintf(stderr, "thread cancelled while out mutex held\n");
+ pr2serr("thread cancelled while out mutex held\n");
clp->out_stop = 1;
pthread_mutex_unlock(&clp->out_mutex);
guarded_stop_in(clp);
@@ -650,14 +648,14 @@ normal_in_operation(Rq_coll * clp, Rq_elem * rep, int blocks)
if (res < 0) {
if (clp->in_flags.coe) {
memset(rep->buffp, 0, rep->num_blks * rep->bs);
- fprintf(stderr, ">> substituted zeros for in blk=%" PRId64 " for "
- "%d bytes, %s\n", rep->blk,
+ pr2serr(">> substituted zeros for in blk=%" PRId64 " for %d "
+ "bytes, %s\n", rep->blk,
rep->num_blks * rep->bs,
tsafe_strerror(errno, strerr_buff));
res = rep->num_blks * clp->bs;
}
else {
- fprintf(stderr, "error in normal read, %s\n",
+ pr2serr("error in normal read, %s\n",
tsafe_strerror(errno, strerr_buff));
clp->in_stop = 1;
guarded_stop_out(clp);
@@ -695,14 +693,13 @@ normal_out_operation(Rq_coll * clp, Rq_elem * rep, int blocks)
;
if (res < 0) {
if (clp->out_flags.coe) {
- fprintf(stderr, ">> ignored error for out blk=%" PRId64 " for "
- "%d bytes, %s\n", rep->blk,
- rep->num_blks * rep->bs,
+ pr2serr(">> ignored error for out blk=%" PRId64 " for %d bytes, "
+ "%s\n", rep->blk, rep->num_blks * rep->bs,
tsafe_strerror(errno, strerr_buff));
res = rep->num_blks * clp->bs;
}
else {
- fprintf(stderr, "error normal write, %s\n",
+ pr2serr("error normal write, %s\n",
tsafe_strerror(errno, strerr_buff));
guarded_stop_in(clp);
clp->out_stop = 1;
@@ -741,18 +738,18 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be24(0x1fffff & start_block, cdbp + 1);
cdbp[4] = (256 == blocks) ? 0 : (unsigned char)blocks;
if (blocks > 256) {
- fprintf(stderr, ME "for 6 byte commands, maximum number of "
- "blocks is 256\n");
+ pr2serr(ME "for 6 byte commands, maximum number of blocks is "
+ "256\n");
return 1;
}
if ((start_block + blocks - 1) & (~0x1fffff)) {
- fprintf(stderr, ME "for 6 byte commands, can't address blocks"
- " beyond %d\n", 0x1fffff);
+ pr2serr(ME "for 6 byte commands, can't address blocks beyond "
+ "%d\n", 0x1fffff);
return 1;
}
if (dpo || fua) {
- fprintf(stderr, ME "for 6 byte commands, neither dpo nor fua"
- " bits supported\n");
+ pr2serr(ME "for 6 byte commands, neither dpo nor fua bits "
+ "supported\n");
return 1;
}
break;
@@ -763,8 +760,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32((uint32_t)start_block, cdbp + 2);
sg_put_unaligned_be16((uint16_t)blocks, cdbp + 7);
if (blocks & (~0xffff)) {
- fprintf(stderr, ME "for 10 byte commands, maximum number of "
- "blocks is %d\n", 0xffff);
+ pr2serr(ME "for 10 byte commands, maximum number of blocks is "
+ "%d\n", 0xffff);
return 1;
}
break;
@@ -783,8 +780,8 @@ sg_build_scsi_cdb(unsigned char * cdbp, int cdb_sz, unsigned int blocks,
sg_put_unaligned_be32((uint32_t)blocks, cdbp + 10);
break;
default:
- fprintf(stderr, ME "expected cdb size of 6, 10, 12, or 16 but got"
- " %d\n", cdb_sz);
+ pr2serr(ME "expected cdb size of 6, 10, 12, or 16 but got %d\n",
+ cdb_sz);
return 1;
}
return 0;
@@ -802,8 +799,7 @@ sg_in_operation(Rq_coll * clp, Rq_elem * rep)
if (1 == res)
err_exit(ENOMEM, "sg starting in command");
else if (res < 0) {
- fprintf(stderr, ME "inputting to sg failed, blk=%" PRId64 "\n",
- rep->blk);
+ pr2serr(ME "inputting to sg failed, blk=%" PRId64 "\n", rep->blk);
status = pthread_mutex_unlock(&clp->in_mutex);
if (0 != status) err_exit(status, "unlock in_mutex");
guarded_stop_both(clp);
@@ -825,15 +821,15 @@ sg_in_operation(Rq_coll * clp, Rq_elem * rep)
break;
case SG_LIB_CAT_MEDIUM_HARD:
if (0 == clp->in_flags.coe) {
- fprintf(stderr, "error finishing sg in command (medium)\n");
+ pr2serr("error finishing sg in command (medium)\n");
if (exit_status <= 0)
exit_status = res;
guarded_stop_both(clp);
return;
} else {
memset(rep->buffp, 0, rep->num_blks * rep->bs);
- fprintf(stderr, ">> substituted zeros for in blk=%" PRId64
- " for %d bytes\n", rep->blk, rep->num_blks * rep->bs);
+ pr2serr(">> substituted zeros for in blk=%" PRId64 " for %d "
+ "bytes\n", rep->blk, rep->num_blks * rep->bs);
}
/* fall through */
case 0:
@@ -852,7 +848,7 @@ sg_in_operation(Rq_coll * clp, Rq_elem * rep)
if (0 != status) err_exit(status, "unlock in_mutex");
return;
default:
- fprintf(stderr, "error finishing sg in command (%d)\n", res);
+ pr2serr("error finishing sg in command (%d)\n", res);
if (exit_status <= 0)
exit_status = res;
guarded_stop_both(clp);
@@ -873,7 +869,7 @@ sg_out_operation(Rq_coll * clp, Rq_elem * rep)
if (1 == res)
err_exit(ENOMEM, "sg starting out command");
else if (res < 0) {
- fprintf(stderr, ME "outputting from sg failed, blk=%" PRId64 "\n",
+ pr2serr(ME "outputting from sg failed, blk=%" PRId64 "\n",
rep->blk);
status = pthread_mutex_unlock(&clp->out_mutex);
if (0 != status) err_exit(status, "unlock out_mutex");
@@ -896,14 +892,14 @@ sg_out_operation(Rq_coll * clp, Rq_elem * rep)
break;
case SG_LIB_CAT_MEDIUM_HARD:
if (0 == clp->out_flags.coe) {
- fprintf(stderr, "error finishing sg out command (medium)\n");
+ pr2serr("error finishing sg out command (medium)\n");
if (exit_status <= 0)
exit_status = res;
guarded_stop_both(clp);
return;
} else
- fprintf(stderr, ">> ignored error for out blk=%" PRId64
- " for %d bytes\n", rep->blk, rep->num_blks * rep->bs);
+ pr2serr(">> ignored error for out blk=%" PRId64 " for %d "
+ "bytes\n", rep->blk, rep->num_blks * rep->bs);
/* fall through */
case 0:
if (rep->dio_incomplete || rep->resid) {
@@ -921,7 +917,7 @@ sg_out_operation(Rq_coll * clp, Rq_elem * rep)
if (0 != status) err_exit(status, "unlock out_mutex");
return;
default:
- fprintf(stderr, "error finishing sg out command (%d)\n", res);
+ pr2serr("error finishing sg out command (%d)\n", res);
if (exit_status <= 0)
exit_status = res;
guarded_stop_both(clp);
@@ -942,8 +938,8 @@ sg_start_io(Rq_elem * rep)
if (sg_build_scsi_cdb(rep->cmd, cdbsz, rep->num_blks, rep->blk,
rep->wr, fua, dpo)) {
- fprintf(stderr, ME "bad cdb build, start_blk=%" PRId64
- ", blocks=%d\n", rep->blk, rep->num_blks);
+ pr2serr(ME "bad cdb build, start_blk=%" PRId64 ", blocks=%d\n",
+ rep->blk, rep->num_blks);
return -1;
}
memset(hp, 0, sizeof(struct sg_io_hdr));
@@ -961,7 +957,7 @@ sg_start_io(Rq_elem * rep)
if (dio)
hp->flags |= SG_FLAG_DIRECT_IO;
if (rep->debug > 8) {
- fprintf(stderr, "sg_start_io: SCSI %s, blk=%" PRId64 " num_blks=%d\n",
+ pr2serr("sg_start_io: SCSI %s, blk=%" PRId64 " num_blks=%d\n",
rep->wr ? "WRITE" : "READ", rep->blk, rep->num_blks);
sg_print_command(hp->cmdp);
}
@@ -1049,7 +1045,7 @@ sg_finish_io(int wr, Rq_elem * rep, pthread_mutex_t * a_mutp)
rep->dio_incomplete = 0;
rep->resid = hp->resid;
if (rep->debug > 8)
- fprintf(stderr, "sg_finish_io: completed %s\n", wr ? "WRITE" : "READ");
+ pr2serr("sg_finish_io: completed %s\n", wr ? "WRITE" : "READ");
return 0;
}
@@ -1060,7 +1056,7 @@ sg_prepare(int fd, int bs, int bpt)
res = ioctl(fd, SG_GET_VERSION_NUM, &t);
if ((res < 0) || (t < 30000)) {
- fprintf(stderr, ME "sg driver prior to 3.x.y\n");
+ pr2serr(ME "sg driver prior to 3.x.y\n");
return 1;
}
res = 0;
@@ -1085,7 +1081,7 @@ process_flags(const char * arg, struct flags_t * fp)
strncpy(buff, arg, sizeof(buff));
buff[sizeof(buff) - 1] = '\0';
if ('\0' == buff[0]) {
- fprintf(stderr, "no flag found\n");
+ pr2serr("no flag found\n");
return 1;
}
cp = buff;
@@ -1112,7 +1108,7 @@ process_flags(const char * arg, struct flags_t * fp)
else if (0 == strcmp(cp, "null"))
;
else {
- fprintf(stderr, "unrecognised flag: %s\n", cp);
+ pr2serr("unrecognised flag: %s\n", cp);
return 1;
}
cp = np;
@@ -1170,14 +1166,14 @@ main(int argc, char * argv[])
if (0 == strcmp(key,"bpt")) {
rcoll.bpt = sg_get_num(buf);
if (-1 == rcoll.bpt) {
- fprintf(stderr, ME "bad argument to 'bpt='\n");
+ pr2serr(ME "bad argument to 'bpt='\n");
return SG_LIB_SYNTAX_ERROR;
}
bpt_given = 1;
} else if (0 == strcmp(key,"bs")) {
rcoll.bs = sg_get_num(buf);
if (-1 == rcoll.bs) {
- fprintf(stderr, ME "bad argument to 'bs='\n");
+ pr2serr(ME "bad argument to 'bs='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"cdbsz")) {
@@ -1191,7 +1187,7 @@ main(int argc, char * argv[])
if (0 != strcmp("-1", buf)) {
dd_count = sg_get_llnum(buf);
if (-1LL == dd_count) {
- fprintf(stderr, ME "bad argument to 'count='\n");
+ pr2serr(ME "bad argument to 'count='\n");
return SG_LIB_SYNTAX_ERROR;
}
} /* treat 'count=-1' as calculate count (same as not given) */
@@ -1210,47 +1206,47 @@ main(int argc, char * argv[])
} else if (0 == strcmp(key,"ibs")) {
ibs = sg_get_num(buf);
if (-1 == ibs) {
- fprintf(stderr, ME "bad argument to 'ibs='\n");
+ pr2serr(ME "bad argument to 'ibs='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (strcmp(key,"if") == 0) {
if ('\0' != inf[0]) {
- fprintf(stderr, "Second 'if=' argument??\n");
+ pr2serr("Second 'if=' argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(inf, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "iflag")) {
if (process_flags(buf, &rcoll.in_flags)) {
- fprintf(stderr, ME "bad argument to 'iflag='\n");
+ pr2serr(ME "bad argument to 'iflag='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"obs")) {
obs = sg_get_num(buf);
if (-1 == obs) {
- fprintf(stderr, ME "bad argument to 'obs='\n");
+ pr2serr(ME "bad argument to 'obs='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (strcmp(key,"of") == 0) {
if ('\0' != outf[0]) {
- fprintf(stderr, "Second 'of=' argument??\n");
+ pr2serr("Second 'of=' argument??\n");
return SG_LIB_SYNTAX_ERROR;
} else
strncpy(outf, buf, INOUTF_SZ);
} else if (0 == strcmp(key, "oflag")) {
if (process_flags(buf, &rcoll.out_flags)) {
- fprintf(stderr, ME "bad argument to 'oflag='\n");
+ pr2serr(ME "bad argument to 'oflag='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"seek")) {
seek = sg_get_llnum(buf);
if (-1LL == seek) {
- fprintf(stderr, ME "bad argument to 'seek='\n");
+ pr2serr(ME "bad argument to 'seek='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"skip")) {
skip = sg_get_llnum(buf);
if (-1LL == skip) {
- fprintf(stderr, ME "bad argument to 'skip='\n");
+ pr2serr(ME "bad argument to 'skip='\n");
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"sync"))
@@ -1266,36 +1262,34 @@ main(int argc, char * argv[])
return 0;
} else if ((0 == strncmp(key, "--vers", 6)) ||
(0 == strcmp(key, "-V"))) {
- fprintf(stderr, ME ": %s\n",
- version_str);
+ pr2serr(ME ": %s\n", version_str);
return 0;
}
else {
- fprintf(stderr, "Unrecognized option '%s'\n", key);
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Unrecognized option '%s'\n", key);
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
}
if (rcoll.bs <= 0) {
rcoll.bs = DEF_BLOCK_SIZE;
- fprintf(stderr, "Assume default 'bs' (block size) of %d bytes\n",
- rcoll.bs);
+ pr2serr("Assume default 'bs' (block size) of %d bytes\n", rcoll.bs);
}
if ((ibs && (ibs != rcoll.bs)) || (obs && (obs != rcoll.bs))) {
- fprintf(stderr, "If 'ibs' or 'obs' given must be same as 'bs'\n");
+ pr2serr("If 'ibs' or 'obs' given must be same as 'bs'\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if ((skip < 0) || (seek < 0)) {
- fprintf(stderr, "skip and seek cannot be negative\n");
+ pr2serr("skip and seek cannot be negative\n");
return SG_LIB_SYNTAX_ERROR;
}
if ((rcoll.out_flags.append > 0) && (seek > 0)) {
- fprintf(stderr, "Can't use both append and seek switches\n");
+ pr2serr("Can't use both append and seek switches\n");
return SG_LIB_SYNTAX_ERROR;
}
if (rcoll.bpt < 1) {
- fprintf(stderr, "bpt must be greater than 0\n");
+ pr2serr("bpt must be greater than 0\n");
return SG_LIB_SYNTAX_ERROR;
}
/* defaulting transfer size to 128*2048 for CD/DVDs is too large
@@ -1304,13 +1298,13 @@ main(int argc, char * argv[])
if ((rcoll.bs >= 2048) && (0 == bpt_given))
rcoll.bpt = DEF_BLOCKS_PER_2048TRANSFER;
if ((num_threads < 1) || (num_threads > MAX_NUM_THREADS)) {
- fprintf(stderr, "too few or too many threads requested\n");
+ pr2serr("too few or too many threads requested\n");
usage();
return SG_LIB_SYNTAX_ERROR;
}
if (rcoll.debug)
- fprintf(stderr, ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64
- " count=%" PRId64 "\n", inf, skip, outf, seek, dd_count);
+ pr2serr(ME "if=%s skip=%" PRId64 " of=%s seek=%" PRId64 " count=%"
+ PRId64 "\n", inf, skip, outf, seek, dd_count);
install_handler(SIGINT, interrupt_handler);
install_handler(SIGQUIT, interrupt_handler);
@@ -1323,10 +1317,10 @@ main(int argc, char * argv[])
rcoll.in_type = dd_filetype(inf);
if (FT_ERROR == rcoll.in_type) {
- fprintf(stderr, ME "unable to access %s\n", inf);
+ pr2serr(ME "unable to access %s\n", inf);
return SG_LIB_FILE_ERROR;
} else if (FT_ST == rcoll.in_type) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", inf);
+ pr2serr(ME "unable to use scsi tape device %s\n", inf);
return SG_LIB_FILE_ERROR;
} else if (FT_SG == rcoll.in_type) {
flags = O_RDWR;
@@ -1378,7 +1372,7 @@ main(int argc, char * argv[])
rcoll.out_type = dd_filetype(outf);
if (FT_ST == rcoll.out_type) {
- fprintf(stderr, ME "unable to use scsi tape device %s\n", outf);
+ pr2serr(ME "unable to use scsi tape device %s\n", outf);
return SG_LIB_FILE_ERROR;
}
else if (FT_SG == rcoll.out_type) {
@@ -1443,9 +1437,8 @@ main(int argc, char * argv[])
}
}
if ((STDIN_FILENO == rcoll.infd) && (STDOUT_FILENO == rcoll.outfd)) {
- fprintf(stderr, "Won't default both IFILE to stdin _and_ OFILE to "
- "stdout\n");
- fprintf(stderr, "For more information use '--help'\n");
+ pr2serr("Won't default both IFILE to stdin _and_ OFILE to stdout\n");
+ pr2serr("For more information use '--help'\n");
return SG_LIB_SYNTAX_ERROR;
}
if (dd_count < 0) {
@@ -1453,31 +1446,28 @@ main(int argc, char * argv[])
if (FT_SG == rcoll.in_type) {
res = scsi_read_capacity(rcoll.infd, &in_num_sect, &in_sect_sz);
if (2 == res) {
- fprintf(stderr,
- "Unit attention, media changed(in), continuing\n");
+ pr2serr("Unit attention, media changed(in), continuing\n");
res = scsi_read_capacity(rcoll.infd, &in_num_sect,
&in_sect_sz);
}
if (0 != res) {
if (res == SG_LIB_CAT_INVALID_OP)
- fprintf(stderr, "read capacity not supported on %s\n",
- inf);
+ pr2serr("read capacity not supported on %s\n", inf);
else if (res == SG_LIB_CAT_NOT_READY)
- fprintf(stderr, "read capacity failed, %s not ready\n",
- inf);
+ pr2serr("read capacity failed, %s not ready\n", inf);
else
- fprintf(stderr, "Unable to read capacity on %s\n", inf);
+ pr2serr("Unable to read capacity on %s\n", inf);
in_num_sect = -1;
}
} else if (FT_BLOCK == rcoll.in_type) {
if (0 != read_blkdev_capacity(rcoll.infd, &in_num_sect,
&in_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n", inf);
+ pr2serr("Unable to read block capacity on %s\n", inf);
in_num_sect = -1;
}
if (rcoll.bs != in_sect_sz) {
- fprintf(stderr, "block size on %s confusion; bs=%d, from "
- "device=%d\n", inf, rcoll.bs, in_sect_sz);
+ pr2serr("block size on %s confusion; bs=%d, from device=%d\n",
+ inf, rcoll.bs, in_sect_sz);
in_num_sect = -1;
}
}
@@ -1488,32 +1478,28 @@ main(int argc, char * argv[])
if (FT_SG == rcoll.out_type) {
res = scsi_read_capacity(rcoll.outfd, &out_num_sect, &out_sect_sz);
if (2 == res) {
- fprintf(stderr,
- "Unit attention, media changed(out), continuing\n");
+ pr2serr("Unit attention, media changed(out), continuing\n");
res = scsi_read_capacity(rcoll.outfd, &out_num_sect,
&out_sect_sz);
}
if (0 != res) {
if (res == SG_LIB_CAT_INVALID_OP)
- fprintf(stderr, "read capacity not supported on %s\n",
- outf);
+ pr2serr("read capacity not supported on %s\n", outf);
else if (res == SG_LIB_CAT_NOT_READY)
- fprintf(stderr, "read capacity failed, %s not ready\n",
- outf);
+ pr2serr("read capacity failed, %s not ready\n", outf);
else
- fprintf(stderr, "Unable to read capacity on %s\n", outf);
+ pr2serr("Unable to read capacity on %s\n", outf);
out_num_sect = -1;
}
} else if (FT_BLOCK == rcoll.out_type) {
if (0 != read_blkdev_capacity(rcoll.outfd, &out_num_sect,
&out_sect_sz)) {
- fprintf(stderr, "Unable to read block capacity on %s\n",
- outf);
+ pr2serr("Unable to read block capacity on %s\n", outf);
out_num_sect = -1;
}
if (rcoll.bs != out_sect_sz) {
- fprintf(stderr, "block size on %s confusion: bs=%d, from "
- "device=%d\n", outf, rcoll.bs, out_sect_sz);
+ pr2serr("block size on %s confusion: bs=%d, from device=%d\n",
+ outf, rcoll.bs, out_sect_sz);
out_num_sect = -1;
}
}
@@ -1531,24 +1517,24 @@ main(int argc, char * argv[])
dd_count = out_num_sect;
}
if (rcoll.debug > 1)
- fprintf(stderr, "Start of loop, count=%" PRId64 ", in_num_sect=%"
- PRId64 ", out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
+ pr2serr("Start of loop, count=%" PRId64 ", in_num_sect=%" PRId64
+ ", out_num_sect=%" PRId64 "\n", dd_count, in_num_sect,
out_num_sect);
if (dd_count < 0) {
- fprintf(stderr, "Couldn't calculate count, please give one\n");
+ pr2serr("Couldn't calculate count, please give one\n");
return SG_LIB_CAT_OTHER;
}
if (! cdbsz_given) {
if ((FT_SG == rcoll.in_type) && (MAX_SCSI_CDBSZ != rcoll.cdbsz_in) &&
(((dd_count + skip) > UINT_MAX) || (rcoll.bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'if')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'if')\n");
rcoll.cdbsz_in = MAX_SCSI_CDBSZ;
}
if ((FT_SG == rcoll.out_type) && (MAX_SCSI_CDBSZ != rcoll.cdbsz_out) &&
(((dd_count + seek) > UINT_MAX) || (rcoll.bpt > USHRT_MAX))) {
- fprintf(stderr, "Note: SCSI command size increased to 16 bytes "
- "(for 'of')\n");
+ pr2serr("Note: SCSI command size increased to 16 bytes (for "
+ "'of')\n");
rcoll.cdbsz_out = MAX_SCSI_CDBSZ;
}
}
@@ -1593,7 +1579,7 @@ main(int argc, char * argv[])
(void *)&rcoll);
if (0 != status) err_exit(status, "pthread_create");
if (rcoll.debug)
- fprintf(stderr, "Starting worker thread k=0\n");
+ pr2serr("Starting worker thread k=0\n");
/* wait for any broadcast */
pthread_cleanup_push(cleanup_out, (void *)&rcoll);
@@ -1609,7 +1595,7 @@ main(int argc, char * argv[])
(void *)&rcoll);
if (0 != status) err_exit(status, "pthread_create");
if (rcoll.debug)
- fprintf(stderr, "Starting worker thread k=%d\n", k);
+ pr2serr("Starting worker thread k=%d\n", k);
}
/* now wait for worker threads to finish */
@@ -1617,7 +1603,7 @@ main(int argc, char * argv[])
status = pthread_join(threads[k], &vp);
if (0 != status) err_exit(status, "pthread_join");
if (rcoll.debug)
- fprintf(stderr, "Worker thread k=%d terminated\n", k);
+ pr2serr("Worker thread k=%d terminated\n", k);
}
}
@@ -1626,15 +1612,14 @@ main(int argc, char * argv[])
if (do_sync) {
if (FT_SG == rcoll.out_type) {
- fprintf(stderr, ">> Synchronizing cache on %s\n", outf);
+ pr2serr(">> Synchronizing cache on %s\n", outf);
res = sg_ll_sync_cache_10(rcoll.outfd, 0, 0, 0, 0, 0, 0, 0);
if (SG_LIB_CAT_UNIT_ATTENTION == res) {
- fprintf(stderr,
- "Unit attention(out), continuing\n");
+ pr2serr("Unit attention(out), continuing\n");
res = sg_ll_sync_cache_10(rcoll.outfd, 0, 0, 0, 0, 0, 0, 0);
}
if (0 != res)
- fprintf(stderr, "Unable to synchronize cache\n");
+ pr2serr("Unable to synchronize cache\n");
}
}
@@ -1646,8 +1631,8 @@ main(int argc, char * argv[])
close(rcoll.outfd);
res = exit_status;
if (0 != rcoll.out_count) {
- fprintf(stderr, ">>>> Some error occurred, remaining blocks=%"
- PRId64 "\n", rcoll.out_count);
+ pr2serr(">>>> Some error occurred, remaining blocks=%" PRId64 "\n",
+ rcoll.out_count);
if (0 == res)
res = SG_LIB_CAT_OTHER;
}
@@ -1656,19 +1641,19 @@ main(int argc, char * argv[])
int fd;
char c;
- fprintf(stderr, ">> Direct IO requested but incomplete %d times\n",
+ pr2serr(">> Direct IO requested but incomplete %d times\n",
rcoll.dio_incomplete);
if ((fd = open(proc_allow_dio, O_RDONLY)) >= 0) {
if (1 == read(fd, &c, 1)) {
if ('0' == c)
- fprintf(stderr, ">>> %s set to '0' but should be set "
- "to '1' for direct IO\n", proc_allow_dio);
+ pr2serr(">>> %s set to '0' but should be set to '1' for "
+ "direct IO\n", proc_allow_dio);
}
close(fd);
}
}
if (rcoll.sum_of_resids)
- fprintf(stderr, ">> Non-zero sum of residual counts=%d\n",
+ pr2serr(">> Non-zero sum of residual counts=%d\n",
rcoll.sum_of_resids);
return (res >= 0) ? res : SG_LIB_CAT_OTHER;
}