aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2015-05-12 04:21:05 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2015-05-12 04:21:05 +0000
commit77c837a07783a4e63b7f4a85852f55a112b994e0 (patch)
tree59ea0b252047bccea1e04c5ceeed3ccec04465c5
parentf54b2fbd8e1cc79cf1bafe9516a4771f88be29a7 (diff)
downloadsg3_utils-77c837a07783a4e63b7f4a85852f55a112b994e0.tar.gz
sg_lib: Linux: ENXIO errno --> SG_LIB_CAT_NOT_READY; asc/ascq codes --> T10 20150423
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@644 6180dd3e-e324-4e3e-922d-17de1ae2f315
-rw-r--r--ChangeLog9
-rw-r--r--doc/sg3_utils.89
-rw-r--r--lib/sg_cmds_basic.c148
-rw-r--r--lib/sg_cmds_basic2.c192
-rw-r--r--lib/sg_cmds_extra.c443
-rw-r--r--lib/sg_cmds_mmc.c86
-rw-r--r--lib/sg_io_linux.c59
-rw-r--r--lib/sg_lib.c45
-rw-r--r--lib/sg_lib_data.c5
-rw-r--r--lib/sg_pt_freebsd.c55
-rw-r--r--lib/sg_pt_linux.c90
-rw-r--r--lib/sg_pt_osf1.c50
-rw-r--r--lib/sg_pt_win32.c145
-rwxr-xr-xscripts/rescan-scsi-bus.sh6
-rw-r--r--src/sg_compare_and_write.c8
-rw-r--r--src/sg_inq.c26
-rw-r--r--src/sg_modes.c5
-rw-r--r--src/sg_opcodes.c11
-rw-r--r--src/sg_raw.c10
-rw-r--r--src/sg_sanitize.c6
-rw-r--r--src/sg_sync.c6
-rw-r--r--src/sg_vpd.c7
-rw-r--r--src/sg_write_same.c4
23 files changed, 758 insertions, 667 deletions
diff --git a/ChangeLog b/ChangeLog
index 0420ccc5..b438075a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,7 @@ Each utility has its own version number, date of last change and
some description at the top of its ".c" file. All utilities in the main
directory have their own "man" pages. There is also a sg3_utils man page.
-Changelog for sg3_utils-1.41 [20150428] [svn: r643]
+Changelog for sg3_utils-1.41 [20150511] [svn: r644]
- sg_zone: new utility for open, close and finish
zone commands introduced in zbc-r02
- sg_rep_zones and sg_reset_wp: change opcodes as
@@ -14,6 +14,9 @@ Changelog for sg3_utils-1.41 [20150428] [svn: r643]
- sg_write_buffer: add --timeout=TO option
- sg_lib interface: add sg_lib_pdt_decay(), TPROTO_PCIE
plus support for zoning service actions
+ - sg_lib: in Linux blocked devices yield ENXIO from
+ ioctl(SG_IO), map to SG_LIB_CAT_NOT_READY
+ - clean up sg_warnings_stream handling
- sg_inq+sg_vpd: fix SCSI name string decoding in
device identification VPD page (0x83)
- increase sanity on Unit Serial number VPD page
@@ -38,12 +41,12 @@ Changelog for sg3_utils-1.41 [20150428] [svn: r643]
'sdparm --inhex='
- sg_rdac: add '-6' option for mode sense/select(6)
- add support for reporting more SCSI transports
- and accessing rdac extended mode page 2c
+ and accessing rdac extended mode page 0x2c
- sg_write_same: cleanup, mainly man page
- scsi_logging_level: replace use of tr command
- examples/sg_tst_async: cleanup
- examples/sg-simple_aio.c: remove
- - sg_lib_data: sync asc/ascq codes with T10 20150406
+ - sg_lib_data: sync asc/ascq codes with T10 20150423
- Makefile cleanup
- autogen.sh: upgrade to buildconf 20091223 version
diff --git a/doc/sg3_utils.8 b/doc/sg3_utils.8
index 92ad18de..f4c6bac9 100644
--- a/doc/sg3_utils.8
+++ b/doc/sg3_utils.8
@@ -1,4 +1,4 @@
-.TH SG3_UTILS "8" "January 2015" "sg3_utils\-1.41" SG3_UTILS
+.TH SG3_UTILS "8" "May 2015" "sg3_utils\-1.41" SG3_UTILS
.SH NAME
sg3_utils \- a package of utilities for sending SCSI commands
.SH SYNOPSIS
@@ -204,9 +204,10 @@ syntax error. Either illegal command line options, options with bad
arguments or a combination of options that is not permitted.
.TP
.B 2
-the \fIDEVICE\fR reports that it is not ready for the operation
-requested. The device may be in the process of becoming ready (e.g.
-spinning up but not at speed) so the utility may work after a wait.
+the \fIDEVICE\fR reports that it is not ready for the operation requested.
+The \fIDEVICE\fR may be in the process of becoming ready (e.g. spinning up
+but not at speed) so the utility may work after a wait. In Linux the
+\fIDEVICE\fR may be temporarily blocked while error recovery is taking place.
.TP
.B 3
the \fIDEVICE\fR reports a medium or hardware error (or a blank check). For
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
index b42d8969..89fe3ffc 100644
--- a/lib/sg_cmds_basic.c
+++ b/lib/sg_cmds_basic.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2014 Douglas Gilbert.
+ * Copyright (c) 1999-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.
@@ -16,6 +16,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include "sg_lib.h"
@@ -26,8 +27,13 @@
#include "config.h"
#endif
+/* Needs to be after config.h */
+#ifdef SG_LIB_LINUX
+#include <errno.h>
+#endif
+
-static const char * version_str = "1.69 20141006";
+static const char * version_str = "1.70 20150511";
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -55,11 +61,37 @@ sg_cmds_version()
return version_str;
}
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Returns file descriptor >= 0 if successful. If error in Unix returns
negated errno. */
int
sg_cmds_open_device(const char * device_name, int read_only, int verbose)
{
+ /* The following 2 lines are temporary. It is to avoid a NULL pointer
+ * crash when an old utility is used with a newer library built after
+ * the sg_warnings_strm cleanup */
+ if (NULL == sg_warnings_strm)
+ sg_warnings_strm = stderr;
+
return scsi_pt_open_device(device_name, read_only, verbose);
}
@@ -114,12 +146,12 @@ sg_cmds_process_helper(const char * leadin, int mx_di_len, int resid,
if (verbose || n) {
sg_get_sense_str(leadin, sbp, slen, (verbose > 1),
sizeof(b), b);
- fprintf(sg_warnings_strm, "%s", b);
+ pr2ws("%s", b);
if ((mx_di_len > 0) && (resid > 0)) {
got = mx_di_len - resid;
if ((verbose > 2) || check_data_in || (got > 0))
- fprintf(sg_warnings_strm, " pass-through requested %d "
- "bytes (data-in) but got %d bytes\n", mx_di_len, got);
+ pr2ws(" pass-through requested %d bytes (data-in) but "
+ "got %d bytes\n", mx_di_len, got);
}
}
if (o_sense_cat)
@@ -146,24 +178,36 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
int got, cat, duration, slen, resid, resp_code, sstat;
char b[1024];
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (NULL == leadin)
leadin = "";
if (pt_res < 0) {
+#ifdef SG_LIB_LINUX
+ if (verbose)
+ pr2ws("%s: pass through os error: %s\n", leadin,
+ safe_strerror(-pt_res));
+ if ((-ENXIO == pt_res) && o_sense_cat) {
+ if (verbose > 2)
+ pr2ws("map ENXIO to SG_LIB_CAT_NOT_READY\n");
+ *o_sense_cat = SG_LIB_CAT_NOT_READY;
+ return -2;
+ } else if (noisy && (0 == verbose))
+ pr2ws("%s: pass through os error: %s\n", leadin,
+ safe_strerror(-pt_res));
+#else
if (noisy || verbose)
- fprintf(sg_warnings_strm, "%s: pass through os error: %s\n",
- leadin, safe_strerror(-pt_res));
+ pr2ws("%s: pass through os error: %s\n", leadin,
+ safe_strerror(-pt_res));
+#endif
return -1;
} else if (SCSI_PT_DO_BAD_PARAMS == pt_res) {
- fprintf(sg_warnings_strm, "%s: bad pass through setup\n", leadin);
+ pr2ws("%s: bad pass through setup\n", leadin);
return -1;
} else if (SCSI_PT_DO_TIMEOUT == pt_res) {
- fprintf(sg_warnings_strm, "%s: pass through timeout\n", leadin);
+ pr2ws("%s: pass through timeout\n", leadin);
return -1;
}
if ((verbose > 2) && ((duration = get_scsi_pt_duration_ms(ptvp)) >= 0))
- fprintf(sg_warnings_strm, " duration=%d ms\n", duration);
+ pr2ws(" duration=%d ms\n", duration);
resid = (mx_di_len > 0) ? get_scsi_pt_resid(ptvp) : 0;
slen = get_scsi_pt_sense_len(ptvp);
switch ((cat = get_scsi_pt_result_category(ptvp))) {
@@ -184,9 +228,8 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
if (mx_di_len > 0) {
got = mx_di_len - resid;
if ((verbose > 1) && (resid > 0))
- fprintf(sg_warnings_strm, " %s: pass-through requested "
- "%d bytes (data-in) but got %d bytes\n", leadin,
- mx_di_len, got);
+ pr2ws(" %s: pass-through requested %d bytes (data-in) "
+ "but got %d bytes\n", leadin, mx_di_len, got);
return got;
} else
return 0;
@@ -199,7 +242,7 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
}
if (verbose || noisy) {
sg_get_scsi_status_str(sstat, sizeof(b), b);
- fprintf(sg_warnings_strm, "%s: scsi status: %s\n", leadin, b);
+ pr2ws("%s: scsi status: %s\n", leadin, b);
}
return -1;
case SCSI_PT_RESULT_SENSE:
@@ -208,7 +251,7 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
case SCSI_PT_RESULT_TRANSPORT_ERR:
if (verbose || noisy) {
get_scsi_pt_transport_err_str(ptvp, sizeof(b), b);
- fprintf(sg_warnings_strm, "%s: transport: %s\n", leadin, b);
+ pr2ws("%s: transport: %s\n", leadin, b);
}
if ((SAM_STAT_CHECK_CONDITION == get_scsi_pt_status_response(ptvp))
&& (slen > 0))
@@ -219,12 +262,11 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
case SCSI_PT_RESULT_OS_ERR:
if (verbose || noisy) {
get_scsi_pt_os_err_str(ptvp, sizeof(b), b);
- fprintf(sg_warnings_strm, "%s: os: %s\n", leadin, b);
+ pr2ws("%s: os: %s\n", leadin, b);
}
return -1;
default:
- fprintf(sg_warnings_strm, "%s: unknown pass through result "
- "category (%d)\n", leadin, cat);
+ pr2ws("%s: unknown pass through result category (%d)\n", leadin, cat);
return -1;
}
}
@@ -249,13 +291,11 @@ sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
/* 16 bit allocation length (was 8) is a recent SPC-3 addition */
inqCmdBlk[3] = (unsigned char)((mx_resp_len >> 8) & 0xff);
inqCmdBlk[4] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " inquiry cdb: ");
+ pr2ws(" inquiry cdb: ");
for (k = 0; k < INQUIRY_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", inqCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", inqCmdBlk[k]);
+ pr2ws("\n");
}
if (resp && (mx_resp_len > 0)) {
up = (unsigned char *)resp;
@@ -265,7 +305,7 @@ sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "inquiry: out of memory\n");
+ pr2ws("inquiry: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, inqCmdBlk, sizeof(inqCmdBlk));
@@ -290,16 +330,15 @@ sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
}
} else if (ret < 4) {
if (verbose)
- fprintf(sg_warnings_strm, "inquiry: got too few "
- "bytes (%d)\n", ret);
+ pr2ws("inquiry: got too few bytes (%d)\n", ret);
ret = SG_LIB_CAT_MALFORMED;
} else
ret = 0;
if (resid > 0) {
if (resid > mx_resp_len) {
- fprintf(sg_warnings_strm, "inquiry: resid (%d) should never "
- "exceed requested len=%d\n", resid, mx_resp_len);
+ pr2ws("inquiry: resid (%d) should never exceed requested "
+ "len=%d\n", resid, mx_resp_len);
return ret ? ret : SG_LIB_CAT_MALFORMED;
}
/* zero unfilled section of response buffer */
@@ -327,19 +366,17 @@ sg_simple_inquiry(int sg_fd, struct sg_simple_inquiry_resp * inq_data,
inq_data->peripheral_type = 0x1f;
}
inqCmdBlk[4] = (unsigned char)sizeof(inq_resp);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " inquiry cdb: ");
+ pr2ws(" inquiry cdb: ");
for (k = 0; k < INQUIRY_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", inqCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", inqCmdBlk[k]);
+ pr2ws("\n");
}
memset(inq_resp, 0, sizeof(inq_resp));
inq_resp[0] = 0x7f; /* defensive prefill */
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "inquiry: out of memory\n");
+ pr2ws("inquiry: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, inqCmdBlk, sizeof(inqCmdBlk));
@@ -362,8 +399,7 @@ sg_simple_inquiry(int sg_fd, struct sg_simple_inquiry_resp * inq_data,
}
} else if (ret < 4) {
if (verbose)
- fprintf(sg_warnings_strm, "inquiry: got too few "
- "bytes (%d)\n", ret);
+ pr2ws("inquiry: got too few bytes (%d)\n", ret);
ret = SG_LIB_CAT_MALFORMED;
} else
ret = 0;
@@ -400,18 +436,16 @@ sg_ll_test_unit_ready_progress(int sg_fd, int pack_id, int * progress,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " test unit ready cdb: ");
+ pr2ws(" test unit ready cdb: ");
for (k = 0; k < TUR_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", turCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", turCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "test unit ready: out of memory\n");
+ pr2ws("test unit ready: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, turCmdBlk, sizeof(turCmdBlk));
@@ -470,23 +504,21 @@ sg_ll_request_sense(int sg_fd, int desc, void * resp, int mx_resp_len,
if (desc)
rsCmdBlk[1] |= 0x1;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (mx_resp_len > 0xff) {
- fprintf(sg_warnings_strm, "mx_resp_len cannot exceed 255\n");
+ pr2ws("mx_resp_len cannot exceed 255\n");
return -1;
}
rsCmdBlk[4] = mx_resp_len & 0xff;
if (verbose) {
- fprintf(sg_warnings_strm, " Request Sense cmd: ");
+ pr2ws(" Request Sense cmd: ");
for (k = 0; k < REQUEST_SENSE_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rsCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rsCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "request sense: out of memory\n");
+ pr2ws("request sense: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rsCmdBlk, sizeof(rsCmdBlk));
@@ -510,8 +542,8 @@ sg_ll_request_sense(int sg_fd, int desc, void * resp, int mx_resp_len,
} else {
if ((mx_resp_len >= 8) && (ret < 8)) {
if (verbose)
- fprintf(sg_warnings_strm, " request sense: got %d "
- "bytes in response, too short\n", ret);
+ pr2ws(" request sense: got %d bytes in response, too "
+ "short\n", ret);
ret = -1;
} else
ret = 0;
@@ -537,18 +569,16 @@ sg_ll_report_luns(int sg_fd, int select_report, void * resp, int mx_resp_len,
rlCmdBlk[7] = (mx_resp_len >> 16) & 0xff;
rlCmdBlk[8] = (mx_resp_len >> 8) & 0xff;
rlCmdBlk[9] = mx_resp_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " report luns cdb: ");
+ pr2ws(" report luns cdb: ");
for (k = 0; k < REPORT_LUNS_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rlCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rlCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "report luns: out of memory\n");
+ pr2ws("report luns: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rlCmdBlk, sizeof(rlCmdBlk));
diff --git a/lib/sg_cmds_basic2.c b/lib/sg_cmds_basic2.c
index 70197536..c576a36a 100644
--- a/lib/sg_cmds_basic2.c
+++ b/lib/sg_cmds_basic2.c
@@ -16,6 +16,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include "sg_lib.h"
@@ -67,6 +68,26 @@
#define INQUIRY_RESP_INITIAL_LEN 36
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Invokes a SCSI SYNCHRONIZE CACHE (10) command. Return of 0 -> success,
* various SG_LIB_CAT_* positive values or -1 -> other errors */
int
@@ -89,24 +110,22 @@ sg_ll_sync_cache_10(int sg_fd, int sync_nv, int immed, int group,
scCmdBlk[4] = (lba >> 8) & 0xff;
scCmdBlk[5] = lba & 0xff;
scCmdBlk[6] = group & 0x1f;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (count > 0xffff) {
- fprintf(sg_warnings_strm, "count too big\n");
+ pr2ws("count too big\n");
return -1;
}
scCmdBlk[7] = (count >> 8) & 0xff;
scCmdBlk[8] = count & 0xff;
if (verbose) {
- fprintf(sg_warnings_strm, " synchronize cache(10) cdb: ");
+ pr2ws(" synchronize cache(10) cdb: ");
for (k = 0; k < SYNCHRONIZE_CACHE_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", scCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", scCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "synchronize cache(10): out of memory\n");
+ pr2ws("synchronize cache(10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, scCmdBlk, sizeof(scCmdBlk));
@@ -162,17 +181,15 @@ sg_ll_readcap_16(int sg_fd, int pmi, uint64_t llba, void * resp,
rcCmdBlk[11] = (mx_resp_len >> 16) & 0xff;
rcCmdBlk[12] = (mx_resp_len >> 8) & 0xff;
rcCmdBlk[13] = mx_resp_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " read capacity (16) cdb: ");
+ pr2ws(" read capacity (16) cdb: ");
for (k = 0; k < SERVICE_ACTION_IN_16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rcCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rcCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read capacity (16): out of memory\n");
+ pr2ws("read capacity (16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rcCmdBlk, sizeof(rcCmdBlk));
@@ -219,17 +236,15 @@ sg_ll_readcap_10(int sg_fd, int pmi, unsigned int lba, void * resp,
rcCmdBlk[4] = (lba >> 8) & 0xff;
rcCmdBlk[5] = lba & 0xff;
}
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " read capacity (10) cdb: ");
+ pr2ws(" read capacity (10) cdb: ");
for (k = 0; k < READ_CAPACITY_10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rcCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rcCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read capacity (10): out of memory\n");
+ pr2ws("read capacity (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rcCmdBlk, sizeof(rcCmdBlk));
@@ -273,21 +288,19 @@ sg_ll_mode_sense6(int sg_fd, int dbd, int pc, int pg_code, int sub_pg_code,
modesCmdBlk[2] = (unsigned char)(((pc << 6) & 0xc0) | (pg_code & 0x3f));
modesCmdBlk[3] = (unsigned char)(sub_pg_code & 0xff);
modesCmdBlk[4] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (mx_resp_len > 0xff) {
- fprintf(sg_warnings_strm, "mx_resp_len too big\n");
+ pr2ws("mx_resp_len too big\n");
return -1;
}
if (verbose) {
- fprintf(sg_warnings_strm, " mode sense (6) cdb: ");
+ pr2ws(" mode sense (6) cdb: ");
for (k = 0; k < MODE_SENSE6_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", modesCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", modesCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "mode sense (6): out of memory\n");
+ pr2ws("mode sense (6): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, modesCmdBlk, sizeof(modesCmdBlk));
@@ -312,8 +325,8 @@ sg_ll_mode_sense6(int sg_fd, int dbd, int pc, int pg_code, int sub_pg_code,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " mode sense (6): response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" mode sense (6): response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -321,8 +334,8 @@ sg_ll_mode_sense6(int sg_fd, int dbd, int pc, int pg_code, int sub_pg_code,
if (resid > 0) {
if (resid > mx_resp_len) {
- fprintf(sg_warnings_strm, "mode sense(6): resid (%d) should "
- "never exceed requested len=%d\n", resid, mx_resp_len);
+ pr2ws("mode sense(6): resid (%d) should never exceed requested "
+ "len=%d\n", resid, mx_resp_len);
return ret ? ret : SG_LIB_CAT_MALFORMED;
}
/* zero unfilled section of response buffer */
@@ -349,21 +362,19 @@ sg_ll_mode_sense10(int sg_fd, int llbaa, int dbd, int pc, int pg_code,
modesCmdBlk[3] = (unsigned char)(sub_pg_code & 0xff);
modesCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
modesCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (mx_resp_len > 0xffff) {
- fprintf(sg_warnings_strm, "mx_resp_len too big\n");
+ pr2ws("mx_resp_len too big\n");
return -1;
}
if (verbose) {
- fprintf(sg_warnings_strm, " mode sense (10) cdb: ");
+ pr2ws(" mode sense (10) cdb: ");
for (k = 0; k < MODE_SENSE10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", modesCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", modesCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "mode sense (10): out of memory\n");
+ pr2ws("mode sense (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, modesCmdBlk, sizeof(modesCmdBlk));
@@ -388,8 +399,8 @@ sg_ll_mode_sense10(int sg_fd, int llbaa, int dbd, int pc, int pg_code,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " mode sense (10): response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" mode sense (10): response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -397,8 +408,8 @@ sg_ll_mode_sense10(int sg_fd, int llbaa, int dbd, int pc, int pg_code,
if (resid > 0) {
if (resid > mx_resp_len) {
- fprintf(sg_warnings_strm, "mode sense(10): resid (%d) should "
- "never exceed requested len=%d\n", resid, mx_resp_len);
+ pr2ws("mode sense(10): resid (%d) should never exceed requested "
+ "len=%d\n", resid, mx_resp_len);
return ret ? ret : SG_LIB_CAT_MALFORMED;
}
/* zero unfilled section of response buffer */
@@ -421,26 +432,24 @@ sg_ll_mode_select6(int sg_fd, int pf, int sp, void * paramp, int param_len,
modesCmdBlk[1] = (unsigned char)(((pf << 4) & 0x10) | (sp & 0x1));
modesCmdBlk[4] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (param_len > 0xff) {
- fprintf(sg_warnings_strm, "mode select (6): param_len too big\n");
+ pr2ws("mode select (6): param_len too big\n");
return -1;
}
if (verbose) {
- fprintf(sg_warnings_strm, " mode select (6) cdb: ");
+ pr2ws(" mode select (6) cdb: ");
for (k = 0; k < MODE_SELECT6_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", modesCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", modesCmdBlk[k]);
+ pr2ws("\n");
}
if (verbose > 1) {
- fprintf(sg_warnings_strm, " mode select (6) parameter list\n");
+ pr2ws(" mode select (6) parameter list\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "mode select (6): out of memory\n");
+ pr2ws("mode select (6): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, modesCmdBlk, sizeof(modesCmdBlk));
@@ -483,26 +492,24 @@ sg_ll_mode_select10(int sg_fd, int pf, int sp, void * paramp, int param_len,
modesCmdBlk[1] = (unsigned char)(((pf << 4) & 0x10) | (sp & 0x1));
modesCmdBlk[7] = (unsigned char)((param_len >> 8) & 0xff);
modesCmdBlk[8] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (param_len > 0xffff) {
- fprintf(sg_warnings_strm, "mode select (10): param_len too big\n");
+ pr2ws("mode select (10): param_len too big\n");
return -1;
}
if (verbose) {
- fprintf(sg_warnings_strm, " mode select (10) cdb: ");
+ pr2ws(" mode select (10) cdb: ");
for (k = 0; k < MODE_SELECT10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", modesCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", modesCmdBlk[k]);
+ pr2ws("\n");
}
if (verbose > 1) {
- fprintf(sg_warnings_strm, " mode select (10) parameter list\n");
+ pr2ws(" mode select (10) parameter list\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "mode select (10): out of memory\n");
+ pr2ws("mode select (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, modesCmdBlk, sizeof(modesCmdBlk));
@@ -609,8 +616,6 @@ sg_get_mode_page_controls(int sg_fd, int mode6, int pg_code, int sub_pg_code,
*reported_len = 0;
if (mx_mpage_len < 4)
return 0;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
memset(ebuff, 0, sizeof(ebuff));
/* first try to find length of current page response */
memset(buff, 0, MODE10_RESP_HDR_LEN);
@@ -632,8 +637,8 @@ sg_get_mode_page_controls(int sg_fd, int mode6, int pg_code, int sub_pg_code,
if (mode6 && (n < 3)) {
resp_mode6 = 0;
if (verbose)
- fprintf(sg_warnings_strm, ">>> msense(6) but resp[0]=%d so "
- "try msense(10) response processing\n", n);
+ pr2ws(">>> msense(6) but resp[0]=%d so try msense(10) "
+ "response processing\n", n);
}
if ((0 == mode6) && (n > 5)) {
if ((n > 11) && (0 == (n % 2)) && (0 == buff[4]) &&
@@ -641,16 +646,15 @@ sg_get_mode_page_controls(int sg_fd, int mode6, int pg_code, int sub_pg_code,
buff[1] = n;
buff[0] = 0;
if (verbose)
- fprintf(sg_warnings_strm, ">>> msense(10) but resp[0]=%d "
- "and not msense(6) response so fix length\n", n);
+ pr2ws(">>> msense(10) but resp[0]=%d and not msense(6) "
+ "response so fix length\n", n);
} else
resp_mode6 = 1;
}
}
if (verbose && (resp_mode6 != mode6))
- fprintf(sg_warnings_strm, ">>> msense(%d) but resp[0]=%d "
- "so switch response processing\n", (mode6 ? 6 : 10),
- buff[0]);
+ pr2ws(">>> msense(%d) but resp[0]=%d so switch response "
+ "processing\n", (mode6 ? 6 : 10), buff[0]);
calc_len = resp_mode6 ? (buff[0] + 1) : (sg_get_unaligned_be16(buff) + 2);
if (calc_len > MODE_RESP_ARB_LEN)
calc_len = MODE_RESP_ARB_LEN;
@@ -658,8 +662,7 @@ sg_get_mode_page_controls(int sg_fd, int mode6, int pg_code, int sub_pg_code,
ebuff, EBUFF_SZ);
if (offset < 0) {
if (('\0' != ebuff[0]) && (verbose > 0))
- fprintf(sg_warnings_strm, "sg_get_mode_page_controls: %s\n",
- ebuff);
+ pr2ws("sg_get_mode_page_controls: %s\n", ebuff);
return SG_LIB_CAT_MALFORMED;
}
xfer_len = calc_len - offset;
@@ -707,10 +710,8 @@ sg_ll_log_sense(int sg_fd, int ppc, int sp, int pc, int pg_code,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (mx_resp_len > 0xffff) {
- fprintf(sg_warnings_strm, "mx_resp_len too big\n");
+ pr2ws("mx_resp_len too big\n");
return -1;
}
logsCmdBlk[1] = (unsigned char)((ppc ? 2 : 0) | (sp ? 1 : 0));
@@ -721,15 +722,15 @@ sg_ll_log_sense(int sg_fd, int ppc, int sp, int pc, int pg_code,
logsCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
logsCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
if (verbose) {
- fprintf(sg_warnings_strm, " log sense cdb: ");
+ pr2ws(" log sense cdb: ");
for (k = 0; k < LOG_SENSE_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", logsCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", logsCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "log sense: out of memory\n");
+ pr2ws("log sense: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, logsCmdBlk, sizeof(logsCmdBlk));
@@ -763,8 +764,8 @@ sg_ll_log_sense(int sg_fd, int ppc, int sp, int pc, int pg_code,
if (resid > 0) {
if (resid > mx_resp_len) {
- fprintf(sg_warnings_strm, "log sense: resid (%d) should "
- "never exceed requested len=%d\n", resid, mx_resp_len);
+ pr2ws("log sense: resid (%d) should never exceed requested "
+ "len=%d\n", resid, mx_resp_len);
return ret ? ret : SG_LIB_CAT_MALFORMED;
}
/* zero unfilled section of response buffer */
@@ -786,10 +787,8 @@ sg_ll_log_select(int sg_fd, int pcr, int sp, int pc, int pg_code,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (param_len > 0xffff) {
- fprintf(sg_warnings_strm, "log select: param_len too big\n");
+ pr2ws("log select: param_len too big\n");
return -1;
}
logsCmdBlk[1] = (unsigned char)((pcr ? 2 : 0) | (sp ? 1 : 0));
@@ -798,19 +797,19 @@ sg_ll_log_select(int sg_fd, int pcr, int sp, int pc, int pg_code,
logsCmdBlk[7] = (unsigned char)((param_len >> 8) & 0xff);
logsCmdBlk[8] = (unsigned char)(param_len & 0xff);
if (verbose) {
- fprintf(sg_warnings_strm, " log select cdb: ");
+ pr2ws(" log select cdb: ");
for (k = 0; k < LOG_SELECT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", logsCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", logsCmdBlk[k]);
+ pr2ws("\n");
}
if ((verbose > 1) && (param_len > 0)) {
- fprintf(sg_warnings_strm, " log select parameter list\n");
+ pr2ws(" log select parameter list\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "log select: out of memory\n");
+ pr2ws("log select: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, logsCmdBlk, sizeof(logsCmdBlk));
@@ -860,18 +859,16 @@ sg_ll_start_stop_unit(int sg_fd, int immed, int pc_mod__fl_num,
ssuBlk[3] = pc_mod__fl_num & 0xf; /* bits 2 and 3 are reserved in MMC */
ssuBlk[4] = ((power_cond & 0xf) << 4) | (noflush__fl ? 0x4 : 0) |
(loej ? 0x2 : 0) | (start ? 0x1 : 0);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Start stop unit command:");
+ pr2ws(" Start stop unit command:");
for (k = 0; k < (int)sizeof(ssuBlk); ++k)
- fprintf (sg_warnings_strm, " %02x", ssuBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws(" %02x", ssuBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "start stop unit: out of memory\n");
+ pr2ws("start stop unit: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, ssuBlk, sizeof(ssuBlk));
@@ -911,24 +908,21 @@ sg_ll_prevent_allow(int sg_fd, int prevent, int noisy, int verbose)
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if ((prevent < 0) || (prevent > 3)) {
- fprintf(sg_warnings_strm, "prevent argument should be 0, 1, 2 or 3\n");
+ pr2ws("prevent argument should be 0, 1, 2 or 3\n");
return -1;
}
pCmdBlk[4] |= (prevent & 0x3);
if (verbose) {
- fprintf(sg_warnings_strm, " Prevent allow medium removal cdb: ");
+ pr2ws(" Prevent allow medium removal cdb: ");
for (k = 0; k < PREVENT_ALLOW_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", pCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", pCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "prevent allow medium removal: out of "
- "memory\n");
+ pr2ws("prevent allow medium removal: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, pCmdBlk, sizeof(pCmdBlk));
diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c
index 6afea698..606ae1b6 100644
--- a/lib/sg_cmds_extra.c
+++ b/lib/sg_cmds_extra.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2014 Douglas Gilbert.
+ * Copyright (c) 1999-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.
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#define __STDC_FORMAT_MACROS 1
@@ -89,6 +90,26 @@
#define REPORT_REFERRALS_SA 0x13
#define EXTENDED_COPY_LID1_SA 0x0
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Invokes a SCSI GET LBA STATUS command (SBC). Returns 0 -> success,
* various SG_LIB_CAT_* positive values or -1 -> other errors */
@@ -117,18 +138,16 @@ sg_ll_get_lba_status(int sg_fd, uint64_t start_llba, void * resp,
getLbaStatCmd[11] = (alloc_len >> 16) & 0xff;
getLbaStatCmd[12] = (alloc_len >> 8) & 0xff;
getLbaStatCmd[13] = alloc_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Get LBA status cmd: ");
+ pr2ws(" Get LBA status cmd: ");
for (k = 0; k < SERVICE_ACTION_IN_16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", getLbaStatCmd[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", getLbaStatCmd[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "get LBA status: out of memory\n");
+ pr2ws("get LBA status: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, getLbaStatCmd, sizeof(getLbaStatCmd));
@@ -151,8 +170,8 @@ sg_ll_get_lba_status(int sg_fd, uint64_t start_llba, void * resp,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " get LBA status: response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" get LBA status: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -189,19 +208,16 @@ sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len,
rtpgCmdBlk[7] = (mx_resp_len >> 16) & 0xff;
rtpgCmdBlk[8] = (mx_resp_len >> 8) & 0xff;
rtpgCmdBlk[9] = mx_resp_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " report target port groups cdb: ");
+ pr2ws(" report target port groups cdb: ");
for (k = 0; k < MAINTENANCE_IN_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rtpgCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rtpgCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "report target port groups: out of "
- "memory\n");
+ pr2ws("report target port groups: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rtpgCmdBlk, sizeof(rtpgCmdBlk));
@@ -225,8 +241,8 @@ sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " report target port group: "
- "response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" report target port group: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -252,24 +268,20 @@ sg_ll_set_tgt_prt_grp(int sg_fd, void * paramp, int param_len, int noisy,
stpgCmdBlk[7] = (param_len >> 16) & 0xff;
stpgCmdBlk[8] = (param_len >> 8) & 0xff;
stpgCmdBlk[9] = param_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " set target port groups cdb: ");
+ pr2ws(" set target port groups cdb: ");
for (k = 0; k < MAINTENANCE_OUT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", stpgCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", stpgCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " set target port groups "
- "parameter list:\n");
+ pr2ws(" set target port groups parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "set target port groups: out of "
- "memory\n");
+ pr2ws("set target port groups: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, stpgCmdBlk, sizeof(stpgCmdBlk));
@@ -323,19 +335,16 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, int one_seg,
repRefCmdBlk[12] = (mx_resp_len >> 8) & 0xff;
repRefCmdBlk[13] = mx_resp_len & 0xff;
repRefCmdBlk[14] = one_seg & 0x1;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " report referrals cdb: ");
+ pr2ws(" report referrals cdb: ");
for (k = 0; k < SERVICE_ACTION_IN_16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", repRefCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", repRefCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "report target port groups: out of "
- "memory\n");
+ pr2ws("report target port groups: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, repRefCmdBlk, sizeof(repRefCmdBlk));
@@ -359,8 +368,8 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, int one_seg,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " report referrals: response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" report referrals: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -390,16 +399,13 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit,
senddiagCmdBlk[3] = (unsigned char)((param_len >> 8) & 0xff);
senddiagCmdBlk[4] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Send diagnostic cmd: ");
+ pr2ws(" Send diagnostic cmd: ");
for (k = 0; k < SEND_DIAGNOSTIC_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", senddiagCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", senddiagCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " Send diagnostic parameter "
- "list:\n");
+ pr2ws(" Send diagnostic parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
}
@@ -410,7 +416,7 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit,
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "send diagnostic: out of memory\n");
+ pr2ws("send diagnostic: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, senddiagCmdBlk, sizeof(senddiagCmdBlk));
@@ -455,19 +461,16 @@ sg_ll_receive_diag(int sg_fd, int pcv, int pg_code, void * resp,
rcvdiagCmdBlk[3] = (unsigned char)((mx_resp_len >> 8) & 0xff);
rcvdiagCmdBlk[4] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Receive diagnostic results cmd: ");
+ pr2ws(" Receive diagnostic results cmd: ");
for (k = 0; k < RECEIVE_DIAGNOSTICS_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rcvdiagCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rcvdiagCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "receive diagnostic results: out of "
- "memory\n");
+ pr2ws("receive diagnostic results: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rcvdiagCmdBlk, sizeof(rcvdiagCmdBlk));
@@ -491,8 +494,8 @@ sg_ll_receive_diag(int sg_fd, int pcv, int pg_code, void * resp,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " receive diagnostic results: "
- "response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" receive diagnostic results: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -517,22 +520,20 @@ sg_ll_read_defect10(int sg_fd, int req_plist, int req_glist, int dl_format,
((req_glist << 3) & 0x8) | (dl_format & 0x7));
rdefCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
rdefCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (mx_resp_len > 0xffff) {
- fprintf(sg_warnings_strm, "mx_resp_len too big\n");
+ pr2ws("mx_resp_len too big\n");
return -1;
}
if (verbose) {
- fprintf(sg_warnings_strm, " read defect (10) cdb: ");
+ pr2ws(" read defect (10) cdb: ");
for (k = 0; k < READ_DEFECT10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rdefCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rdefCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read defect (10): out of memory\n");
+ pr2ws("read defect (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rdefCmdBlk, sizeof(rdefCmdBlk));
@@ -555,8 +556,8 @@ sg_ll_read_defect10(int sg_fd, int req_plist, int req_glist, int dl_format,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read defect (10): response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read defect (10): response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -582,19 +583,16 @@ sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len,
rmsnCmdBlk[7] = (mx_resp_len >> 16) & 0xff;
rmsnCmdBlk[8] = (mx_resp_len >> 8) & 0xff;
rmsnCmdBlk[9] = mx_resp_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " read media serial number cdb: ");
+ pr2ws(" read media serial number cdb: ");
for (k = 0; k < SERVICE_ACTION_IN_12_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rmsnCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rmsnCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read media serial number: out of "
- "memory\n");
+ pr2ws("read media serial number: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rmsnCmdBlk, sizeof(rmsnCmdBlk));
@@ -618,8 +616,8 @@ sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read media serial number: respon"
- "se%s\n", (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read media serial number: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -648,19 +646,16 @@ sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len,
riiCmdBlk[9] = max_resp_len & 0xff;
riiCmdBlk[10] |= (itype << 1) & 0xfe;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Report identifying information cdb: ");
+ pr2ws(" Report identifying information cdb: ");
for (k = 0; k < MAINTENANCE_IN_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", riiCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", riiCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "report identifying information: out of "
- "memory\n");
+ pr2ws("report identifying information: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, riiCmdBlk, sizeof(riiCmdBlk));
@@ -684,8 +679,8 @@ sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " report identifying information: "
- "response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" report identifying information: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -713,24 +708,20 @@ sg_ll_set_id_info(int sg_fd, int itype, void * paramp, int param_len,
siiCmdBlk[8] = (param_len >> 8) & 0xff;
siiCmdBlk[9] = param_len & 0xff;
siiCmdBlk[10] |= (itype << 1) & 0xfe;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Set identifying information cdb: ");
+ pr2ws(" Set identifying information cdb: ");
for (k = 0; k < MAINTENANCE_OUT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", siiCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", siiCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " Set identifying information "
- "parameter list:\n");
+ pr2ws(" Set identifying information parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Set identifying information: out of "
- "memory\n");
+ pr2ws("Set identifying information: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, siiCmdBlk, sizeof(siiCmdBlk));
@@ -781,23 +772,21 @@ sg_ll_format_unit(int sg_fd, int fmtpinfo, int longlist, int fmtdata,
fuCmdBlk[1] |= 0x8;
if (dlist_format)
fuCmdBlk[1] |= (dlist_format & 0x7);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
tmout = (timeout_secs > 0) ? timeout_secs : DEF_PT_TIMEOUT;
if (verbose) {
- fprintf(sg_warnings_strm, " format cdb: ");
+ pr2ws(" format cdb: ");
for (k = 0; k < 6; ++k)
- fprintf(sg_warnings_strm, "%02x ", fuCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", fuCmdBlk[k]);
+ pr2ws("\n");
}
if ((verbose > 1) && (param_len > 0)) {
- fprintf(sg_warnings_strm, " format parameter list:\n");
+ pr2ws(" format parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "format unit: out of memory\n");
+ pr2ws("format unit: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, fuCmdBlk, sizeof(fuCmdBlk));
@@ -839,22 +828,20 @@ sg_ll_reassign_blocks(int sg_fd, int longlba, int longlist, void * paramp,
reassCmdBlk[1] = (unsigned char)(((longlba << 1) & 0x2) |
(longlist & 0x1));
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " reassign blocks cdb: ");
+ pr2ws(" reassign blocks cdb: ");
for (k = 0; k < REASSIGN_BLKS_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", reassCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", reassCmdBlk[k]);
+ pr2ws("\n");
}
if (verbose > 1) {
- fprintf(sg_warnings_strm, " reassign blocks parameter list\n");
+ pr2ws(" reassign blocks parameter list\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "reassign blocks: out of memory\n");
+ pr2ws("reassign blocks: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, reassCmdBlk, sizeof(reassCmdBlk));
@@ -900,19 +887,16 @@ sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp,
prinCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
prinCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Persistent Reservation In cmd: ");
+ pr2ws(" Persistent Reservation In cmd: ");
for (k = 0; k < PERSISTENT_RESERVE_IN_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", prinCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", prinCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "persistent reservation in: out of "
- "memory\n");
+ pr2ws("persistent reservation in: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, prinCmdBlk, sizeof(prinCmdBlk));
@@ -936,8 +920,8 @@ sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " persistent reserve in: "
- "response%s\n", (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" persistent reserve in: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -966,23 +950,20 @@ sg_ll_persistent_reserve_out(int sg_fd, int rq_servact, int rq_scope,
proutCmdBlk[7] = (unsigned char)((param_len >> 8) & 0xff);
proutCmdBlk[8] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Persistent Reservation Out cmd: ");
+ pr2ws(" Persistent Reservation Out cmd: ");
for (k = 0; k < PERSISTENT_RESERVE_OUT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", proutCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", proutCmdBlk[k]);
+ pr2ws("\n");
if (verbose > 1) {
- fprintf(sg_warnings_strm, " Persistent Reservation Out "
- "parameters:\n");
+ pr2ws(" Persistent Reservation Out parameters:\n");
dStrHexErr((const char *)paramp, param_len, 0);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "persistent reserve out: out of memory\n");
+ pr2ws("persistent reserve out: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, proutCmdBlk, sizeof(proutCmdBlk));
@@ -1054,18 +1035,16 @@ sg_ll_read_long10(int sg_fd, int pblock, int correct, unsigned int lba,
readLongCmdBlk[5] = lba & 0xff;
readLongCmdBlk[7] = (xfer_len >> 8) & 0xff;
readLongCmdBlk[8] = xfer_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Read Long (10) cmd: ");
+ pr2ws(" Read Long (10) cmd: ");
for (k = 0; k < READ_LONG10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", readLongCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", readLongCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read long (10): out of memory\n");
+ pr2ws("read long (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, readLongCmdBlk, sizeof(readLongCmdBlk));
@@ -1096,8 +1075,8 @@ sg_ll_read_long10(int sg_fd, int pblock, int correct, unsigned int lba,
ret = SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO;
} else {
if (verbose > 1)
- fprintf(sg_warnings_strm, " info field: 0x%" PRIx64
- ", valid: %d, ili: %d\n", ull, valid, ili);
+ pr2ws(" info field: 0x%" PRIx64 ", valid: %d, "
+ "ili: %d\n", ull, valid, ili);
ret = SG_LIB_CAT_ILLEGAL_REQ;
}
}
@@ -1108,8 +1087,8 @@ sg_ll_read_long10(int sg_fd, int pblock, int correct, unsigned int lba,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read long(10): response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read long(10): response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -1149,18 +1128,16 @@ sg_ll_read_long16(int sg_fd, int pblock, int correct, uint64_t llba,
readLongCmdBlk[9] = llba & 0xff;
readLongCmdBlk[12] = (xfer_len >> 8) & 0xff;
readLongCmdBlk[13] = xfer_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Read Long (16) cmd: ");
+ pr2ws(" Read Long (16) cmd: ");
for (k = 0; k < SERVICE_ACTION_IN_16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", readLongCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", readLongCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read long (16): out of memory\n");
+ pr2ws("read long (16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, readLongCmdBlk, sizeof(readLongCmdBlk));
@@ -1191,8 +1168,8 @@ sg_ll_read_long16(int sg_fd, int pblock, int correct, uint64_t llba,
ret = SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO;
} else {
if (verbose > 1)
- fprintf(sg_warnings_strm, " info field: 0x%" PRIx64
- ", valid: %d, ili: %d\n", ull, valid, ili);
+ pr2ws(" info field: 0x%" PRIx64 ", valid: %d, "
+ "ili: %d\n", ull, valid, ili);
ret = SG_LIB_CAT_ILLEGAL_REQ;
}
}
@@ -1203,8 +1180,8 @@ sg_ll_read_long16(int sg_fd, int pblock, int correct, uint64_t llba,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read long(16): response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read long(16): response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -1241,18 +1218,16 @@ sg_ll_write_long10(int sg_fd, int cor_dis, int wr_uncor, int pblock,
writeLongCmdBlk[5] = lba & 0xff;
writeLongCmdBlk[7] = (xfer_len >> 8) & 0xff;
writeLongCmdBlk[8] = xfer_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Write Long (10) cmd: ");
+ pr2ws(" Write Long (10) cmd: ");
for (k = 0; k < (int)sizeof(writeLongCmdBlk); ++k)
- fprintf(sg_warnings_strm, "%02x ", writeLongCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", writeLongCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "write long(10): out of memory\n");
+ pr2ws("write long(10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, writeLongCmdBlk, sizeof(writeLongCmdBlk));
@@ -1283,8 +1258,8 @@ sg_ll_write_long10(int sg_fd, int cor_dis, int wr_uncor, int pblock,
ret = SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO;
} else {
if (verbose > 1)
- fprintf(sg_warnings_strm, " info field: 0x%" PRIx64
- ", valid: %d, ili: %d\n", ull, valid, ili);
+ pr2ws(" info field: 0x%" PRIx64 ", valid: %d, "
+ "ili: %d\n", ull, valid, ili);
ret = SG_LIB_CAT_ILLEGAL_REQ;
}
}
@@ -1333,18 +1308,16 @@ sg_ll_write_long16(int sg_fd, int cor_dis, int wr_uncor, int pblock,
writeLongCmdBlk[9] = llba & 0xff;
writeLongCmdBlk[12] = (xfer_len >> 8) & 0xff;
writeLongCmdBlk[13] = xfer_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Write Long (16) cmd: ");
+ pr2ws(" Write Long (16) cmd: ");
for (k = 0; k < SERVICE_ACTION_OUT_16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", writeLongCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", writeLongCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "write long(16): out of memory\n");
+ pr2ws("write long(16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, writeLongCmdBlk, sizeof(writeLongCmdBlk));
@@ -1375,8 +1348,8 @@ sg_ll_write_long16(int sg_fd, int cor_dis, int wr_uncor, int pblock,
ret = SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO;
} else {
if (verbose > 1)
- fprintf(sg_warnings_strm, " info field: 0x%" PRIx64
- ", valid: %d, ili: %d\n", ull, valid, ili);
+ pr2ws(" info field: 0x%" PRIx64 ", valid: %d, "
+ "ili: %d\n", ull, valid, ili);
ret = SG_LIB_CAT_ILLEGAL_REQ;
}
}
@@ -1417,23 +1390,21 @@ sg_ll_verify10(int sg_fd, int vrprotect, int dpo, int bytchk,
vCmdBlk[5] = (unsigned char)(lba & 0xff);
vCmdBlk[7] = (unsigned char)((veri_len >> 8) & 0xff);
vCmdBlk[8] = (unsigned char)(veri_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose > 1) {
- fprintf(sg_warnings_strm, " Verify(10) cdb: ");
+ pr2ws(" Verify(10) cdb: ");
for (k = 0; k < VERIFY10_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", vCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", vCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 3) && bytchk && data_out && (data_out_len > 0)) {
k = data_out_len > 4104 ? 4104 : data_out_len;
- fprintf(sg_warnings_strm, " data_out buffer%s\n",
- (data_out_len > 4104 ? ", first 4104 bytes" : ""));
+ pr2ws(" data_out buffer%s\n",
+ (data_out_len > 4104 ? ", first 4104 bytes" : ""));
dStrHexErr((const char *)data_out, k, verbose < 5);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "verify (10): out of memory\n");
+ pr2ws("verify (10): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, vCmdBlk, sizeof(vCmdBlk));
@@ -1508,23 +1479,21 @@ sg_ll_verify16(int sg_fd, int vrprotect, int dpo, int bytchk, uint64_t llba,
vCmdBlk[12] = (veri_len >> 8) & 0xff;
vCmdBlk[13] = veri_len & 0xff;
vCmdBlk[14] = group_num & 0x1f;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose > 1) {
- fprintf(sg_warnings_strm, " Verify(16) cdb: ");
+ pr2ws(" Verify(16) cdb: ");
for (k = 0; k < VERIFY16_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", vCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", vCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 3) && bytchk && data_out && (data_out_len > 0)) {
k = data_out_len > 4104 ? 4104 : data_out_len;
- fprintf(sg_warnings_strm, " data_out buffer%s\n",
- (data_out_len > 4104 ? ", first 4104 bytes" : ""));
+ pr2ws(" data_out buffer%s\n",
+ (data_out_len > 4104 ? ", first 4104 bytes" : ""));
dStrHexErr((const char *)data_out, k, verbose < 5);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "verify (16): out of memory\n");
+ pr2ws("verify (16): out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, vCmdBlk, sizeof(vCmdBlk));
@@ -1605,16 +1574,14 @@ sg_ll_ata_pt(int sg_fd, const unsigned char * cdbp, int cdb_len,
int ret = -1;
b[0] = '\0';
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
cnamep = (12 == cdb_len) ?
"ATA pass through (12)" : "ATA pass through (16)";
if ((NULL == cdbp) || ((12 != cdb_len) && (16 != cdb_len))) {
if (verbose) {
if (NULL == cdbp)
- fprintf(sg_warnings_strm, "%s NULL cdb pointer\n", cnamep);
+ pr2ws("%s NULL cdb pointer\n", cnamep);
else
- fprintf(sg_warnings_strm, "cdb_len must be 12 or 16\n");
+ pr2ws("cdb_len must be 12 or 16\n");
}
return -1;
}
@@ -1631,14 +1598,14 @@ sg_ll_ata_pt(int sg_fd, const unsigned char * cdbp, int cdb_len,
else
memcpy(aptCmdBlk + 1, cdbp + 1, ((cdb_len > 15) ? 14 : (cdb_len - 1)));
if (verbose) {
- fprintf(sg_warnings_strm, " %s cdb: ", cnamep);
+ pr2ws(" %s cdb: ", cnamep);
for (k = 0; k < cdb_len; ++k)
- fprintf(sg_warnings_strm, "%02x ", aptCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", aptCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "%s: out of memory\n", cnamep);
+ pr2ws("%s: out of memory\n", cnamep);
return -1;
}
set_scsi_pt_cdb(ptvp, aptCmdBlk, cdb_len);
@@ -1654,20 +1621,19 @@ sg_ll_ata_pt(int sg_fd, const unsigned char * cdbp, int cdb_len,
verbose);
if (SCSI_PT_DO_BAD_PARAMS == res) {
if (verbose)
- fprintf(sg_warnings_strm, "%s: bad parameters\n", cnamep);
+ pr2ws("%s: bad parameters\n", cnamep);
goto out;
} else if (SCSI_PT_DO_TIMEOUT == res) {
if (verbose)
- fprintf(sg_warnings_strm, "%s: timeout\n", cnamep);
+ pr2ws("%s: timeout\n", cnamep);
goto out;
} else if (res > 2) {
if (verbose)
- fprintf(sg_warnings_strm, "%s: do_scsi_pt: errno=%d\n",
- cnamep, -res);
+ pr2ws("%s: do_scsi_pt: errno=%d\n", cnamep, -res);
}
if ((verbose > 2) && ((duration = get_scsi_pt_duration_ms(ptvp)) >= 0))
- fprintf(sg_warnings_strm, " duration=%d ms\n", duration);
+ pr2ws(" duration=%d ms\n", duration);
switch (get_scsi_pt_result_category(ptvp)) {
case SCSI_PT_RESULT_GOOD:
@@ -1708,19 +1674,18 @@ sg_ll_ata_pt(int sg_fd, const unsigned char * cdbp, int cdb_len,
break;
case SCSI_PT_RESULT_TRANSPORT_ERR:
if (verbose)
- fprintf(sg_warnings_strm, "%s: transport error: %s\n",
- cnamep, get_scsi_pt_transport_err_str(ptvp, sizeof(b) ,
- b));
+ pr2ws("%s: transport error: %s\n", cnamep,
+ get_scsi_pt_transport_err_str(ptvp, sizeof(b), b));
break;
case SCSI_PT_RESULT_OS_ERR:
if (verbose)
- fprintf(sg_warnings_strm, "%s: os error: %s\n",
- cnamep, get_scsi_pt_os_err_str(ptvp, sizeof(b) , b));
+ pr2ws("%s: os error: %s\n", cnamep,
+ get_scsi_pt_os_err_str(ptvp, sizeof(b) , b));
break;
default:
if (verbose)
- fprintf(sg_warnings_strm, "%s: unknown pt_result_category=%d\n",
- cnamep, get_scsi_pt_result_category(ptvp));
+ pr2ws("%s: unknown pt_result_category=%d\n", cnamep,
+ get_scsi_pt_result_category(ptvp));
break;
}
@@ -1749,18 +1714,16 @@ sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
rbufCmdBlk[6] = (unsigned char)((mx_resp_len >> 16) & 0xff);
rbufCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
rbufCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " read buffer cdb: ");
+ pr2ws(" read buffer cdb: ");
for (k = 0; k < READ_BUFFER_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rbufCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rbufCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read buffer: out of memory\n");
+ pr2ws("read buffer: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rbufCmdBlk, sizeof(rbufCmdBlk));
@@ -1783,8 +1746,8 @@ sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read buffer: response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read buffer: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -1813,24 +1776,22 @@ sg_ll_write_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
wbufCmdBlk[6] = (unsigned char)((param_len >> 16) & 0xff);
wbufCmdBlk[7] = (unsigned char)((param_len >> 8) & 0xff);
wbufCmdBlk[8] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " Write buffer cmd: ");
+ pr2ws(" Write buffer cmd: ");
for (k = 0; k < WRITE_BUFFER_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", wbufCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", wbufCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " Write buffer parameter list%s:\n",
- ((param_len > 256) ? " (first 256 bytes)" : ""));
+ pr2ws(" Write buffer parameter list%s:\n",
+ ((param_len > 256) ? " (first 256 bytes)" : ""));
dStrHexErr((const char *)paramp,
- ((param_len > 256) ? 256 : param_len), -1);
+ ((param_len > 256) ? 256 : param_len), -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "write buffer: out of memory\n");
+ pr2ws("write buffer: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, wbufCmdBlk, sizeof(wbufCmdBlk));
@@ -1886,22 +1847,20 @@ sg_ll_unmap_v2(int sg_fd, int anchor, int group_num, int timeout_secs,
uCmdBlk[6] = group_num & 0x1f;
uCmdBlk[7] = (param_len >> 8) & 0xff;
uCmdBlk[8] = param_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " unmap cdb: ");
+ pr2ws(" unmap cdb: ");
for (k = 0; k < UNMAP_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", uCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", uCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " unmap parameter list:\n");
+ pr2ws(" unmap parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "unmap: out of memory\n");
+ pr2ws("unmap: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, uCmdBlk, sizeof(uCmdBlk));
@@ -1940,18 +1899,16 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " read block limits cdb: ");
+ pr2ws(" read block limits cdb: ");
for (k = 0; k < READ_BLOCK_LIMITS_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rlCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rlCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "read block limits: out of memory\n");
+ pr2ws("read block limits: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rlCmdBlk, sizeof(rlCmdBlk));
@@ -1974,8 +1931,8 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
}
} else {
if ((verbose > 2) && (ret > 0)) {
- fprintf(sg_warnings_strm, " read block limits: response%s\n",
- (ret > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" read block limits: response%s\n",
+ (ret > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (ret > 256 ? 256 : ret), -1);
}
ret = 0;
@@ -2013,18 +1970,16 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
rcvcopyresCmdBlk[12] = (unsigned char)((mx_resp_len >> 8) & 0xff);
rcvcopyresCmdBlk[13] = (unsigned char)(mx_resp_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " %s cmd: ", b);
+ pr2ws(" %s cmd: ", b);
for (k = 0; k < THIRD_PARTY_COPY_IN_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", rcvcopyresCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", rcvcopyresCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "%s: out of memory\n", b);
+ pr2ws("%s: out of memory\n", b);
return -1;
}
set_scsi_pt_cdb(ptvp, rcvcopyresCmdBlk, sizeof(rcvcopyresCmdBlk));
@@ -2076,23 +2031,20 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, int noisy,
xcopyCmdBlk[12] = (unsigned char)((param_len >> 8) & 0xff);
xcopyCmdBlk[13] = (unsigned char)(param_len & 0xff);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " %s cmd: ", opcode_name);
+ pr2ws(" %s cmd: ", opcode_name);
for (k = 0; k < THIRD_PARTY_COPY_OUT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", xcopyCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", xcopyCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " %s parameter list:\n",
- opcode_name);
+ pr2ws(" %s parameter list:\n", opcode_name);
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "%s: out of memory\n", opcode_name);
+ pr2ws("%s: out of memory\n", opcode_name);
return -1;
}
set_scsi_pt_cdb(ptvp, xcopyCmdBlk, sizeof(xcopyCmdBlk));
@@ -2136,8 +2088,6 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num,
struct sg_pt_base * ptvp;
char cname[80];
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
sg_get_opcode_sa_name(THIRD_PARTY_COPY_OUT_CMD, sa, 0, sizeof(cname),
cname);
xcopyCmdBlk[1] = (unsigned char)(sa & 0x1f);
@@ -2168,26 +2118,25 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num,
xcopyCmdBlk[5] = (unsigned char)(list_id & 0xff);
break;
default:
- fprintf(sg_warnings_strm, "sg_ll_3party_copy_out: unknown service "
- "action 0x%x\n", sa);
+ pr2ws("sg_ll_3party_copy_out: unknown service action 0x%x\n", sa);
return -1;
}
tmout = (timeout_secs > 0) ? timeout_secs : DEF_PT_TIMEOUT;
if (verbose) {
- fprintf(sg_warnings_strm, " %s cmd: ", cname);
+ pr2ws(" %s cmd: ", cname);
for (k = 0; k < THIRD_PARTY_COPY_OUT_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", xcopyCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", xcopyCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " %s parameter list:\n", cname);
+ pr2ws(" %s parameter list:\n", cname);
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "%s: out of memory\n", cname);
+ pr2ws("%s: out of memory\n", cname);
return -1;
}
set_scsi_pt_cdb(ptvp, xcopyCmdBlk, sizeof(xcopyCmdBlk));
diff --git a/lib/sg_cmds_mmc.c b/lib/sg_cmds_mmc.c
index e6d2c8a8..b9cb2083 100644
--- a/lib/sg_cmds_mmc.c
+++ b/lib/sg_cmds_mmc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008-2013 Douglas Gilbert.
+ * Copyright (c) 2008-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.
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#define __STDC_FORMAT_MACROS 1
@@ -35,6 +36,25 @@
#define SET_STREAMING_CMD 0xb6
#define SET_STREAMING_CMDLEN 12
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
/* Invokes a SCSI SET CD SPEED command (MMC).
* Return of 0 -> success, SG_LIB_CAT_INVALID_OP -> command not supported,
@@ -51,8 +71,6 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
scsCmdBlk[1] |= (rot_control & 0x3);
scsCmdBlk[2] = (drv_read_speed >> 8) & 0xff;
scsCmdBlk[3] = drv_read_speed & 0xff;
@@ -60,14 +78,14 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed,
scsCmdBlk[5] = drv_write_speed & 0xff;
if (verbose) {
- fprintf(sg_warnings_strm, " set cd speed cdb: ");
+ pr2ws(" set cd speed cdb: ");
for (k = 0; k < SET_CD_SPEED_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", scsCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", scsCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "set cd speed: out of memory\n");
+ pr2ws("set cd speed: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, scsCmdBlk, sizeof(scsCmdBlk));
@@ -115,37 +133,34 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if ((rt < 0) || (rt > 3)) {
- fprintf(sg_warnings_strm, "Bad rt value: %d\n", rt);
+ pr2ws("Bad rt value: %d\n", rt);
return -1;
}
gcCmdBlk[1] = (rt & 0x3);
if ((starting < 0) || (starting > 0xffff)) {
- fprintf(sg_warnings_strm, "Bad starting field number: 0x%x\n",
- starting);
+ pr2ws("Bad starting field number: 0x%x\n", starting);
return -1;
}
gcCmdBlk[2] = (unsigned char)((starting >> 8) & 0xff);
gcCmdBlk[3] = (unsigned char)(starting & 0xff);
if ((mx_resp_len < 0) || (mx_resp_len > 0xffff)) {
- fprintf(sg_warnings_strm, "Bad mx_resp_len: 0x%x\n", starting);
+ pr2ws("Bad mx_resp_len: 0x%x\n", starting);
return -1;
}
gcCmdBlk[7] = (unsigned char)((mx_resp_len >> 8) & 0xff);
gcCmdBlk[8] = (unsigned char)(mx_resp_len & 0xff);
if (verbose) {
- fprintf(sg_warnings_strm, " Get Configuration cdb: ");
+ pr2ws(" Get Configuration cdb: ");
for (k = 0; k < GET_CONFIG_CMD_LEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", gcCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", gcCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "get configuration: out of memory\n");
+ pr2ws("get configuration: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, gcCmdBlk, sizeof(gcCmdBlk));
@@ -183,8 +198,8 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp,
if (len < 0)
len = 0;
len = (ret < len) ? ret : len;
- fprintf(sg_warnings_strm, " get configuration: response%s\n",
- (len > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" get configuration: response%s\n",
+ (len > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (len > 256 ? 256 : len), -1);
}
ret = 0;
@@ -208,10 +223,8 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba,
unsigned char sense_b[SENSE_BUFF_LEN];
struct sg_pt_base * ptvp;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if ((data_type < 0) || (data_type > 0x1f)) {
- fprintf(sg_warnings_strm, "Bad data_type value: %d\n", data_type);
+ pr2ws("Bad data_type value: %d\n", data_type);
return -1;
}
gpCmdBlk[1] = (data_type & 0x1f);
@@ -220,27 +233,27 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba,
gpCmdBlk[4] = (unsigned char)((starting_lba >> 8) & 0xff);
gpCmdBlk[3] = (unsigned char)(starting_lba & 0xff);
if ((max_num_desc < 0) || (max_num_desc > 0xffff)) {
- fprintf(sg_warnings_strm, "Bad max_num_desc: 0x%x\n", max_num_desc);
+ pr2ws("Bad max_num_desc: 0x%x\n", max_num_desc);
return -1;
}
gpCmdBlk[8] = (unsigned char)((max_num_desc >> 8) & 0xff);
gpCmdBlk[9] = (unsigned char)(max_num_desc & 0xff);
if ((ttype < 0) || (ttype > 0xff)) {
- fprintf(sg_warnings_strm, "Bad type: 0x%x\n", ttype);
+ pr2ws("Bad type: 0x%x\n", ttype);
return -1;
}
gpCmdBlk[10] = (unsigned char)ttype;
if (verbose) {
- fprintf(sg_warnings_strm, " Get Performance cdb: ");
+ pr2ws(" Get Performance cdb: ");
for (k = 0; k < GET_PERFORMANCE_CMD_LEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", gpCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", gpCmdBlk[k]);
+ pr2ws("\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "get performance: out of memory\n");
+ pr2ws("get performance: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, gpCmdBlk, sizeof(gpCmdBlk));
@@ -278,8 +291,8 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba,
if (len < 0)
len = 0;
len = (ret < len) ? ret : len;
- fprintf(sg_warnings_strm, " get performance:: response%s\n",
- (len > 256 ? ", first 256 bytes" : ""));
+ pr2ws(" get performance:: response%s\n",
+ (len > 256 ? ", first 256 bytes" : ""));
dStrHexErr((const char *)resp, (len > 256 ? 256 : len), -1);
}
ret = 0;
@@ -306,23 +319,20 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len,
ssCmdBlk[8] = type;
ssCmdBlk[9] = (param_len >> 8) & 0xff;
ssCmdBlk[10] = param_len & 0xff;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose) {
- fprintf(sg_warnings_strm, " set streaming cdb: ");
+ pr2ws(" set streaming cdb: ");
for (k = 0; k < SET_STREAMING_CMDLEN; ++k)
- fprintf(sg_warnings_strm, "%02x ", ssCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("%02x ", ssCmdBlk[k]);
+ pr2ws("\n");
if ((verbose > 1) && paramp && param_len) {
- fprintf(sg_warnings_strm, " set streaming "
- "parameter list:\n");
+ pr2ws(" set streaming parameter list:\n");
dStrHexErr((const char *)paramp, param_len, -1);
}
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "set streaming: out of memory\n");
+ pr2ws("set streaming: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, ssCmdBlk, sizeof(ssCmdBlk));
diff --git a/lib/sg_io_linux.c b/lib/sg_io_linux.c
index 34b411cf..cbbec698 100644
--- a/lib/sg_io_linux.c
+++ b/lib/sg_io_linux.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2012 Douglas Gilbert.
+ * Copyright (c) 1999-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.
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <ctype.h>
@@ -21,7 +22,27 @@
#include "sg_io_linux.h"
-/* Version 1.04 20120914 */
+/* Version 1.05 20150511 */
+
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
void
@@ -46,13 +67,11 @@ static const char * linux_host_bytes[] = {
void
sg_print_host_status(int host_status)
{
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "Host_status=0x%02x ", host_status);
+ pr2ws("Host_status=0x%02x ", host_status);
if ((host_status < 0) || (host_status >= LINUX_HOST_BYTES_SZ))
- fprintf(sg_warnings_strm, "is invalid ");
+ pr2ws("is invalid ");
else
- fprintf(sg_warnings_strm, "[%s] ", linux_host_bytes[host_status]);
+ pr2ws("[%s] ", linux_host_bytes[host_status]);
}
static const char * linux_driver_bytes[] = {
@@ -87,10 +106,8 @@ sg_print_driver_status(int driver_status)
sugg = (driver_status & SG_LIB_SUGGEST_MASK) >> 4;
if (sugg < LINUX_DRIVER_SUGGESTS_SZ)
sugg_cp = linux_driver_suggests[sugg];
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "Driver_status=0x%02x", driver_status);
- fprintf(sg_warnings_strm, " [%s, %s] ", driv_cp, sugg_cp);
+ pr2ws("Driver_status=0x%02x", driver_status);
+ pr2ws(" [%s, %s] ", driv_cp, sugg_cp);
}
/* Returns 1 if no errors found and thus nothing printed; otherwise
@@ -103,18 +120,16 @@ sg_linux_sense_print(const char * leadin, int scsi_status, int host_status,
int done_leadin = 0;
int done_sense = 0;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
scsi_status &= 0x7e; /*sanity */
if ((0 == scsi_status) && (0 == host_status) && (0 == driver_status))
return 1; /* No problems */
if (0 != scsi_status) {
if (leadin)
- fprintf(sg_warnings_strm, "%s: ", leadin);
+ pr2ws("%s: ", leadin);
done_leadin = 1;
- fprintf(sg_warnings_strm, "SCSI status: ");
+ pr2ws("SCSI status: ");
sg_print_scsi_status(scsi_status);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("\n");
if (sense_buffer && ((scsi_status == SAM_STAT_CHECK_CONDITION) ||
(scsi_status == SAM_STAT_COMMAND_TERMINATED))) {
/* SAM_STAT_COMMAND_TERMINATED is obsolete */
@@ -124,26 +139,26 @@ sg_linux_sense_print(const char * leadin, int scsi_status, int host_status,
}
if (0 != host_status) {
if (leadin && (! done_leadin))
- fprintf(sg_warnings_strm, "%s: ", leadin);
+ pr2ws("%s: ", leadin);
if (done_leadin)
- fprintf(sg_warnings_strm, "plus...: ");
+ pr2ws("plus...: ");
else
done_leadin = 1;
sg_print_host_status(host_status);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("\n");
}
if (0 != driver_status) {
if (done_sense &&
(SG_LIB_DRIVER_SENSE == (SG_LIB_DRIVER_MASK & driver_status)))
return 0;
if (leadin && (! done_leadin))
- fprintf(sg_warnings_strm, "%s: ", leadin);
+ pr2ws("%s: ", leadin);
if (done_leadin)
- fprintf(sg_warnings_strm, "plus...: ");
+ pr2ws("plus...: ");
else
done_leadin = 1;
sg_print_driver_status(driver_status);
- fprintf(sg_warnings_strm, "\n");
+ pr2ws("\n");
if (sense_buffer && (! done_sense) &&
(SG_LIB_DRIVER_SENSE == (SG_LIB_DRIVER_MASK & driver_status)))
sg_print_sense(0, sense_buffer, sb_len, raw_sinfo);
diff --git a/lib/sg_lib.c b/lib/sg_lib.c
index ce5fadcf..f9c53b8f 100644
--- a/lib/sg_lib.c
+++ b/lib/sg_lib.c
@@ -48,6 +48,25 @@
FILE * sg_warnings_strm = NULL; /* would like to default to stderr */
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
#ifdef __GNUC__
static int my_snprintf(char * cp, int cp_max_len, const char * fmt, ...)
@@ -103,6 +122,8 @@ get_value_name(const struct sg_lib_value_name_t * arr, int value,
return NULL;
}
+/* If this function is not called, sg_warnings_strm will be NULL and all users
+ * (mainly fprintf() ) need to check and substitute stderr as required */
void
sg_set_warnings_strm(FILE * warnings_strm)
{
@@ -120,16 +141,14 @@ sg_print_command(const unsigned char * command)
sg_get_command_name(command, 0, CMD_NAME_LEN, buff);
buff[CMD_NAME_LEN - 1] = '\0';
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "%s [", buff);
+ pr2ws("%s [", buff);
if (SG_VARIABLE_LENGTH_CMD == command[0])
sz = command[7] + 8;
else
sz = sg_get_command_size(command[0]);
for (k = 0; k < sz; ++k)
- fprintf(sg_warnings_strm, "%02x ", command[k]);
- fprintf(sg_warnings_strm, "]\n");
+ pr2ws("%02x ", command[k]);
+ pr2ws("]\n");
}
void
@@ -174,9 +193,7 @@ sg_print_scsi_status(int scsi_status)
sg_get_scsi_status_str(scsi_status, sizeof(buff) - 1, buff);
buff[sizeof(buff) - 1] = '\0';
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "%s ", buff);
+ pr2ws("%s ", buff);
}
/* Get sense key from sense buffer. If successful returns a sense key value
@@ -1077,9 +1094,7 @@ sg_print_sense(const char * leadin, const unsigned char * sense_buffer,
char b[2048];
sg_get_sense_str(leadin, sense_buffer, sb_len, raw_sinfo, sizeof(b), b);
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "%s", b);
+ pr2ws("%s", b);
}
/* See description in sg_lib.h header file */
@@ -1906,9 +1921,7 @@ sg_get_num(const char * buf)
}
return -1;
default:
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "unrecognized multiplier\n");
+ pr2ws("unrecognized multiplier\n");
return -1;
}
}
@@ -2059,9 +2072,7 @@ sg_get_llnum(const char * buf)
}
return -1LL;
default:
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "unrecognized multiplier\n");
+ pr2ws("unrecognized multiplier\n");
return -1LL;
}
}
diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c
index 35b9151f..b5c7fa96 100644
--- a/lib/sg_lib_data.c
+++ b/lib/sg_lib_data.c
@@ -17,7 +17,7 @@
#endif
-const char * sg_lib_version_str = "2.13 20150410"; /* spc5r02, sbc4r02 */
+const char * sg_lib_version_str = "2.14 20150429"; /* spc5r02, sbc4r02 */
/* indexed by pdt; those that map to own index do not decay */
@@ -550,7 +550,7 @@ struct sg_lib_value_name_t sg_lib_zoning_in_arr[] = {
/* A conveniently formatted list of SCSI ASC/ASCQ codes and their
* corresponding text can be found at: www.t10.org/lists/asc-num.txt
- * The following should match asc-num.txt dated 20150406 */
+ * The following should match asc-num.txt dated 20150423 */
#ifdef SG_SCSI_STRINGS
struct sg_lib_asc_ascq_range_t sg_lib_asc_ascq_range[] =
@@ -689,6 +689,7 @@ struct sg_lib_asc_ascq_t sg_lib_asc_ascq[] =
{0x0C,0x0F,"Defects in error window"},
{0x0C,0x10,"Incomplete multiple atomic write operations"},
{0x0C,0x11,"Write error - recovery scan needed"},
+ {0x0C,0x12,"Write error - insufficient zone resources"},
{0x0D,0x00,"Error detected by third party temporary initiator"},
{0x0D,0x01,"Third party device failure"},
{0x0D,0x02,"Copy target device not reachable"},
diff --git a/lib/sg_pt_freebsd.c b/lib/sg_pt_freebsd.c
index 94bfc69c..db2bcfdf 100644
--- a/lib/sg_pt_freebsd.c
+++ b/lib/sg_pt_freebsd.c
@@ -1,14 +1,15 @@
/*
- * 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.
*/
-/* sg_pt_freebsd version 1.12 20130919 */
+/* sg_pt_freebsd version 1.13 20150511 */
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
@@ -71,6 +72,26 @@ struct sg_pt_base {
struct sg_pt_freebsd_scsi impl;
};
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Returns >= 0 if successful. If error in Unix returns negated errno. */
int
@@ -93,8 +114,6 @@ scsi_pt_open_flags(const char * device_name,
struct cam_device* cam_dev;
int k;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
// Search table for a free entry
for (k = 0; k < FREEBSD_MAXDEV; k++)
if (! devicetable[k])
@@ -104,8 +123,7 @@ scsi_pt_open_flags(const char * device_name,
// of "file descriptors" already allocated.
if (k == FREEBSD_MAXDEV) {
if (verbose)
- fprintf(sg_warnings_strm, "too many open file descriptors "
- "(%d)\n", FREEBSD_MAXDEV);
+ pr2ws("too many open file descriptors (%d)\n", FREEBSD_MAXDEV);
errno = EMFILE;
return -1;
}
@@ -123,7 +141,7 @@ scsi_pt_open_flags(const char * device_name,
if (cam_get_device(device_name, fdchan->devname, DEV_IDLEN,
&(fdchan->unitnum)) == -1) {
if (verbose)
- fprintf(sg_warnings_strm, "bad device name structure\n");
+ pr2ws("bad device name structure\n");
errno = EINVAL;
return -1;
}
@@ -131,8 +149,7 @@ scsi_pt_open_flags(const char * device_name,
if (! (cam_dev = cam_open_spec_device(fdchan->devname,
fdchan->unitnum, O_RDWR, NULL))) {
if (verbose)
- fprintf(sg_warnings_strm, "cam_open_spec_device: %s\n",
- cam_errbuf);
+ pr2ws("cam_open_spec_device: %s\n", cam_errbuf);
errno = EPERM; /* permissions or no CAM */
return -1;
}
@@ -172,6 +189,12 @@ construct_scsi_pt_obj()
{
struct sg_pt_freebsd_scsi * ptp;
+ /* The following 2 lines are temporary. It is to avoid a NULL pointer
+ * crash when an old utility is used with a newer library built after
+ * the sg_warnings_strm cleanup */
+ if (NULL == sg_warnings_strm)
+ sg_warnings_strm = stderr;
+
ptp = (struct sg_pt_freebsd_scsi *)
calloc(1, sizeof(struct sg_pt_freebsd_scsi));
if (ptp) {
@@ -314,43 +337,41 @@ do_scsi_pt(struct sg_pt_base * vp, int device_fd, int time_secs, int verbose)
union ccb *ccb;
int len, timout_ms;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
ptp->os_err = 0;
if (ptp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused set_scsi_pt...\n");
+ pr2ws("Replicated or unused set_scsi_pt...\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (NULL == ptp->cdb) {
if (verbose)
- fprintf(sg_warnings_strm, "No command (cdb) given\n");
+ pr2ws("No command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if ((fd < 0) || (fd >= FREEBSD_MAXDEV)) {
if (verbose)
- fprintf(sg_warnings_strm, "Bad file descriptor\n");
+ pr2ws("Bad file descriptor\n");
ptp->os_err = ENODEV;
return -ptp->os_err;
}
fdchan = devicetable[fd];
if (NULL == fdchan) {
if (verbose)
- fprintf(sg_warnings_strm, "File descriptor closed??\n");
+ pr2ws("File descriptor closed??\n");
ptp->os_err = ENODEV;
return -ptp->os_err;
}
if (NULL == fdchan->cam_dev) {
if (verbose)
- fprintf(sg_warnings_strm, "No open CAM device\n");
+ pr2ws("No open CAM device\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (NULL == ptp->ccb) { /* re-use if we have one already */
if (! (ccb = cam_getccb(fdchan->cam_dev))) {
if (verbose)
- fprintf(sg_warnings_strm, "cam_getccb: failed\n");
+ pr2ws("cam_getccb: failed\n");
ptp->os_err = ENOMEM;
return -ptp->os_err;
}
diff --git a/lib/sg_pt_linux.c b/lib/sg_pt_linux.c
index bcb58712..1cfaeab3 100644
--- a/lib/sg_pt_linux.c
+++ b/lib/sg_pt_linux.c
@@ -1,15 +1,16 @@
/*
- * 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.
*/
-/* sg_pt_linux version 1.23 20141224 */
+/* sg_pt_linux version 1.24 20150511 */
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
@@ -81,6 +82,26 @@ static const char * linux_driver_suggests[] = {
#define SG_LIB_DRIVER_SENSE DRIVER_SENSE
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#if defined(IGNORE_LINUX_BSG) || ! defined(HAVE_LINUX_BSG_H)
@@ -122,10 +143,7 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
int fd;
if (verbose > 1) {
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "open %s with flags=0x%x\n", device_name,
- flags);
+ pr2ws("open %s with flags=0x%x\n", device_name, flags);
}
fd = open(device_name, flags);
if (fd < 0)
@@ -151,6 +169,12 @@ construct_scsi_pt_obj()
{
struct sg_pt_linux_scsi * ptp;
+ /* The following 2 lines are temporary. It is to avoid a NULL pointer
+ * crash when an old utility is used with a newer library built after
+ * the sg_warnings_strm cleanup */
+ if (NULL == sg_warnings_strm)
+ sg_warnings_strm = stderr;
+
ptp = (struct sg_pt_linux_scsi *)
calloc(1, sizeof(struct sg_pt_linux_scsi));
if (ptp) {
@@ -306,18 +330,15 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
{
struct sg_pt_linux_scsi * ptp = &vp->impl;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
ptp->os_err = 0;
if (ptp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused set_scsi_pt... "
- "functions\n");
+ pr2ws("Replicated or unused set_scsi_pt... functions\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (NULL == ptp->io_hdr.cmdp) {
if (verbose)
- fprintf(sg_warnings_strm, "No SCSI command (cdb) given\n");
+ pr2ws("No SCSI command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
/* io_hdr.timeout is in milliseconds */
@@ -328,8 +349,8 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
if (ioctl(fd, SG_IO, &ptp->io_hdr) < 0) {
ptp->os_err = errno;
if (verbose > 1)
- fprintf(sg_warnings_strm, "ioctl(SG_IO) failed: %s (errno=%d)\n",
- strerror(ptp->os_err), ptp->os_err);
+ pr2ws("ioctl(SG_IO) failed: %s (errno=%d)\n",
+ strerror(ptp->os_err), ptp->os_err);
return -ptp->os_err;
}
return 0;
@@ -531,11 +552,8 @@ find_bsg_major(int verbose)
int n;
if (NULL == (fp = fopen(proc_devices, "r"))) {
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (verbose)
- fprintf(sg_warnings_strm, "fopen %s failed: %s\n", proc_devices,
- strerror(errno));
+ pr2ws("fopen %s failed: %s\n", proc_devices, strerror(errno));
return;
}
while ((cp = fgets(b, sizeof(b), fp))) {
@@ -553,13 +571,10 @@ find_bsg_major(int verbose)
break;
}
if (verbose > 3) {
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
if (cp)
- fprintf(sg_warnings_strm, "found bsg_major=%d\n", bsg_major);
+ pr2ws("found bsg_major=%d\n", bsg_major);
else
- fprintf(sg_warnings_strm, "found no bsg char device in %s\n",
- proc_devices);
+ pr2ws("found no bsg char device in %s\n", proc_devices);
}
fclose(fp);
}
@@ -587,12 +602,8 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
bsg_major_checked = 1;
find_bsg_major(verbose);
}
- if (verbose > 1) {
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
- fprintf(sg_warnings_strm, "open %s with flags=0x%x\n", device_name,
- flags);
- }
+ if (verbose > 1)
+ pr2ws("open %s with flags=0x%x\n", device_name, flags);
fd = open(device_name, flags);
if (fd < 0)
fd = -errno;
@@ -929,7 +940,7 @@ do_scsi_pt_v3(struct sg_pt_linux_scsi * ptp, int fd, int time_secs,
if (ptp->io_hdr.din_xfer_len > 0) {
if (ptp->io_hdr.dout_xfer_len > 0) {
if (verbose)
- fprintf(sg_warnings_strm, "sgv3 doesn't support bidi\n");
+ pr2ws("sgv3 doesn't support bidi\n");
return SCSI_PT_DO_BAD_PARAMS;
}
v3_hdr.dxferp = (void *)(long)ptp->io_hdr.din_xferp;
@@ -952,7 +963,7 @@ do_scsi_pt_v3(struct sg_pt_linux_scsi * ptp, int fd, int time_secs,
if (NULL == v3_hdr.cmdp) {
if (verbose)
- fprintf(sg_warnings_strm, "No SCSI command (cdb) given\n");
+ pr2ws("No SCSI command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
/* io_hdr.timeout is in milliseconds, if greater than zero */
@@ -961,8 +972,8 @@ do_scsi_pt_v3(struct sg_pt_linux_scsi * ptp, int fd, int time_secs,
if (ioctl(fd, SG_IO, &v3_hdr) < 0) {
ptp->os_err = errno;
if (verbose > 1)
- fprintf(sg_warnings_strm, "ioctl(SG_IO v3) failed: %s "
- "(errno=%d)\n", strerror(ptp->os_err), ptp->os_err);
+ pr2ws("ioctl(SG_IO v3) failed: %s (errno=%d)\n",
+ strerror(ptp->os_err), ptp->os_err);
return -ptp->os_err;
}
ptp->io_hdr.device_status = (__u32)v3_hdr.status;
@@ -987,13 +998,10 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
bsg_major_checked = 1;
find_bsg_major(verbose);
}
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
ptp->os_err = 0;
if (ptp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused set_scsi_pt... "
- "functions\n");
+ pr2ws("Replicated or unused set_scsi_pt... functions\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (bsg_major <= 0)
@@ -1004,8 +1012,8 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
if (fstat(fd, &a_stat) < 0) {
ptp->os_err = errno;
if (verbose > 1)
- fprintf(sg_warnings_strm, "fstat() failed: %s (errno=%d)\n",
- strerror(ptp->os_err), ptp->os_err);
+ pr2ws("fstat() failed: %s (errno=%d)\n",
+ strerror(ptp->os_err), ptp->os_err);
return -ptp->os_err;
}
if (! S_ISCHR(a_stat.st_mode) ||
@@ -1015,7 +1023,7 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
if (! ptp->io_hdr.request) {
if (verbose)
- fprintf(sg_warnings_strm, "No SCSI command (cdb) given (v4)\n");
+ pr2ws("No SCSI command (cdb) given (v4)\n");
return SCSI_PT_DO_BAD_PARAMS;
}
/* io_hdr.timeout is in milliseconds */
@@ -1033,8 +1041,8 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose)
if (ioctl(fd, SG_IO, &ptp->io_hdr) < 0) {
ptp->os_err = errno;
if (verbose > 1)
- fprintf(sg_warnings_strm, "ioctl(SG_IO v4) failed: %s "
- "(errno=%d)\n", strerror(ptp->os_err), ptp->os_err);
+ pr2ws("ioctl(SG_IO v4) failed: %s (errno=%d)\n",
+ strerror(ptp->os_err), ptp->os_err);
return -ptp->os_err;
}
return 0;
diff --git a/lib/sg_pt_osf1.c b/lib/sg_pt_osf1.c
index dd2a824d..fced0773 100644
--- a/lib/sg_pt_osf1.c
+++ b/lib/sg_pt_osf1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005-2010 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.
@@ -19,14 +19,13 @@
#include <io/cam/scsi_all.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include "sg_pt.h"
#include "sg_lib.h"
-/* Changed to use struct sg_pt_base 20070403 */
-
#define OSF1_MAXDEV 64
@@ -63,6 +62,26 @@ struct sg_pt_base {
struct sg_pt_osf1_scsi impl;
};
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Returns >= 0 if successful. If error in Unix returns negated errno. */
int
@@ -83,9 +102,6 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
struct osf1_dev_channel *fdchan;
int fd, k;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
-
if (!camopened) {
camfd = open(cam_dev, O_RDWR, 0);
if (camfd < 0)
@@ -100,8 +116,7 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
if (k == OSF1_MAXDEV) {
if (verbose)
- fprintf(sg_warnings_strm, "too many open devices "
- "(%d)\n", OSF1_MAXDEV);
+ pr2ws("too many open devices (%d)\n", OSF1_MAXDEV);
errno=EMFILE;
return -1;
}
@@ -299,9 +314,6 @@ release_sim(struct sg_pt_base *vp, int device_fd, int verbose) {
CCB_RELSIM relsim;
int retval;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
-
bzero(&uagt, sizeof(uagt));
bzero(&relsim, sizeof(relsim));
@@ -318,7 +330,7 @@ release_sim(struct sg_pt_base *vp, int device_fd, int verbose) {
retval = ioctl(camfd, UAGT_CAM_IO, &uagt);
if (retval < 0) {
if (verbose)
- fprintf(sg_warnings_strm, "CAM ioctl error (Release SIM Queue)\n");
+ pr2ws("CAM ioctl error (Release SIM Queue)\n");
}
return retval;
}
@@ -334,36 +346,34 @@ do_scsi_pt(struct sg_pt_base * vp, int device_fd, int time_secs, int verbose)
unsigned char sensep[ADDL_SENSE_LENGTH];
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
ptp->os_err = 0;
if (ptp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused set_scsi_pt...\n");
+ pr2ws("Replicated or unused set_scsi_pt...\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (NULL == ptp->cdb) {
if (verbose)
- fprintf(sg_warnings_strm, "No command (cdb) given\n");
+ pr2ws("No command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if ((device_fd < 0) || (device_fd >= OSF1_MAXDEV)) {
if (verbose)
- fprintf(sg_warnings_strm, "Bad file descriptor\n");
+ pr2ws("Bad file descriptor\n");
ptp->os_err = ENODEV;
return -ptp->os_err;
}
fdchan = devicetable[device_fd];
if (NULL == fdchan) {
if (verbose)
- fprintf(sg_warnings_strm, "File descriptor closed??\n");
+ pr2ws("File descriptor closed??\n");
ptp->os_err = ENODEV;
return -ptp->os_err;
}
if (0 == camopened) {
if (verbose)
- fprintf(sg_warnings_strm, "No open CAM device\n");
+ pr2ws("No open CAM device\n");
return SCSI_PT_DO_BAD_PARAMS;
}
@@ -391,7 +401,7 @@ do_scsi_pt(struct sg_pt_base * vp, int device_fd, int time_secs, int verbose)
if (ioctl(camfd, UAGT_CAM_IO, &uagt) < 0) {
if (verbose)
- fprintf(sg_warnings_strm, "CAN I/O Error\n");
+ pr2ws("CAN I/O Error\n");
ptp->os_err = EIO;
return -ptp->os_err;
}
diff --git a/lib/sg_pt_win32.c b/lib/sg_pt_win32.c
index a55e029d..d7503781 100644
--- a/lib/sg_pt_win32.c
+++ b/lib/sg_pt_win32.c
@@ -1,15 +1,16 @@
/*
- * 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.
*/
-/* sg_pt_win32 version 1.15 20140901 */
+/* sg_pt_win32 version 1.16 20150511 */
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
+#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
@@ -99,6 +100,26 @@ static int spt_direct = 1;
static int spt_direct = 0;
#endif
+#ifdef __GNUC__
+static int pr2ws(const char * fmt, ...)
+ __attribute__ ((format (printf, 1, 2)));
+#else
+static int pr2ws(const char * fmt, ...);
+#endif
+
+
+static int
+pr2ws(const char * fmt, ...)
+{
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ n = vfprintf(sg_warnings_strm ? sg_warnings_strm : stderr, fmt, args);
+ va_end(args);
+ return n;
+}
+
/* Request SPT direct interface when state_direct is 1, state_direct set
* to 0 for the SPT indirect interface. */
@@ -146,8 +167,6 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
struct sg_pt_handle * shp;
char buff[8];
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
share_mode = (O_EXCL & flags) ? 0 : (FILE_SHARE_READ | FILE_SHARE_WRITE);
/* lock */
for (k = 0; k < MAX_OPEN_SIMULT; k++)
@@ -155,8 +174,7 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
break;
if (k == MAX_OPEN_SIMULT) {
if (verbose)
- fprintf(sg_warnings_strm, "too many open handles "
- "(%d)\n", MAX_OPEN_SIMULT);
+ pr2ws("too many open handles (%d)\n", MAX_OPEN_SIMULT);
return -EMFILE;
} else
handle_arr[k].in_use = 1;
@@ -190,8 +208,8 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
&adapter_num, &bus, &target, &lun);
if (num < 3) {
if (verbose)
- fprintf(sg_warnings_strm, "expected format like: "
- "'SCSI<port>:<bus>.<target>[.<lun>]'\n");
+ pr2ws("expected format like: "
+ "'SCSI<port>:<bus>.<target>[.<lun>]'\n");
shp->in_use = 0;
return -EINVAL;
}
@@ -218,8 +236,8 @@ scsi_pt_open_flags(const char * device_name, int flags, int verbose)
share_mode, NULL, OPEN_EXISTING, 0, NULL);
if (shp->fh == INVALID_HANDLE_VALUE) {
if (verbose)
- fprintf(sg_warnings_strm, "Windows CreateFile error=%u\n",
- (unsigned int)GetLastError());
+ pr2ws("Windows CreateFile error=%u\n",
+ (unsigned int)GetLastError());
shp->in_use = 0;
return -ENODEV;
}
@@ -244,8 +262,7 @@ scsi_pt_close_device(int device_fd)
return -ENODEV;
shp = handle_arr + index;
if ((! CloseHandle(shp->fh)) && shp->verbose)
- fprintf(sg_warnings_strm, "Windows CloseHandle error=%u\n",
- (unsigned int)GetLastError());
+ pr2ws("Windows CloseHandle error=%u\n", (unsigned int)GetLastError());
shp->bus = 0;
shp->target = 0;
shp->lun = 0;
@@ -261,6 +278,12 @@ construct_scsi_pt_obj()
struct sg_pt_win32_scsi * psp;
struct sg_pt_base * vp = NULL;
+ /* The following 2 lines are temporary. It is to avoid a NULL pointer
+ * crash when an old utility is used with a newer library built after
+ * the sg_warnings_strm cleanup */
+ if (NULL == sg_warnings_strm)
+ sg_warnings_strm = stderr;
+
psp = (struct sg_pt_win32_scsi *)calloc(sizeof(struct sg_pt_win32_scsi),
1);
if (psp) {
@@ -454,31 +477,29 @@ do_scsi_pt_direct(struct sg_pt_base * vp, int device_fd, int time_secs,
BOOL status;
DWORD returned;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
psp->os_err = 0;
if (psp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused set_scsi_pt...\n");
+ pr2ws("Replicated or unused set_scsi_pt...\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (0 == psp->swb_d.spt.CdbLength) {
if (verbose)
- fprintf(sg_warnings_strm, "No command (cdb) given\n");
+ pr2ws("No command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
index = device_fd - WIN32_FDOFFSET;
if ((index < 0) || (index >= WIN32_FDOFFSET)) {
if (verbose)
- fprintf(sg_warnings_strm, "Bad file descriptor\n");
+ pr2ws("Bad file descriptor\n");
psp->os_err = ENODEV;
return -psp->os_err;
}
shp = handle_arr + index;
if (0 == shp->in_use) {
if (verbose)
- fprintf(sg_warnings_strm, "File descriptor closed??\n");
+ pr2ws("File descriptor closed??\n");
psp->os_err = ENODEV;
return -psp->os_err;
}
@@ -490,20 +511,20 @@ do_scsi_pt_direct(struct sg_pt_base * vp, int device_fd, int time_secs,
psp->swb_d.spt.TimeOutValue = time_secs;
psp->swb_d.spt.DataTransferLength = psp->dxfer_len;
if (verbose > 4) {
- fprintf(stderr, " spt_direct, adapter: %s Length=%d ScsiStatus=%d "
- "PathId=%d TargetId=%d Lun=%d\n", shp->adapter,
- (int)psp->swb_d.spt.Length,
- (int)psp->swb_d.spt.ScsiStatus, (int)psp->swb_d.spt.PathId,
- (int)psp->swb_d.spt.TargetId, (int)psp->swb_d.spt.Lun);
- fprintf(stderr, " CdbLength=%d SenseInfoLength=%d DataIn=%d "
- "DataTransferLength=%u\n",
- (int)psp->swb_d.spt.CdbLength,
- (int)psp->swb_d.spt.SenseInfoLength,
- (int)psp->swb_d.spt.DataIn,
- (unsigned int)psp->swb_d.spt.DataTransferLength);
- fprintf(stderr, " TimeOutValue=%u SenseInfoOffset=%u\n",
- (unsigned int)psp->swb_d.spt.TimeOutValue,
- (unsigned int)psp->swb_d.spt.SenseInfoOffset);
+ pr2ws(" spt_direct, adapter: %s Length=%d ScsiStatus=%d PathId=%d "
+ "TargetId=%d Lun=%d\n", shp->adapter,
+ (int)psp->swb_d.spt.Length, (int)psp->swb_d.spt.ScsiStatus,
+ (int)psp->swb_d.spt.PathId, (int)psp->swb_d.spt.TargetId,
+ (int)psp->swb_d.spt.Lun);
+ pr2ws(" CdbLength=%d SenseInfoLength=%d DataIn=%d "
+ "DataTransferLength=%u\n",
+ (int)psp->swb_d.spt.CdbLength,
+ (int)psp->swb_d.spt.SenseInfoLength,
+ (int)psp->swb_d.spt.DataIn,
+ (unsigned int)psp->swb_d.spt.DataTransferLength);
+ pr2ws(" TimeOutValue=%u SenseInfoOffset=%u\n",
+ (unsigned int)psp->swb_d.spt.TimeOutValue,
+ (unsigned int)psp->swb_d.spt.SenseInfoOffset);
}
psp->swb_d.spt.DataBuffer = psp->dxferp;
status = DeviceIoControl(shp->fh, IOCTL_SCSI_PASS_THROUGH_DIRECT,
@@ -518,8 +539,7 @@ do_scsi_pt_direct(struct sg_pt_base * vp, int device_fd, int time_secs,
u = (unsigned int)GetLastError();
if (verbose)
- fprintf(sg_warnings_strm, "Windows DeviceIoControl error=%u\n",
- u);
+ pr2ws("Windows DeviceIoControl error=%u\n", u);
psp->transport_err = (int)u;
psp->os_err = EIO;
return 0; /* let app find transport error */
@@ -553,32 +573,29 @@ do_scsi_pt_indirect(struct sg_pt_base * vp, int device_fd, int time_secs,
BOOL status;
DWORD returned;
- if (NULL == sg_warnings_strm)
- sg_warnings_strm = stderr;
psp->os_err = 0;
if (psp->in_err) {
if (verbose)
- fprintf(sg_warnings_strm, "Replicated or unused "
- "set_scsi_pt...\n");
+ pr2ws("Replicated or unused set_scsi_pt...\n");
return SCSI_PT_DO_BAD_PARAMS;
}
if (0 == psp->swb_i.spt.CdbLength) {
if (verbose)
- fprintf(sg_warnings_strm, "No command (cdb) given\n");
+ pr2ws("No command (cdb) given\n");
return SCSI_PT_DO_BAD_PARAMS;
}
index = device_fd - WIN32_FDOFFSET;
if ((index < 0) || (index >= WIN32_FDOFFSET)) {
if (verbose)
- fprintf(sg_warnings_strm, "Bad file descriptor\n");
+ pr2ws("Bad file descriptor\n");
psp->os_err = ENODEV;
return -psp->os_err;
}
shp = handle_arr + index;
if (0 == shp->in_use) {
if (verbose)
- fprintf(sg_warnings_strm, "File descriptor closed??\n");
+ pr2ws("File descriptor closed??\n");
psp->os_err = ENODEV;
return -psp->os_err;
}
@@ -588,15 +605,14 @@ do_scsi_pt_indirect(struct sg_pt_base * vp, int device_fd, int time_secs,
struct sg_pt_win32_scsi * epsp;
if (verbose > 4)
- fprintf(sg_warnings_strm, "spt_indirect: dxfer_len (%d) too "
- "large for initial data\n buffer (%d bytes), try "
- "enlarging\n", psp->dxfer_len,
- (int)sizeof(psp->swb_i.ucDataBuf));
+ pr2ws("spt_indirect: dxfer_len (%d) too large for initial data\n"
+ " buffer (%d bytes), try enlarging\n", psp->dxfer_len,
+ (int)sizeof(psp->swb_i.ucDataBuf));
epsp = (struct sg_pt_win32_scsi *)
calloc(sizeof(struct sg_pt_win32_scsi) + extra, 1);
if (NULL == epsp) {
- fprintf(sg_warnings_strm, "do_scsi_pt: failed to enlarge data "
- "buffer to %d bytes\n", psp->dxfer_len);
+ pr2ws("do_scsi_pt: failed to enlarge data buffer to %d bytes\n",
+ psp->dxfer_len);
psp->os_err = ENOMEM;
return -psp->os_err;
}
@@ -614,22 +630,22 @@ do_scsi_pt_indirect(struct sg_pt_base * vp, int device_fd, int time_secs,
psp->swb_i.spt.TimeOutValue = time_secs;
psp->swb_i.spt.DataTransferLength = psp->dxfer_len;
if (verbose > 4) {
- fprintf(stderr, " spt_indirect, adapter: %s Length=%d ScsiStatus=%d "
- "PathId=%d TargetId=%d Lun=%d\n", shp->adapter,
- (int)psp->swb_i.spt.Length,
- (int)psp->swb_i.spt.ScsiStatus, (int)psp->swb_i.spt.PathId,
- (int)psp->swb_i.spt.TargetId, (int)psp->swb_i.spt.Lun);
- fprintf(stderr, " CdbLength=%d SenseInfoLength=%d DataIn=%d "
- "DataTransferLength=%u\n",
- (int)psp->swb_i.spt.CdbLength,
- (int)psp->swb_i.spt.SenseInfoLength,
- (int)psp->swb_i.spt.DataIn,
- (unsigned int)psp->swb_i.spt.DataTransferLength);
- fprintf(stderr, " TimeOutValue=%u DataBufferOffset=%u "
- "SenseInfoOffset=%u\n",
- (unsigned int)psp->swb_i.spt.TimeOutValue,
- (unsigned int)psp->swb_i.spt.DataBufferOffset,
- (unsigned int)psp->swb_i.spt.SenseInfoOffset);
+ pr2ws(" spt_indirect, adapter: %s Length=%d ScsiStatus=%d PathId=%d "
+ "TargetId=%d Lun=%d\n", shp->adapter,
+ (int)psp->swb_i.spt.Length, (int)psp->swb_i.spt.ScsiStatus,
+ (int)psp->swb_i.spt.PathId, (int)psp->swb_i.spt.TargetId,
+ (int)psp->swb_i.spt.Lun);
+ pr2ws(" CdbLength=%d SenseInfoLength=%d DataIn=%d "
+ "DataTransferLength=%u\n",
+ (int)psp->swb_i.spt.CdbLength,
+ (int)psp->swb_i.spt.SenseInfoLength,
+ (int)psp->swb_i.spt.DataIn,
+ (unsigned int)psp->swb_i.spt.DataTransferLength);
+ pr2ws(" TimeOutValue=%u DataBufferOffset=%u "
+ "SenseInfoOffset=%u\n",
+ (unsigned int)psp->swb_i.spt.TimeOutValue,
+ (unsigned int)psp->swb_i.spt.DataBufferOffset,
+ (unsigned int)psp->swb_i.spt.SenseInfoOffset);
}
if ((psp->dxfer_len > 0) &&
(SCSI_IOCTL_DATA_OUT == psp->swb_i.spt.DataIn))
@@ -646,8 +662,7 @@ do_scsi_pt_indirect(struct sg_pt_base * vp, int device_fd, int time_secs,
u = (unsigned int)GetLastError();
if (verbose)
- fprintf(sg_warnings_strm, "Windows DeviceIoControl error=%u\n",
- u);
+ pr2ws("Windows DeviceIoControl error=%u\n", u);
psp->transport_err = (int)u;
psp->os_err = EIO;
return 0; /* let app find transport error */
diff --git a/scripts/rescan-scsi-bus.sh b/scripts/rescan-scsi-bus.sh
index 96c06890..872dac7e 100755
--- a/scripts/rescan-scsi-bus.sh
+++ b/scripts/rescan-scsi-bus.sh
@@ -232,7 +232,7 @@ testonline ()
: testonline
RC=0
# Set default values
- IPTYPE=0x1f
+ IPTYPE=31
IPQUAL=3
if test ! -x /usr/bin/sg_turs; then return 0; fi
sgdevice
@@ -271,7 +271,7 @@ testonline ()
IPQUAL=`echo "$INQ" | sed -n 's/ *PQual=\([0-9]*\) Device.*/\1/p'`
if [ "$IPQUAL" != 0 ] ; then
[ -z "$IPQUAL" ] && IPQUAL=3
- [ -z "$IPTYPE" ] && IPTYPE=0x1f
+ [ -z "$IPTYPE" ] && IPTYPE=31
echo -e "\e[A\e[A\e[A\e[A${red}$SGDEV changed: ${bold}LU not available (PQual $IPQUAL)${norm} \n\n\n"
return 2
fi
@@ -754,7 +754,7 @@ findremapped()
echo "$SCSISTR"
incrchgd "$hctl"
done < $tmpfile
- rm $tmpfile 2>&1 /dev/null
+ [ -f $tmpfile ] && rm $tmpfile
if test -n "$mp_enable" -a -n "$mpaths" ; then
echo "Updating multipath device mappings"
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c
index 6fc18ce2..eb8082fc 100644
--- a/src/sg_compare_and_write.c
+++ b/src/sg_compare_and_write.c
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2012-2014, Kaminario Technologies LTD
+* Copyright (c) 2012-2015, Kaminario Technologies LTD
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -51,7 +51,7 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
-static const char * version_str = "1.09 20140715";
+static const char * version_str = "1.10 20150511";
#define DEF_BLOCK_SIZE 512
#define DEF_NUM_BLOCKS (1)
@@ -356,8 +356,8 @@ sg_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Could not construct scsit_pt_obj, "
- "out of " "memory\n");
+ fprintf(stderr, "Could not construct scsit_pt_obj, out of "
+ "memory\n");
return -1;
}
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 1623ccb2..fe302ae3 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -41,7 +41,7 @@
#include "sg_cmds_basic.h"
#include "sg_pt.h"
-static const char * version_str = "1.47 20150421"; /* SPC-5 rev 02 */
+static const char * version_str = "1.48 20150511"; /* SPC-5 rev 02 */
/* INQUIRY notes:
* It is recommended that the initial allocation length given to a
@@ -1839,7 +1839,17 @@ export_dev_ids(unsigned char * buff, int len, int verbose)
printf("SCSI_IDENT_%s_VENDOR=", assoc_str);
if ((2 == c_set) || (3 == c_set)) { /* ASCII or UTF-8 */
k = encode_whitespaces(ip, i_len);
- printf("%.*s\n", k, ip);
+ /* udev-conformant character encoding */
+ for (m = 0; m < k; ++m) {
+ if ((ip[m] >= '0' && ip[m] <= '9') ||
+ (ip[m] >= 'A' && ip[m] <= 'Z') ||
+ (ip[m] >= 'a' && ip[m] <= 'z') ||
+ strchr("#+-.:=@_", ip[m]) != NULL)
+ printf("%c", ip[m]);
+ else
+ printf("\\x%02x", ip[m]);
+ }
+ printf("\n");
} else {
for (m = 0; m < i_len; ++m)
printf("%02x", (unsigned int)ip[m]);
@@ -1850,7 +1860,17 @@ export_dev_ids(unsigned char * buff, int len, int verbose)
printf("SCSI_IDENT_%s_T10=", assoc_str);
if ((2 == c_set) || (3 == c_set)) {
k = encode_whitespaces(ip, i_len);
- printf("%.*s\n", k, ip);
+ /* udev-conformant character encoding */
+ for (m = 0; m < k; ++m) {
+ if ((ip[m] >= '0' && ip[m] <= '9') ||
+ (ip[m] >= 'A' && ip[m] <= 'Z') ||
+ (ip[m] >= 'a' && ip[m] <= 'z') ||
+ strchr("#+-.:=@_", ip[m]) != NULL)
+ printf("%c", ip[m]);
+ else
+ printf("\\x%02x", ip[m]);
+ }
+ printf("\n");
if (!memcmp(ip, "ATA_", 4)) {
printf("SCSI_IDENT_%s_ATA=%.*s\n", assoc_str,
k - 4, ip + 4);
diff --git a/src/sg_modes.c b/src/sg_modes.c
index 45bc9009..ed6ffdfa 100644
--- a/src/sg_modes.c
+++ b/src/sg_modes.c
@@ -26,7 +26,7 @@
#include "sg_lib.h"
#include "sg_cmds_basic.h"
-static const char * version_str = "1.45 20150110";
+static const char * version_str = "1.46 20150511";
#define DEF_ALLOC_LEN (1024 * 4)
#define DEF_6_ALLOC_LEN 252
@@ -553,7 +553,8 @@ static struct page_code_desc pc_desc_disk[] = {
{0x5, 0x0, "Flexible geometry (obsolete)"},
{0x7, 0x0, "Verify error recovery"},
{0x8, 0x0, "Caching"},
- {0xa, 0x02, "Application tag"},
+ {0xa, 0x2, "Application tag"},
+ {0xa, 0x5, "IO advice hints grouping"}, /* added sbc4r06 */
{0xa, 0xf1, "Parallel ATA control (SAT)"},
{0xa, 0xf2, "Reserved (SATA control) (SAT)"},
{0xb, 0x0, "Medium types supported (obsolete)"},
diff --git a/src/sg_opcodes.c b/src/sg_opcodes.c
index 9aa3da38..34c00053 100644
--- a/src/sg_opcodes.c
+++ b/src/sg_opcodes.c
@@ -1,5 +1,5 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 2004-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)
@@ -26,7 +26,7 @@
#include "sg_pt.h"
-static const char * version_str = "0.42 20140904"; /* spc4r37 */
+static const char * version_str = "0.43 20150511"; /* spc4r37 */
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -952,8 +952,7 @@ do_rsoc(int sg_fd, int rctd, int rep_opts, int rq_opcode, int rq_servact,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Report Supported Operation Codes: out "
- "of memory\n");
+ fprintf(stderr, "Report Supported Operation Codes: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rsocCmdBlk, sizeof(rsocCmdBlk));
@@ -1008,8 +1007,8 @@ do_rstmf(int sg_fd, int repd, void * resp, int mx_resp_len, int noisy,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Report Supported Task Management "
- "Functions: out of memory\n");
+ fprintf(stderr, "Report Supported Task Management Functions: out of "
+ "memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, rstmfCmdBlk, sizeof(rstmfCmdBlk));
diff --git a/src/sg_raw.c b/src/sg_raw.c
index 90d4fc50..510684fa 100644
--- a/src/sg_raw.c
+++ b/src/sg_raw.c
@@ -1,7 +1,7 @@
/*
* A utility program originally written for the Linux OS SCSI subsystem.
*
- * Copyright (C) 2000-2014 Ingo van Lil <inguin@gmx.de>
+ * Copyright (C) 2000-2015 Ingo van Lil <inguin@gmx.de>
*
* 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
@@ -534,17 +534,17 @@ main(int argc, char *argv[])
break;
case SCSI_PT_RESULT_TRANSPORT_ERR:
get_scsi_pt_transport_err_str(ptvp, sizeof(b), b);
- fprintf(sg_warnings_strm, ">>> transport error: %s\n", b);
+ fprintf(stderr, ">>> transport error: %s\n", b);
ret = SG_LIB_CAT_OTHER;
break;
case SCSI_PT_RESULT_OS_ERR:
get_scsi_pt_os_err_str(ptvp, sizeof(b), b);
- fprintf(sg_warnings_strm, ">>> os error: %s\n", b);
+ fprintf(stderr, ">>> os error: %s\n", b);
ret = SG_LIB_CAT_OTHER;
break;
default:
- fprintf(sg_warnings_strm, ">>> unknown pass through result "
- "category (%d)\n", res_cat);
+ fprintf(stderr, ">>> unknown pass through result category (%d)\n",
+ res_cat);
ret = SG_LIB_CAT_OTHER;
break;
}
diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c
index 860fc7cb..96b9e317 100644
--- a/src/sg_sanitize.c
+++ b/src/sg_sanitize.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 Douglas Gilbert.
+ * Copyright (c) 2011-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.
@@ -26,7 +26,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
-static const char * version_str = "0.96 20141006";
+static const char * version_str = "0.97 20150511";
/* Not all environments support the Unix sleep() */
#if defined(MSC_VER) || defined(__MINGW32__)
@@ -201,7 +201,7 @@ do_sanitize(int sg_fd, const struct opts_t * op, const void * param_lstp,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Sanitize: out of memory\n");
+ fprintf(stderr, "Sanitize: out of memory\n");
return -1;
}
set_scsi_pt_cdb(ptvp, sanCmdBlk, sizeof(sanCmdBlk));
diff --git a/src/sg_sync.c b/src/sg_sync.c
index 64de2841..b79a8633 100644
--- a/src/sg_sync.c
+++ b/src/sg_sync.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.
@@ -25,7 +25,7 @@
* (e.g. disks).
*/
-static const char * version_str = "1.11 20140516";
+static const char * version_str = "1.12 20150511";
#define SYNCHRONIZE_CACHE16_CMD 0x91
#define SYNCHRONIZE_CACHE16_CMDLEN 16
@@ -116,7 +116,7 @@ ll_sync_cache_16(int sg_fd, int sync_nv, int immed, int group,
fprintf(stderr, " synchronize cache(16) cdb: ");
for (k = 0; k < SYNCHRONIZE_CACHE16_CMDLEN; ++k)
fprintf(stderr, "%02x ", scCmdBlk[k]);
- fprintf(sg_warnings_strm, "\n");
+ fprintf(stderr, "\n");
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index f0c71d8b..b5ad4155 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -36,7 +36,7 @@
*/
-static const char * version_str = "1.04 20150407"; /* spc5r02 + sbc4r05 */
+static const char * version_str = "1.05 20150529"; /* spc5r02 + sbc4r05 */
/* These structures are duplicates of those of the same name in
@@ -280,7 +280,10 @@ usage()
" number unless hex indicator "
"is given (e.g. '0x83')\n"
" --quiet|-q suppress some output when decoding\n"
- " --raw|-r output page in binary\n"
+ " --raw|-r output page in binary; if --inhex=FN is "
+ "also\n"
+ " given, FN is in binary (else FN is in "
+ "hex)\n"
" --vendor=VP | -M VP vendor/product abbreviation [or "
"number]\n"
" --verbose|-v increase verbosity\n"
diff --git a/src/sg_write_same.c b/src/sg_write_same.c
index 0ac601b8..f6bcefd3 100644
--- a/src/sg_write_same.c
+++ b/src/sg_write_same.c
@@ -26,7 +26,7 @@
#include "sg_cmds_basic.h"
#include "sg_cmds_extra.h"
-static const char * version_str = "1.08 20150216";
+static const char * version_str = "1.09 20150511";
#define ME "sg_write_same: "
@@ -271,7 +271,7 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
}
ptvp = construct_scsi_pt_obj();
if (NULL == ptvp) {
- fprintf(sg_warnings_strm, "Write same(%d): out of memory\n", cdb_len);
+ fprintf(stderr, "Write same(%d): out of memory\n", cdb_len);
return -1;
}
set_scsi_pt_cdb(ptvp, wsCmdBlk, cdb_len);