diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2018-02-11 05:01:16 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2018-02-11 05:01:16 +0000 |
commit | 5bdce507b09d32f452a390c22cb98ae7f840c151 (patch) | |
tree | 40f080676d587b650cfa3133e7dcf3ab3084af0c /src | |
parent | 4a5962a81447bb60cca7e51dd005b3bdaab1452b (diff) | |
download | sg3_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.c | 11 | ||||
-rw-r--r-- | src/sg_compare_and_write.c | 4 | ||||
-rw-r--r-- | src/sg_format.c | 4 | ||||
-rw-r--r-- | src/sg_opcodes.c | 4 | ||||
-rw-r--r-- | src/sg_raw.c | 345 | ||||
-rw-r--r-- | src/sg_read_attr.c | 4 | ||||
-rw-r--r-- | src/sg_read_buffer.c | 6 | ||||
-rw-r--r-- | src/sg_rep_zones.c | 4 | ||||
-rw-r--r-- | src/sg_reset_wp.c | 6 | ||||
-rw-r--r-- | src/sg_sanitize.c | 4 | ||||
-rw-r--r-- | src/sg_stream_ctl.c | 11 | ||||
-rw-r--r-- | src/sg_sync.c | 6 | ||||
-rw-r--r-- | src/sg_timestamp.c | 6 | ||||
-rw-r--r-- | src/sg_vpd.c | 3 | ||||
-rw-r--r-- | src/sg_write_same.c | 4 | ||||
-rw-r--r-- | src/sg_write_verify.c | 4 | ||||
-rw-r--r-- | src/sg_write_x.c | 2 | ||||
-rw-r--r-- | src/sg_zone.c | 6 |
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: |