diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2015-12-20 16:23:44 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2015-12-20 16:23:44 +0000 |
commit | 9fbc884d5e7900d4edab95d18dc16d5ca8caa5b5 (patch) | |
tree | beedd798f77493980f389ccc4ef58a3489cfbbaf /src | |
parent | e359da1369caf436878cd05386b83b54359ecce1 (diff) | |
download | sg3_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')
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; } |