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/sgp_dd.c | |
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/sgp_dd.c')
-rw-r--r-- | src/sgp_dd.c | 321 |
1 files changed, 153 insertions, 168 deletions
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; } |