aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2018-02-11 05:01:16 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2018-02-11 05:01:16 +0000
commit5bdce507b09d32f452a390c22cb98ae7f840c151 (patch)
tree40f080676d587b650cfa3133e7dcf3ab3084af0c /src
parent4a5962a81447bb60cca7e51dd005b3bdaab1452b (diff)
downloadsg3_utils-5bdce507b09d32f452a390c22cb98ae7f840c151.tar.gz
fix compile error in sg_pt_win32.c when NVME_IGNORE; sg_raw: add --cmdfile=CF option
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@752 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src')
-rw-r--r--src/sg_bg_ctl.c11
-rw-r--r--src/sg_compare_and_write.c4
-rw-r--r--src/sg_format.c4
-rw-r--r--src/sg_opcodes.c4
-rw-r--r--src/sg_raw.c345
-rw-r--r--src/sg_read_attr.c4
-rw-r--r--src/sg_read_buffer.c6
-rw-r--r--src/sg_rep_zones.c4
-rw-r--r--src/sg_reset_wp.c6
-rw-r--r--src/sg_sanitize.c4
-rw-r--r--src/sg_stream_ctl.c11
-rw-r--r--src/sg_sync.c6
-rw-r--r--src/sg_timestamp.c6
-rw-r--r--src/sg_vpd.c3
-rw-r--r--src/sg_write_same.c4
-rw-r--r--src/sg_write_verify.c4
-rw-r--r--src/sg_write_x.c2
-rw-r--r--src/sg_zone.c6
18 files changed, 338 insertions, 96 deletions
diff --git a/src/sg_bg_ctl.c b/src/sg_bg_ctl.c
index 3f0b7997..008fee6f 100644
--- a/src/sg_bg_ctl.c
+++ b/src/sg_bg_ctl.c
@@ -33,7 +33,7 @@
* device. Based on sbc4r10.pdf .
*/
-static const char * version_str = "1.04 20180126";
+static const char * version_str = "1.05 20180210";
#define BACKGROUND_CONTROL_SA 0x15
@@ -115,12 +115,9 @@ sg_ll_background_control(int sg_fd, unsigned int bo_ctl, unsigned int bo_time,
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cmd_name, res, SG_NO_DATA_IN, sense_b,
noisy, verbose, &sense_cat);
- if (-1 == ret) {
- int os_err = get_scsi_pt_os_err(ptvp);
-
- if ((os_err > 0) && (os_err < 47))
- ret = SG_LIB_OS_BASE_ERR + os_err;
- } else if (-2 == ret) {
+ if (-1 == ret)
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c
index 4a254807..995e150e 100644
--- a/src/sg_compare_and_write.c
+++ b/src/sg_compare_and_write.c
@@ -54,7 +54,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.20 20180123";
+static const char * version_str = "1.21 20180210";
#define DEF_BLOCK_SIZE 512
#define DEF_NUM_BLOCKS (1)
@@ -374,7 +374,7 @@ sg_ll_compare_and_write(int sg_fd, unsigned char * buff, int blocks,
SG_NO_DATA_IN, sense_b, noisy, verbose,
&sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_format.c b/src/sg_format.c
index afe21c58..c135e6ba 100644
--- a/src/sg_format.c
+++ b/src/sg_format.c
@@ -37,7 +37,7 @@
#include "sg_pr2serr.h"
#include "sg_pt.h"
-static const char * version_str = "1.42 20180112";
+static const char * version_str = "1.43 20180210";
#define RW_ERROR_RECOVERY_PAGE 1 /* can give alternate with --mode=MP */
@@ -264,7 +264,7 @@ sg_ll_format_medium(int sg_fd, bool verify, bool immed, int format,
ret = sg_cmds_process_resp(ptvp, "format medium", res, transfer_len,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_opcodes.c b/src/sg_opcodes.c
index be427605..83b6796c 100644
--- a/src/sg_opcodes.c
+++ b/src/sg_opcodes.c
@@ -221,7 +221,7 @@ do_rsoc(int sg_fd, bool rctd, int rep_opts, int rq_opcode, int rq_servact,
ret = sg_cmds_process_resp(ptvp, rsoc_s, res, mx_resp_len, sense_b, noisy,
verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
@@ -283,7 +283,7 @@ do_rstmf(int sg_fd, bool repd, void * resp, int mx_resp_len,
ret = sg_cmds_process_resp(ptvp, rstmf_s, res, mx_resp_len, sense_b,
noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_raw.c b/src/sg_raw.c
index a19dda36..79cc6534 100644
--- a/src/sg_raw.c
+++ b/src/sg_raw.c
@@ -18,11 +18,15 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdbool.h>
+#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <getopt.h>
#include <inttypes.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -32,15 +36,16 @@
#include "sg_pr2serr.h"
#include "sg_unaligned.h"
-#define SG_RAW_VERSION "0.4.21 (2018-01-18)"
+#define SG_RAW_VERSION "0.4.22 (2018-02-10)"
#define DEFAULT_TIMEOUT 20
#define MIN_SCSI_CDBSZ 6
-#define MAX_SCSI_CDBSZ 256
+#define MAX_SCSI_CDBSZ 260
#define MAX_SCSI_DXLEN (64 * 1024)
static struct option long_options[] = {
{ "binary", no_argument, NULL, 'b' },
+ { "cmdfile", required_argument, NULL, 'c' },
{ "enumerate", no_argument, NULL, 'e' },
{ "help", no_argument, NULL, 'h' },
{ "infile", required_argument, NULL, 'i' },
@@ -57,6 +62,7 @@ static struct option long_options[] = {
};
struct opts_t {
+ bool cmdfile_given;
bool do_datain;
bool datain_binary;
bool do_dataout;
@@ -71,7 +77,8 @@ struct opts_t {
int readonly;
int verbose;
off_t dataout_offset;
- unsigned char cdb[MAX_SCSI_CDBSZ];
+ uint8_t cdb[MAX_SCSI_CDBSZ]; /* might be NVMe command (64 byte) */
+ const char *cmd_file;
const char *datain_file;
const char *dataout_file;
char *device_name;
@@ -82,7 +89,7 @@ static void
pr_version()
{
pr2serr("sg_raw " SG_RAW_VERSION "\n"
- "Copyright (C) 2007-2012 Ingo van Lil <inguin@gmx.de>\n"
+ "Copyright (C) 2007-2018 Ingo van Lil <inguin@gmx.de>\n"
"This is free software. You may redistribute copies of it "
"under the terms of\n"
"the GNU General Public License "
@@ -93,12 +100,14 @@ pr_version()
static void
usage()
{
- pr2serr("Usage: sg_raw [OPTION]* DEVICE CDB0 CDB1 ...\n"
+ pr2serr("Usage: sg_raw [OPTION]* DEVICE [CDB0 CDB1 ...]\n"
"\n"
"Options:\n"
" --binary|-b Dump data in binary form, even when "
"writing to\n"
" stdout\n"
+ " --cmdfile=CF|-c CF CF is file containing command in hex "
+ "bytes\n"
" --enumerate|-e Decodes cdb name then exits; requires "
"DEVICE but\n"
" ignores it\n"
@@ -122,20 +131,214 @@ usage()
" --verbose|-v Increase verbosity\n"
" --version|-V Show version information and exit\n"
"\n"
- "Between 6 and 256 command bytes (two hex digits each) can be "
+ "Between 6 and 260 command bytes (two hex digits each) can be "
"specified\nand will be sent to DEVICE. Lengths RLEN and SLEN "
"are decimal by\ndefault. Bidirectional commands accepted.\n\n"
"Simple example: Perform INQUIRY on /dev/sg0:\n"
" sg_raw -r 1k /dev/sg0 12 00 00 00 60 00\n");
}
+/* Read ASCII hex bytes or binary from fname (a file named '-' taken as
+ * stdin). If reading ASCII hex then there should be either one entry per
+ * line or a comma, space or tab separated list of bytes. If no_space is
+ * true then a string of ACSII hex digits is expected, 2 per byte. Everything
+ * from and including a '#' on a line is ignored. Returns true if ok, or
+ * false if error. */
+static bool
+f2hex_arr(const char * fname, bool as_binary, bool no_space,
+ uint8_t * mp_arr, int * mp_arr_len, int max_arr_len)
+{
+ int fn_len, in_len, k, j, m, fd;
+ bool has_stdin, split_line;
+ unsigned int h;
+ const char * lcp;
+ FILE * fp;
+ char line[512];
+ char carry_over[4];
+ int off = 0;
+ struct stat a_stat;
+
+ if ((NULL == fname) || (NULL == mp_arr) || (NULL == mp_arr_len))
+ return false;
+ fn_len = strlen(fname);
+ if (0 == fn_len)
+ return false;
+ has_stdin = ((1 == fn_len) && ('-' == fname[0])); /* read from stdin */
+ if (as_binary) {
+ if (has_stdin)
+ fd = STDIN_FILENO;
+ else {
+ fd = open(fname, O_RDONLY);
+ if (fd < 0) {
+ pr2serr("unable to open binary file %s: %s\n", fname,
+ safe_strerror(errno));
+ return false;
+ }
+ }
+ k = read(fd, mp_arr, max_arr_len);
+ if (k <= 0) {
+ if (0 == k)
+ pr2serr("read 0 bytes from binary file %s\n", fname);
+ else
+ pr2serr("read from binary file %s: %s\n", fname,
+ safe_strerror(errno));
+ if (! has_stdin)
+ close(fd);
+ return false;
+ }
+ if ((0 == fstat(fd, &a_stat)) && S_ISFIFO(a_stat.st_mode)) {
+ /* pipe; keep reading till error or 0 read */
+ while (k < max_arr_len) {
+ m = read(fd, mp_arr + k, max_arr_len - k);
+ if (0 == m)
+ break;
+ if (m < 0) {
+ pr2serr("read from binary pipe %s: %s\n", fname,
+ safe_strerror(errno));
+ if (! has_stdin)
+ close(fd);
+ return false;
+ }
+ k += m;
+ }
+ }
+ *mp_arr_len = k;
+ if (! has_stdin)
+ close(fd);
+ return true;
+ } else { /* So read the file as ASCII hex */
+ if (has_stdin)
+ fp = stdin;
+ else {
+ fp = fopen(fname, "r");
+ if (NULL == fp) {
+ pr2serr("Unable to open %s for reading\n", fname);
+ return false;
+ }
+ }
+ }
+
+ carry_over[0] = 0;
+ for (j = 0; j < 512; ++j) {
+ if (NULL == fgets(line, sizeof(line), fp))
+ break;
+ in_len = strlen(line);
+ if (in_len > 0) {
+ if ('\n' == line[in_len - 1]) {
+ --in_len;
+ line[in_len] = '\0';
+ split_line = false;
+ } else
+ split_line = true;
+ }
+ if (in_len < 1) {
+ carry_over[0] = 0;
+ continue;
+ }
+ if (carry_over[0]) {
+ if (isxdigit(line[0])) {
+ carry_over[1] = line[0];
+ carry_over[2] = '\0';
+ if (1 == sscanf(carry_over, "%4x", &h))
+ mp_arr[off - 1] = h; /* back up and overwrite */
+ else {
+ pr2serr("%s: carry_over error ['%s'] around line %d\n",
+ __func__, carry_over, j + 1);
+ goto bad;
+ }
+ lcp = line + 1;
+ --in_len;
+ } else
+ lcp = line;
+ carry_over[0] = 0;
+ } else
+ lcp = line;
+
+ m = strspn(lcp, " \t");
+ if (m == in_len)
+ continue;
+ lcp += m;
+ in_len -= m;
+ if ('#' == *lcp)
+ continue;
+ k = strspn(lcp, "0123456789aAbBcCdDeEfF ,\t");
+ if ((k < in_len) && ('#' != lcp[k]) && ('\r' != lcp[k])) {
+ pr2serr("%s: syntax error at line %d, pos %d\n", __func__,
+ j + 1, m + k + 1);
+ goto bad;
+ }
+ if (no_space) {
+ for (k = 0; isxdigit(*lcp) && isxdigit(*(lcp + 1));
+ ++k, lcp += 2) {
+ if (1 != sscanf(lcp, "%2x", &h)) {
+ pr2serr("%s: bad hex number in line %d, pos %d\n",
+ __func__, j + 1, (int)(lcp - line + 1));
+ goto bad;
+ }
+ if ((off + k) >= max_arr_len) {
+ pr2serr("%s: array length exceeded\n", __func__);
+ goto bad;
+ }
+ mp_arr[off + k] = h;
+ }
+ if (isxdigit(*lcp) && (! isxdigit(*(lcp + 1))))
+ carry_over[0] = *lcp;
+ off += k;
+ } else {
+ for (k = 0; k < 1024; ++k) {
+ if (1 == sscanf(lcp, "%10x", &h)) {
+ if (h > 0xff) {
+ pr2serr("%s: hex number larger than 0xff in line "
+ "%d, pos %d\n", __func__, j + 1,
+ (int)(lcp - line + 1));
+ goto bad;
+ }
+ if (split_line && (1 == strlen(lcp))) {
+ /* single trailing hex digit might be a split pair */
+ carry_over[0] = *lcp;
+ }
+ if ((off + k) >= max_arr_len) {
+ pr2serr("%s: array length exceeded\n", __func__);
+ goto bad;
+ }
+ mp_arr[off + k] = h;
+ lcp = strpbrk(lcp, " ,\t");
+ if (NULL == lcp)
+ break;
+ lcp += strspn(lcp, " ,\t");
+ if ('\0' == *lcp)
+ break;
+ } else {
+ if (('#' == *lcp) || ('\r' == *lcp)) {
+ --k;
+ break;
+ }
+ pr2serr("%s: error in line %d, at pos %d\n", __func__,
+ j + 1, (int)(lcp - line + 1));
+ goto bad;
+ }
+ }
+ off += (k + 1);
+ }
+ }
+ *mp_arr_len = off;
+ if (stdin != fp)
+ fclose(fp);
+ return true;
+bad:
+ if (stdin != fp)
+ fclose(fp);
+ return false;
+}
+
static int
process_cl(struct opts_t * op, int argc, char *argv[])
{
while (1) {
int c, n;
- c = getopt_long(argc, argv, "behi:k:no:r:Rs:t:vV", long_options, NULL);
+ c = getopt_long(argc, argv, "bc:ehi:k:no:r:Rs:t:vV", long_options,
+ NULL);
if (c == -1)
break;
@@ -143,6 +346,10 @@ process_cl(struct opts_t * op, int argc, char *argv[])
case 'b':
op->datain_binary = true;
break;
+ case 'c':
+ op->cmd_file = optarg;
+ op->cmdfile_given = true;
+ break;
case 'e':
op->do_enumerate = true;
break;
@@ -239,23 +446,36 @@ process_cl(struct opts_t * op, int argc, char *argv[])
++op->cdb_length;
}
+ if (op->cmdfile_given) {
+ bool ok;
+
+ ok = f2hex_arr(op->cmd_file, false /* as_binary */,
+ false /* no_space */, op->cdb, &op->cdb_length,
+ MAX_SCSI_CDBSZ);
+ if (! ok)
+ return SG_LIB_SYNTAX_ERROR;
+ }
if (op->cdb_length < MIN_SCSI_CDBSZ) {
pr2serr("CDB too short (min. %d bytes)\n", MIN_SCSI_CDBSZ);
return SG_LIB_SYNTAX_ERROR;
}
if (op->do_enumerate || (op->verbose > 1)) {
+ bool probable_scsi = sg_is_scsi_cdb(op->cdb, op->cdb_length);
int sa;
char b[80];
- if (op->cdb_length > 16) {
- sa = sg_get_unaligned_be16(op->cdb + 8);
- if ((0x7f != op->cdb[0]) && (0x7e != op->cdb[0]))
- printf(">>> Unlikely to be SCSI CDB since all over 16 "
- "bytes long should\n>>> start with 0x7f or 0x7e\n");
- } else
- sa = op->cdb[1] & 0x1f;
- sg_get_opcode_sa_name(op->cdb[0], sa, 0, sizeof(b), b);
- printf("Attempt to decode cdb name: %s\n", b);
+ if (probable_scsi) {
+ if (op->cdb_length > 16) {
+ sa = sg_get_unaligned_be16(op->cdb + 8);
+ if ((0x7f != op->cdb[0]) && (0x7e != op->cdb[0]))
+ printf(">>> Unlikely to be SCSI CDB since all over 16 "
+ "bytes long should\n>>> start with 0x7f or "
+ "0x7e\n");
+ } else
+ sa = op->cdb[1] & 0x1f;
+ sg_get_opcode_sa_name(op->cdb[0], sa, 0, sizeof(b), b);
+ printf("Attempt to decode cdb name: %s\n", b);
+ }
}
return 0;
}
@@ -263,12 +483,12 @@ process_cl(struct opts_t * op, int argc, char *argv[])
static int
skip(int fd, off_t offset)
{
+ int err;
off_t remain;
char buffer[512];
- if (lseek(fd, offset, SEEK_SET) >= 0) {
+ if (lseek(fd, offset, SEEK_SET) >= 0)
return 0;
- }
// lseek failed; fall back to reading and discarding data
remain = offset;
@@ -278,79 +498,96 @@ skip(int fd, off_t offset)
: (off_t)sizeof(buffer);
done = read(fd, buffer, amount);
if (done < 0) {
- perror("Error reading input data");
- return SG_LIB_FILE_ERROR;
+ err = errno;
+ perror("Error reading input data to skip");
+ return sg_convert_errno(err);
} else if (done == 0) {
pr2serr("EOF on input file/stream\n");
return SG_LIB_FILE_ERROR;
- } else {
+ } else
remain -= done;
- }
}
-
return 0;
}
-static unsigned char *
-fetch_dataout(struct opts_t * op)
+static uint8_t *
+fetch_dataout(struct opts_t * op, uint8_t ** free_buf, int * errp)
{
bool ok = false;
- int fd, len;
- unsigned char *buf = NULL;
- unsigned char *wrkBuf = NULL;
+ int fd, len, err;
+ uint8_t *buf = NULL;
+ *free_buf = NULL;
+ if (errp)
+ *errp = 0;
if (op->dataout_file) {
fd = open(op->dataout_file, O_RDONLY);
if (fd < 0) {
+ err = errno;
+ if (errp)
+ *errp = sg_convert_errno(err);
perror(op->dataout_file);
goto bail;
}
-
- } else {
+ } else
fd = STDIN_FILENO;
- }
if (sg_set_binary_mode(fd) < 0) {
+ err = errno;
+ if (errp)
+ *errp = err;
perror("sg_set_binary_mode");
goto bail;
}
if (op->dataout_offset > 0) {
- if (skip(fd, op->dataout_offset) != 0) {
+ err = skip(fd, op->dataout_offset);
+ if (err != 0) {
+ if (errp)
+ *errp = err;
goto bail;
}
}
- buf = sg_memalign(op->dataout_len, 0 /* page_size */, &wrkBuf,
+ buf = sg_memalign(op->dataout_len, 0 /* page_size */, free_buf,
op->verbose > 3);
if (buf == NULL) {
- perror("malloc");
+ pr2serr("sg_memalign: failed to get %d bytes of memory\n",
+ op->dataout_len);
+ if (errp)
+ *errp = SG_LIB_OS_BASE_ERR + ENOMEM;
goto bail;
}
len = read(fd, buf, op->dataout_len);
if (len < 0) {
+ err = errno;
+ if (errp)
+ *errp = sg_convert_errno(err);
perror("Failed to read input data");
goto bail;
} else if (len < op->dataout_len) {
+ if (errp)
+ *errp = SG_LIB_FILE_ERROR;
pr2serr("EOF on input file/stream\n");
goto bail;
}
-
ok = true;
bail:
if (fd >= 0 && fd != STDIN_FILENO)
close(fd);
if (! ok) {
- if (wrkBuf)
- free(wrkBuf);
+ if (*free_buf) {
+ free(*free_buf);
+ *free_buf = NULL;
+ }
return NULL;
}
return buf;
}
static int
-write_dataout(const char *filename, unsigned char *buf, int len)
+write_dataout(const char *filename, uint8_t *buf, int len)
{
int ret = SG_LIB_FILE_ERROR;
int fd;
@@ -383,17 +620,20 @@ bail:
return ret;
}
+
int
main(int argc, char *argv[])
{
int ret = 0;
+ int err = 0;
int res_cat, status, slen, k, ret2;
int sg_fd = -1;
struct sg_pt_base *ptvp = NULL;
- unsigned char sense_buffer[32];
- unsigned char * dxfer_buffer_in = NULL;
- unsigned char * dxfer_buffer_out = NULL;
- unsigned char * wrkBuf = NULL;
+ uint8_t sense_buffer[32];
+ uint8_t * dxfer_buffer_in = NULL;
+ uint8_t * dxfer_buffer_out = NULL;
+ uint8_t * free_buf_out = NULL;
+ uint8_t * wrkBuf = NULL;
struct opts_t opts;
struct opts_t * op;
char b[128];
@@ -446,9 +686,9 @@ main(int argc, char *argv[])
set_scsi_pt_sense(ptvp, sense_buffer, sizeof(sense_buffer));
if (op->do_dataout) {
- dxfer_buffer_out = fetch_dataout(op);
+ dxfer_buffer_out = fetch_dataout(op, &free_buf_out, &err);
if (dxfer_buffer_out == NULL) {
- ret = SG_LIB_CAT_OTHER;
+ ret = err;
goto done;
}
if (op->verbose > 2)
@@ -460,8 +700,9 @@ main(int argc, char *argv[])
dxfer_buffer_in = sg_memalign(op->datain_len, 0 /* page_size */,
&wrkBuf, op->verbose > 3);
if (dxfer_buffer_in == NULL) {
- perror("malloc");
- ret = SG_LIB_CAT_OTHER;
+ pr2serr("sg_memalign: failed to get %d bytes of memory\n",
+ op->datain_len);
+ ret = SG_LIB_OS_BASE_ERR + ENOMEM;
goto done;
}
if (op->verbose > 2)
@@ -482,8 +723,14 @@ main(int argc, char *argv[])
ret = SG_LIB_CAT_OTHER;
goto done;
} else if (ret < 0) {
- pr2serr("do_scsi_pt: %s\n", safe_strerror(-ret));
- ret = SG_LIB_CAT_OTHER;
+ int err;
+
+ k = -ret;
+ pr2serr("do_scsi_pt: %s\n", safe_strerror(k));
+ err = get_scsi_pt_os_err(ptvp);
+ if (err != k)
+ pr2serr(" ... or perhaps: %s\n", safe_strerror(err));
+ ret = sg_convert_errno(err);
goto done;
}
@@ -570,6 +817,8 @@ done:
}
if (wrkBuf)
free(wrkBuf);
+ if (free_buf_out)
+ free(free_buf_out);
if (ptvp)
destruct_scsi_pt_obj(ptvp);
if (sg_fd >= 0)
diff --git a/src/sg_read_attr.c b/src/sg_read_attr.c
index 17b9cfa5..c684caa0 100644
--- a/src/sg_read_attr.c
+++ b/src/sg_read_attr.c
@@ -36,7 +36,7 @@
* and decodes the response. Based on spc5r08.pdf
*/
-static const char * version_str = "1.06 20180118";
+static const char * version_str = "1.07 20180210";
#define MAX_RATTR_BUFF_LEN (1024 * 1024)
#define DEF_RATTR_BUFF_LEN (1024 * 8)
@@ -278,7 +278,7 @@ sg_ll_read_attr(int sg_fd, void * resp, int * residp, bool noisy,
ret = sg_cmds_process_resp(ptvp, "read attribute", res, op->maxlen,
sense_b, noisy, op->verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_read_buffer.c b/src/sg_read_buffer.c
index f9561219..d5dc9c64 100644
--- a/src/sg_read_buffer.c
+++ b/src/sg_read_buffer.c
@@ -33,7 +33,7 @@
* device.
*/
-static const char * version_str = "1.21 20180118";
+static const char * version_str = "1.22 20180210";
#ifndef SG_READ_BUFFER_10_CMD
@@ -179,7 +179,7 @@ sg_ll_read_buffer_10(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
ret = sg_cmds_process_resp(ptvp, "Read buffer(10)", res, mx_resp_len,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
@@ -243,7 +243,7 @@ sg_ll_read_buffer_16(int sg_fd, int rb_mode, int rb_mode_sp, int rb_id,
ret = sg_cmds_process_resp(ptvp, "Read buffer(16)", res, mx_resp_len,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_rep_zones.c b/src/sg_rep_zones.c
index 7fc08d7f..f3170e81 100644
--- a/src/sg_rep_zones.c
+++ b/src/sg_rep_zones.c
@@ -35,7 +35,7 @@
* and decodes the response. Based on zbc-r02.pdf
*/
-static const char * version_str = "1.13 20180118";
+static const char * version_str = "1.14 20180210";
#define MAX_RZONES_BUFF_LEN (1024 * 1024)
#define DEF_RZONES_BUFF_LEN (1024 * 8)
@@ -154,7 +154,7 @@ sg_ll_report_zones(int sg_fd, uint64_t zs_lba, bool partial, int report_opts,
ret = sg_cmds_process_resp(ptvp, "report zones", res, mx_resp_len,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_reset_wp.c b/src/sg_reset_wp.c
index dec3e7ec..0f22647e 100644
--- a/src/sg_reset_wp.c
+++ b/src/sg_reset_wp.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2017 Douglas Gilbert.
+ * Copyright (c) 2014-2018 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.
@@ -34,7 +34,7 @@
* device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.07 20171008";
+static const char * version_str = "1.08 20180210";
#define SG_ZONING_OUT_CMDLEN 16
#define RESET_WRITE_POINTER_SA 0x4
@@ -109,7 +109,7 @@ sg_ll_reset_write_pointer(int sg_fd, uint64_t zid, bool all, bool noisy,
SG_NO_DATA_IN, sense_b, noisy, verbose,
&sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c
index bd4efca9..72a8a8ff 100644
--- a/src/sg_sanitize.c
+++ b/src/sg_sanitize.c
@@ -30,7 +30,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.05 20180118";
+static const char * version_str = "1.06 20180210";
/* Not all environments support the Unix sleep() */
#if defined(MSC_VER) || defined(__MINGW32__)
@@ -229,7 +229,7 @@ do_sanitize(int sg_fd, const struct opts_t * op, const void * param_lstp,
ret = sg_cmds_process_resp(ptvp, "Sanitize", res, SG_NO_DATA_IN, sense_b,
true /*noisy */, op->verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_stream_ctl.c b/src/sg_stream_ctl.c
index 032d40b4..4eafd5b3 100644
--- a/src/sg_stream_ctl.c
+++ b/src/sg_stream_ctl.c
@@ -33,7 +33,7 @@
* to the given SCSI device. Based on sbc4r15.pdf .
*/
-static const char * version_str = "1.00 20180126";
+static const char * version_str = "1.01 20180210";
#define STREAM_CONTROL_SA 0x14
#define GET_STREAM_STATUS_SA 0x16
@@ -139,12 +139,9 @@ sg_ll_get_stream_status(int sg_fd, uint16_t s_str_id, uint8_t * resp,
res = do_scsi_pt(ptvp, -1, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cmd_name, res, alloc_len, sense_b,
noisy, verbose, &sense_cat);
- if (-1 == ret) {
- int os_err = get_scsi_pt_os_err(ptvp);
-
- if ((os_err > 0) && (os_err < 47))
- ret = SG_LIB_OS_BASE_ERR + os_err;
- } else if (-2 == ret) {
+ if (-1 == ret)
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
diff --git a/src/sg_sync.c b/src/sg_sync.c
index 30b12eb6..152474fa 100644
--- a/src/sg_sync.c
+++ b/src/sg_sync.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2017 Douglas Gilbert.
+ * Copyright (c) 2004-2018 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.
@@ -29,7 +29,7 @@
* (e.g. disks).
*/
-static const char * version_str = "1.18 20171103";
+static const char * version_str = "1.19 20180210";
#define SYNCHRONIZE_CACHE16_CMD 0x91
#define SYNCHRONIZE_CACHE16_CMDLEN 16
@@ -122,7 +122,7 @@ sg_ll_sync_cache_16(int sg_fd, bool sync_nv, bool immed, int group,
SG_NO_DATA_IN, sense_b, noisy, verbose,
&sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_timestamp.c b/src/sg_timestamp.c
index f50aa7a4..9dd5bc22 100644
--- a/src/sg_timestamp.c
+++ b/src/sg_timestamp.c
@@ -34,7 +34,7 @@
* to the given SCSI device. Based on spc5r07.pdf .
*/
-static const char * version_str = "1.05 20180118";
+static const char * version_str = "1.06 20180210";
#define REP_TIMESTAMP_CMDLEN 12
#define SET_TIMESTAMP_CMDLEN 12
@@ -150,7 +150,7 @@ sg_ll_rep_timestamp(int sg_fd, void * resp, int mx_resp_len, int * residp,
ret = sg_cmds_process_resp(ptvp, "report timestamp", res, mx_resp_len,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
@@ -213,7 +213,7 @@ sg_ll_set_timestamp(int sg_fd, void * paramp, int param_len, bool noisy,
ret = sg_cmds_process_resp(ptvp, "set timestamp", res, SG_NO_DATA_IN,
sense_b, noisy, verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index 6bba408a..6790f9e8 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -25,7 +25,6 @@
#endif
#include "sg_lib.h"
#include "sg_cmds_basic.h"
-#include "sg_pt.h"
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
@@ -38,7 +37,7 @@
*/
-static const char * version_str = "1.36 20180201"; /* spc5r18 + sbc4r14 */
+static const char * version_str = "1.37 20180210"; /* spc5r18 + sbc4r14 */
/* standard VPD pages, in ascending page number order */
#define VPD_SUPPORTED_VPDS 0x0
diff --git a/src/sg_write_same.c b/src/sg_write_same.c
index 67507d6c..dc8f9d9f 100644
--- a/src/sg_write_same.c
+++ b/src/sg_write_same.c
@@ -30,7 +30,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.19 20180118";
+static const char * version_str = "1.20 20180210";
#define ME "sg_write_same: "
@@ -268,7 +268,7 @@ do_write_same(int sg_fd, const struct opts_t * op, const void * dataoutp,
sense_b, true /*noisy */, op->verbose,
&sense_cat);
if (-1 == ret)
- ;
+ get_scsi_pt_os_err(ptvp);
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_write_verify.c b/src/sg_write_verify.c
index 64937d6b..4594ef95 100644
--- a/src/sg_write_verify.c
+++ b/src/sg_write_verify.c
@@ -37,7 +37,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.11 20180118";
+static const char * version_str = "1.12 20180210";
#define ME "sg_write_verify: "
@@ -152,7 +152,7 @@ run_scsi_transaction(int sg_fd, const unsigned char *cdbp, int cdb_len,
ret = sg_cmds_process_resp(ptvp, b, res, SG_NO_DATA_IN, sense_b, noisy,
verbose, &sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_write_x.c b/src/sg_write_x.c
index cf931925..2644bf78 100644
--- a/src/sg_write_x.c
+++ b/src/sg_write_x.c
@@ -1317,7 +1317,7 @@ do_write_x(int sg_fd, const void * dataoutp, int dout_len,
ret = sg_cmds_process_resp(ptvp, op->cdb_name, res, SG_NO_DATA_IN,
sense_b, true /*noisy */, vb, &sense_cat);
if (-1 == ret)
- ; /* general (OS) error like ioctl not recognized */
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED:
diff --git a/src/sg_zone.c b/src/sg_zone.c
index ca964b1f..d764c621 100644
--- a/src/sg_zone.c
+++ b/src/sg_zone.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2017 Douglas Gilbert.
+ * Copyright (c) 2014-2018 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.
@@ -34,7 +34,7 @@
* to the given SCSI device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.05 20171008";
+static const char * version_str = "1.06 20180210";
#define SG_ZONING_OUT_CMDLEN 16
#define CLOSE_ZONE_SA 0x1
@@ -127,7 +127,7 @@ sg_ll_zone_out(int sg_fd, int sa, uint64_t zid, bool all, bool noisy,
SG_NO_DATA_IN, sense_b, noisy, verbose,
&sense_cat);
if (-1 == ret)
- ;
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_RECOVERED: