aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2018-05-15 20:44:45 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2018-05-15 20:44:45 +0000
commit856fb91355bddbe7a15a9d11334c354d8ee7b6d3 (patch)
tree9446f14be2d17b1f0449a466e0762a9a3361ca7b
parent71e56cc16387a76971a04fda4ff9306ec704daf9 (diff)
downloadsg3_utils-856fb91355bddbe7a15a9d11334c354d8ee7b6d3.tar.gz
cleanup of error messages around sg_cmds_open_device(); add flock error msg for ddpt
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@772 6180dd3e-e324-4e3e-922d-17de1ae2f315
-rw-r--r--ChangeLog4
-rw-r--r--debian/changelog2
-rw-r--r--doc/sg_decode_sense.86
-rw-r--r--lib/sg_lib_data.c3
-rw-r--r--lib/sg_pt_linux_nvme.c4
-rw-r--r--sg3_utils.spec2
-rw-r--r--src/sg_bg_ctl.c4
-rw-r--r--src/sg_compare_and_write.c12
-rw-r--r--src/sg_copy_results.c9
-rw-r--r--src/sg_format.c2
-rw-r--r--src/sg_modes.c3
-rw-r--r--src/sg_persist.c4
-rw-r--r--src/sg_prevent.c16
-rw-r--r--src/sg_rdac.c13
-rw-r--r--src/sg_read_attr.c11
-rw-r--r--src/sg_read_block_limits.c15
-rw-r--r--src/sg_read_buffer.c15
-rw-r--r--src/sg_read_long.c44
-rw-r--r--src/sg_readcap.c27
-rw-r--r--src/sg_reassign.c29
-rw-r--r--src/sg_referrals.c18
-rw-r--r--src/sg_rep_zones.c30
-rw-r--r--src/sg_requests.c29
-rw-r--r--src/sg_reset.c9
-rw-r--r--src/sg_reset_wp.c28
-rw-r--r--src/sg_rmsn.c29
-rw-r--r--src/sg_rtpg.c29
-rw-r--r--src/sg_safte.c32
-rw-r--r--src/sg_sanitize.c36
-rw-r--r--src/sg_sat_identify.c32
-rw-r--r--src/sg_sat_phy_event.c3
-rw-r--r--src/sg_sat_read_gplog.c40
-rw-r--r--src/sg_sat_set_features.c32
-rw-r--r--src/sg_seek.c31
-rw-r--r--src/sg_senddiag.c21
-rw-r--r--src/sg_ses.c31
-rw-r--r--src/sg_ses_microcode.c38
-rw-r--r--src/sg_start.c55
-rw-r--r--src/sg_stpg.c29
-rw-r--r--src/sg_stream_ctl.c34
-rw-r--r--src/sg_sync.c31
-rw-r--r--src/sg_timestamp.c29
-rw-r--r--src/sg_unmap.c14
-rw-r--r--src/sg_verify.c46
-rw-r--r--src/sg_wr_mode.c24
-rw-r--r--src/sg_write_buffer.c33
-rw-r--r--src/sg_write_long.c29
-rw-r--r--src/sg_write_same.c32
-rw-r--r--src/sg_write_x.c10
-rw-r--r--src/sg_xcopy.c92
-rw-r--r--src/sg_zone.c28
51 files changed, 759 insertions, 420 deletions
diff --git a/ChangeLog b/ChangeLog
index 166bee95..b733ecf7 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.43 [20180510] [svn: r771]
+Changelog for sg3_utils-1.43 [20180515] [svn: r772]
- sg_write_x: where x can be normal, atomic, or(write),
same, scattered, or stream writes with 16 or 32 byte
cdbs (sbc4r04 for atomic, sbc4r11 for scattered)
@@ -27,7 +27,7 @@ Changelog for sg3_utils-1.43 [20180510] [svn: r771]
- add 'offset_temp' and 'rqst_override' to temperature
sensor element type
- add 'hw_reset' and 'sw_reset' to enclosure services
- controller electronics element type (18-047r0)
+ controller electronics element type (18-047r1)
- interpret '--join --page=aes' to only display join
rows that have a corresponding AES dpage element
- support NVMe attached enclosure via NVME-MI Send and
diff --git a/debian/changelog b/debian/changelog
index 26cd66e7..4ea77ff3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,7 +2,7 @@ sg3-utils (1.43-0.1) unstable; urgency=low
* New upstream version
- -- Douglas Gilbert <dgilbert@interlog.com> Thu, 10 May 2018 23:00:00 -0400
+ -- Douglas Gilbert <dgilbert@interlog.com> Tue, 15 May 2018 16:00:00 -0400
sg3-utils (1.42-0.1) unstable; urgency=low
diff --git a/doc/sg_decode_sense.8 b/doc/sg_decode_sense.8
index b17b5cee..ecf04f66 100644
--- a/doc/sg_decode_sense.8
+++ b/doc/sg_decode_sense.8
@@ -1,4 +1,4 @@
-.TH SG_DECODE_SENSE "8" "April 2016" "sg3_utils\-1.43" SG3_UTILS
+.TH SG_DECODE_SENSE "8" "May 2018" "sg3_utils\-1.43" SG3_UTILS
.SH NAME
sg_decode_sense \- decode SCSI sense data
.SH SYNOPSIS
@@ -74,7 +74,7 @@ hex string is 1023 characters long.
.TP
\fB\-s\fR, \fB\-\-status\fR=\fISS\fR
where \fISS\fR is a SCSI status byte value, given in hexadecimal. The
-SCSI status byte is related to but distinct from sense data.
+SCSI status byte is related to, but distinct from, sense data.
.TP
\fB\-v\fR, \fB\-\-verbose\fR
increase the degree of verbosity (debug messages).
@@ -132,7 +132,7 @@ Written by Douglas Gilbert.
.SH "REPORTING BUGS"
Report bugs to <dgilbert at interlog dot com>.
.SH COPYRIGHT
-Copyright \(co 2010\-2016 Douglas Gilbert
+Copyright \(co 2010\-2018 Douglas Gilbert
.br
This software is distributed under a FreeBSD license. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c
index 1524979e..ad5b8222 100644
--- a/lib/sg_lib_data.c
+++ b/lib/sg_lib_data.c
@@ -17,7 +17,7 @@
#include "sg_lib_data.h"
-const char * sg_lib_version_str = "2.44 20180510";/* spc5r19, sbc4r15 */
+const char * sg_lib_version_str = "2.45 20180514";/* spc5r19, sbc4r15 */
/* indexed by pdt; those that map to own index do not decay */
@@ -1768,6 +1768,7 @@ struct sg_value_2names_t sg_exit_str_arr[] = {
{33, "SCSI command timeout", NULL}, /* OS timed out command */
{40, "Aborted command, protection error", NULL},
{41, "Aborted command, protection error with Info field", NULL},
+ {47, "flock (Unix system call) error", NULL}, /* ddpt */
{48, "NVMe command with non-zero status", NULL},
{50, "An OS error occurred", "(errno > 46)"},
/* OS errors (errno in Unix) from 1 to 46 mapped into this range */
diff --git a/lib/sg_pt_linux_nvme.c b/lib/sg_pt_linux_nvme.c
index 7e6a916b..21855204 100644
--- a/lib/sg_pt_linux_nvme.c
+++ b/lib/sg_pt_linux_nvme.c
@@ -451,7 +451,7 @@ sntl_cache_identity(struct sg_pt_linux_scsi * ptp, int time_secs, int vb)
ptp->nvme_id_ctlp = up;
if (NULL == up) {
pr2ws("%s: sg_memalign() failed to get memory\n", __func__);
- return -ENOMEM;
+ return sg_convert_errno(ENOMEM);
}
memset(&cmd, 0, sizeof(cmd));
cmd.opcode = 0x6; /* Identify */
@@ -461,7 +461,7 @@ sntl_cache_identity(struct sg_pt_linux_scsi * ptp, int time_secs, int vb)
ret = do_nvme_admin_cmd(ptp, &cmd, up, true, time_secs, vb);
if (0 == ret)
sntl_check_enclosure_override(ptp, vb);
- return ret;
+ return (ret < 0) ? sg_convert_errno(-ret) : ret;
}
static const char * nvme_scsi_vendor_str = "NVMe ";
diff --git a/sg3_utils.spec b/sg3_utils.spec
index 05f3fbba..7327f5dc 100644
--- a/sg3_utils.spec
+++ b/sg3_utils.spec
@@ -79,7 +79,7 @@ fi
%{_libdir}/*.la
%changelog
-* Thu May 10 2018 - dgilbert at interlog dot com
+* Tue May 15 2018 - dgilbert at interlog dot com
- track t10 changes
* sg3_utils-1.43
diff --git a/src/sg_bg_ctl.c b/src/sg_bg_ctl.c
index b36ef03e..f0ea7ff6 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.07 20180509";
+static const char * version_str = "1.08 20180512";
#define BACKGROUND_CONTROL_SA 0x15
@@ -235,7 +235,7 @@ fini:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return sg_convert_errno(-res);
+ ret = sg_convert_errno(-res);
}
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
diff --git a/src/sg_compare_and_write.c b/src/sg_compare_and_write.c
index 24a66b5d..2db81001 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.23 20180510";
+static const char * version_str = "1.24 20180512";
#define DEF_BLOCK_SIZE 512
#define DEF_NUM_BLOCKS (1)
@@ -444,11 +444,9 @@ open_dev(const char * outf, int verbose)
{
int sg_fd = sg_cmds_open_device(outf, false /* rw */, verbose);
- if (sg_fd < 0) {
+ if ((sg_fd < 0) && verbose)
pr2serr(ME "open error: %s: %s\n", outf,
safe_strerror(-sg_fd));
- return -sg_convert_errno(-sg_fd);
- }
return sg_fd;
}
@@ -505,7 +503,7 @@ main(int argc, char * argv[])
devfd = open_dev(op->device_name, vb);
if (devfd < 0) {
- res = -devfd;
+ res = sg_convert_errno(-devfd);
goto out;
}
@@ -551,8 +549,6 @@ main(int argc, char * argv[])
res = sg_ll_compare_and_write(devfd, wrkBuff, op->numblocks, op->lba,
op->xfer_len, op->flags, ! op->quiet,
vb);
-
-out:
if (0 != res) {
char b[80];
@@ -567,7 +563,7 @@ out:
break;
}
}
-
+out:
if (free_wrkBuff)
free(free_wrkBuff);
if ((infd >= 0) && (! ifn_stdin))
diff --git a/src/sg_copy_results.c b/src/sg_copy_results.c
index 0c64cf61..09989791 100644
--- a/src/sg_copy_results.c
+++ b/src/sg_copy_results.c
@@ -38,7 +38,7 @@
and the optional list identifier passed as the list_id argument.
*/
-static const char * version_str = "1.21 20180510";
+static const char * version_str = "1.22 20180512";
#define MAX_XFER_LEN 10000
@@ -411,9 +411,10 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
goto finish;
}
diff --git a/src/sg_format.c b/src/sg_format.c
index 563bc307..eb0ad798 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.46 20180510";
+static const char * version_str = "1.47 20180512";
#define RW_ERROR_RECOVERY_PAGE 1 /* can give alternate with --mode=MP */
diff --git a/src/sg_modes.c b/src/sg_modes.c
index e680a153..ebcaabc9 100644
--- a/src/sg_modes.c
+++ b/src/sg_modes.c
@@ -30,7 +30,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.60 20180414";
+static const char * version_str = "1.62 20180511";
#define DEF_ALLOC_LEN (1024 * 4)
#define DEF_6_ALLOC_LEN 252
@@ -62,6 +62,7 @@ static struct option long_options[] = {
{"raw", no_argument, 0, 'r'},
{"read-write", no_argument, 0, 'w'},
{"read_write", no_argument, 0, 'w'},
+ {"readwrite", no_argument, 0, 'w'},
{"six", no_argument, 0, '6'},
{"verbose", no_argument, 0, 'v'},
{"version", no_argument, 0, 'V'},
diff --git a/src/sg_persist.c b/src/sg_persist.c
index 81f81117..8ff8bf0b 100644
--- a/src/sg_persist.c
+++ b/src/sg_persist.c
@@ -33,7 +33,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "0.63 20180326";
+static const char * version_str = "0.64 20180511";
#define PRIN_RKEY_SA 0x0
@@ -1282,7 +1282,7 @@ main(int argc, char * argv[])
fini:
if (ret && (0 == op->verbose) && (! flagged)) {
- if (! sg_if_can2stderr("", ret))
+ if (! sg_if_can2stderr("sg_persist failed: ", ret))
pr2serr("Some error occurred [%d]\n", ret);
}
if (sg_fd >= 0) {
diff --git a/src/sg_prevent.c b/src/sg_prevent.c
index 7c2e6683..ba262ce6 100644
--- a/src/sg_prevent.c
+++ b/src/sg_prevent.c
@@ -134,9 +134,11 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
res = sg_ll_prevent_allow(sg_fd, prevent, true, verbose);
ret = res;
@@ -150,7 +152,13 @@ int main(int argc, char * argv[])
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
+ }
+fini:
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_prevent failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_rdac.c b/src/sg_rdac.c
index f979c759..73f4684a 100644
--- a/src/sg_rdac.c
+++ b/src/sg_rdac.c
@@ -30,7 +30,7 @@
#include "sg_pr2serr.h"
-static const char * version_str = "1.16 20180219";
+static const char * version_str = "1.17 20180512";
uint8_t mode6_hdr[] = {
0x75, /* Length */
@@ -440,7 +440,8 @@ int main(int argc, char * argv[])
if (fd < 0) {
pr2serr("open error: %s: %s\n", file_name, safe_strerror(-fd));
usage();
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-fd);
+ goto fini;
}
if (fail_all) {
@@ -501,7 +502,13 @@ int main(int argc, char * argv[])
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(res);
+ }
+fini:
+ if (0 == do_verbose) {
+ if (! sg_if_can2stderr("sg_rdac failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_read_attr.c b/src/sg_read_attr.c
index ff10af92..32f19ec3 100644
--- a/src/sg_read_attr.c
+++ b/src/sg_read_attr.c
@@ -37,7 +37,7 @@
* and decodes the response. Based on spc5r08.pdf
*/
-static const char * version_str = "1.09 20180425";
+static const char * version_str = "1.10 20180512";
#define MAX_RATTR_BUFF_LEN (1024 * 1024)
#define DEF_RATTR_BUFF_LEN (1024 * 8)
@@ -1096,7 +1096,7 @@ main(int argc, char * argv[])
if (sg_fd < 0) {
pr2serr("open error: %s: %s\n", device_name,
safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-sg_fd);
goto clean_up;
}
@@ -1141,10 +1141,15 @@ close_then_end:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
}
clean_up:
if (free_rabp)
free(free_rabp);
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_read_attr failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' or '-vv' for "
+ "more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_read_block_limits.c b/src/sg_read_block_limits.c
index 5dbc8478..607627ca 100644
--- a/src/sg_read_block_limits.c
+++ b/src/sg_read_block_limits.c
@@ -147,8 +147,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto the_end2;
}
memset(readBlkLmtBuff, 0x0, 6);
@@ -195,7 +198,13 @@ the_end:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
+ }
+the_end2:
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_read_block_limits failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' or '-vv' for "
+ "more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_read_buffer.c b/src/sg_read_buffer.c
index 2137ba6a..d643a272 100644
--- a/src/sg_read_buffer.c
+++ b/src/sg_read_buffer.c
@@ -33,7 +33,7 @@
* device.
*/
-static const char * version_str = "1.23 20180219";
+static const char * version_str = "1.24 20180513";
#ifndef SG_READ_BUFFER_10_CMD
@@ -448,8 +448,10 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
goto fini;
}
@@ -512,8 +514,13 @@ fini:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
}
}
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_read_buffer failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_read_long.c b/src/sg_read_long.c
index 1c278801..d9f24829 100644
--- a/src/sg_read_long.c
+++ b/src/sg_read_long.c
@@ -19,6 +19,7 @@
#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
+#include <errno.h>
#include <getopt.h>
#include <errno.h>
#define __STDC_FORMAT_MACROS 1
@@ -127,14 +128,16 @@ main(int argc, char * argv[])
bool pblock = false;
bool readonly = false;
bool got_stdout;
- int sg_fd, outfd, res, c;
+ int outfd, res, c;
+ int sg_fd = -1;
int ret = 0;
int xfer_len = 520;
int verbose = 0;
uint64_t llba = 0;
int64_t ll;
uint8_t * readLongBuff = NULL;
- void * rawp = NULL;
+ uint8_t * rawp = NULL;
+ uint8_t * free_rawp = NULL;
const char * device_name = NULL;
char out_fname[256];
char ebuff[EBUFF_SZ];
@@ -221,14 +224,19 @@ main(int argc, char * argv[])
}
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
- if (NULL == (rawp = malloc(MAX_XFER_LEN))) {
- pr2serr(ME "out of memory\n");
- sg_cmds_close_device(sg_fd);
- return SG_LIB_SYNTAX_ERROR;
+ if (NULL == (rawp = (uint8_t *)sg_memalign(MAX_XFER_LEN, 0, &free_rawp,
+ false))) {
+ if (verbose)
+ pr2serr(ME "out of memory\n");
+ ret = sg_convert_errno(ENOMEM);
+ goto err_out;
}
readLongBuff = (uint8_t *)rawp;
memset(rawp, 0x0, MAX_XFER_LEN);
@@ -272,12 +280,20 @@ main(int argc, char * argv[])
}
err_out:
- if (rawp) free(rawp);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (free_rawp)
+ free(free_rawp);
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_read_long failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_readcap.c b/src/sg_readcap.c
index 9b5a6850..ac0b96e1 100644
--- a/src/sg_readcap.c
+++ b/src/sg_readcap.c
@@ -71,7 +71,7 @@ struct opts_t {
int do_help;
int do_hex;
int do_lba;
- int do_verbose;
+ int verbose;
uint64_t llba;
const char * device_name;
};
@@ -214,7 +214,7 @@ new_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
op->o_readonly = true;
break;
case 'v':
- ++op->do_verbose;
+ ++op->verbose;
break;
case 'V':
op->do_version = true;
@@ -299,7 +299,7 @@ old_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
op->o_readonly = true;
break;
case 'v':
- ++op->do_verbose;
+ ++op->verbose;
break;
case 'V':
op->do_version = true;
@@ -457,7 +457,7 @@ main(int argc, char * argv[])
else
rw_0_flag = true; /* RCAP(10) has opened RO in past, so leave */
if ((sg_fd = sg_cmds_open_device(op->device_name, rw_0_flag,
- op->do_verbose)) < 0) {
+ op->verbose)) < 0) {
pr2serr(ME "error opening file: %s: %s\n", op->device_name,
safe_strerror(-sg_fd));
ret = sg_convert_errno(-sg_fd);
@@ -467,7 +467,7 @@ main(int argc, char * argv[])
if (! op->do_long) {
res = sg_ll_readcap_10(sg_fd, op->do_pmi, (unsigned int)op->llba,
resp_buff, RCAP_REPLY_LEN, true,
- op->do_verbose);
+ op->verbose);
ret = res;
if (0 == res) {
if (op->do_hex || op->do_raw) {
@@ -525,23 +525,23 @@ main(int argc, char * argv[])
op->do_long = true;
sg_cmds_close_device(sg_fd);
if ((sg_fd = sg_cmds_open_device(op->device_name, op->o_readonly,
- op->do_verbose)) < 0) {
+ op->verbose)) < 0) {
pr2serr(ME "error re-opening file: %s (rw): %s\n",
op->device_name, safe_strerror(-sg_fd));
ret = sg_convert_errno(-sg_fd);
goto fini;
}
- if (op->do_verbose)
+ if (op->verbose)
pr2serr("READ CAPACITY (10) not supported, trying READ "
"CAPACITY (16)\n");
} else if (res) {
- sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
+ sg_get_category_sense_str(res, sizeof(b), b, op->verbose);
pr2serr("READ CAPACITY (10) failed: %s\n", b);
}
}
if (op->do_long) {
res = sg_ll_readcap_16(sg_fd, op->do_pmi, op->llba, resp_buff,
- RCAP16_REPLY_LEN, true, op->do_verbose);
+ RCAP16_REPLY_LEN, true, op->verbose);
ret = res;
if (0 == res) {
if (op->do_hex || op->do_raw) {
@@ -619,7 +619,7 @@ main(int argc, char * argv[])
pr2serr("bad field in READ CAPACITY (16) cdb including "
"unsupported service action\n");
else if (res) {
- sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
+ sg_get_category_sense_str(res, sizeof(b), b, op->verbose);
pr2serr("READ CAPACITY (16) failed: %s\n", b);
}
}
@@ -633,8 +633,13 @@ fini:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
}
}
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_readcap failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_reassign.c b/src/sg_reassign.c
index 79e3ffd7..0cba9582 100644
--- a/src/sg_reassign.c
+++ b/src/sg_reassign.c
@@ -37,7 +37,7 @@
* vendor specific data is written.
*/
-static const char * version_str = "1.24 20180219";
+static const char * version_str = "1.25 20180513";
#define DEF_DEFECT_LIST_FORMAT 4 /* bytes from index */
@@ -225,7 +225,8 @@ main(int argc, char * argv[])
bool longlist = false;
bool primary = false;
bool grown = false;
- int sg_fd, res, c, num, k, j;
+ int res, c, num, k, j;
+ int sg_fd = -1;
int addr_arr_len = 0;
int do_hex = 0;
int verbose = 0;
@@ -365,8 +366,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
if (got_addr) {
@@ -457,11 +461,18 @@ main(int argc, char * argv[])
}
err_out:
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_reassign failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_referrals.c b/src/sg_referrals.c
index 83ab89e7..f2036149 100644
--- a/src/sg_referrals.c
+++ b/src/sg_referrals.c
@@ -35,7 +35,7 @@
* SCSI device.
*/
-static const char * version_str = "1.11 20180425"; /* sbc4r10 */
+static const char * version_str = "1.12 20180513"; /* sbc4r10 */
#define MAX_REFER_BUFF_LEN (1024 * 1024)
#define DEF_REFER_BUFF_LEN 256
@@ -173,7 +173,8 @@ main(int argc, char * argv[])
bool do_one_segment = false;
bool o_readonly = false;
bool do_raw = false;
- int sg_fd, k, res, c, rlen;
+ int k, res, c, rlen;
+ int sg_fd = -1;
int do_hex = 0;
int maxlen = DEF_REFER_BUFF_LEN;
int verbose = 0;
@@ -276,8 +277,10 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
goto free_buff;
}
@@ -345,10 +348,15 @@ the_end:
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
}
free_buff:
if (free_referralBuffp)
free(free_referralBuffp);
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_referrals failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_rep_zones.c b/src/sg_rep_zones.c
index ce4078ad..ea1e8226 100644
--- a/src/sg_rep_zones.c
+++ b/src/sg_rep_zones.c
@@ -36,7 +36,7 @@
* and decodes the response. Based on zbc-r02.pdf
*/
-static const char * version_str = "1.16 20180425";
+static const char * version_str = "1.16 20180513";
#define MAX_RZONES_BUFF_LEN (1024 * 1024)
#define DEF_RZONES_BUFF_LEN (1024 * 8)
@@ -277,7 +277,8 @@ main(int argc, char * argv[])
bool do_partial = false;
bool do_raw = false;
bool o_readonly = false;
- int sg_fd, k, res, c, zl_len, len, zones, resid, rlen, zt, zc, same;
+ int k, res, c, zl_len, len, zones, resid, rlen, zt, zc, same;
+ int sg_fd = -1;
int do_help = 0;
int do_hex = 0;
int maxlen = 0;
@@ -385,9 +386,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto the_end;
}
if (0 == maxlen)
@@ -472,11 +475,18 @@ main(int argc, char * argv[])
the_end:
if (free_rzbp)
free(free_rzbp);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_rep_zones failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_requests.c b/src/sg_requests.c
index fd85c054..6153c847 100644
--- a/src/sg_requests.c
+++ b/src/sg_requests.c
@@ -29,7 +29,7 @@
* This program issues the SCSI command REQUEST SENSE to the given SCSI device.
*/
-static const char * version_str = "1.30 20180219";
+static const char * version_str = "1.31 20180513";
#define MAX_REQS_RESP_LEN 255
#define DEF_REQS_RESP_LEN 252
@@ -110,7 +110,8 @@ dStrRaw(const uint8_t * str, int len)
int
main(int argc, char * argv[])
{
- int sg_fd, res, c, resp_len, k, progress;
+ int res, c, resp_len, k, progress;
+ int sg_fd = -1;
uint8_t requestSenseBuff[MAX_REQS_RESP_LEN + 1];
bool desc = false;
bool do_progress = false;
@@ -217,8 +218,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, true /* ro */, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto finish;
}
if (do_progress) {
for (k = 0; k < num_rs; ++k) {
@@ -344,11 +348,18 @@ main(int argc, char * argv[])
#endif
finish:
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_requests failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_reset.c b/src/sg_reset.c
index 36f14470..9f5648e8 100644
--- a/src/sg_reset.c
+++ b/src/sg_reset.c
@@ -1,12 +1,13 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 1999-2017 D. Gilbert
+ * Copyright (C) 1999-2018 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)
* any later version.
*
* This program send either device, bus or host resets to device,
- * or bus or host associated with the given sg device.
+ * or bus or host associated with the given sg device. This is a Linux
+ * only utility (perhaps Android as well).
*/
#include <unistd.h>
@@ -30,7 +31,7 @@
#define ME "sg_reset: "
-static const char * version_str = "0.65 20171021";
+static const char * version_str = "0.66 20180515";
#ifndef SG_SCSI_RESET
#define SG_SCSI_RESET 0x2284
@@ -103,8 +104,8 @@ usage(int compat_mode)
" --host|-H host (bus adapter: HBA) reset\n");
}
pr2serr(" --no-esc|-N overrides default action and only does "
- " --no-escalate The same as --no-esc|-N"
"reset requested\n"
+ " --no-escalate The same as --no-esc|-N"
" --target|-t target reset. The target holds the DEVICE "
"and perhaps\n"
" other LUs\n"
diff --git a/src/sg_reset_wp.c b/src/sg_reset_wp.c
index 5542283b..8af91d4b 100644
--- a/src/sg_reset_wp.c
+++ b/src/sg_reset_wp.c
@@ -35,7 +35,7 @@
* device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.10 20180504";
+static const char * version_str = "1.11 20180513";
#define SG_ZONING_OUT_CMDLEN 16
#define RESET_WRITE_POINTER_SA 0x4
@@ -135,7 +135,8 @@ main(int argc, char * argv[])
{
bool all = false;
bool zid_given = false;
- int sg_fd, res, c, n;
+ int res, c, n;
+ int sg_fd = -1;
int ret = 0;
int verbose = 0;
uint16_t zc = 0;
@@ -219,9 +220,11 @@ main(int argc, char * argv[])
if (sg_fd < 0) {
int err = -sg_fd;
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(err));
- return sg_convert_errno(err);
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(err));
+ ret = sg_convert_errno(err);
+ goto fini;
}
res = sg_ll_reset_write_pointer(sg_fd, zid, zc, all, true, verbose);
@@ -237,16 +240,19 @@ main(int argc, char * argv[])
}
}
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
if (0 == verbose) {
if (! sg_if_can2stderr("sg_reset_wp failed: ", ret))
pr2serr("Some error occurred, try again with '-v' or '-vv' for "
"more information\n");
}
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = sg_convert_errno(-res);
- }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_rmsn.c b/src/sg_rmsn.c
index cfbc29e2..41bf7ee7 100644
--- a/src/sg_rmsn.c
+++ b/src/sg_rmsn.c
@@ -31,7 +31,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.16 20180219";
+static const char * version_str = "1.17 20180513";
#define SERIAL_NUM_SANITY_LEN (16 * 1024)
@@ -65,7 +65,8 @@ int main(int argc, char * argv[])
{
bool raw = false;
bool readonly = false;
- int sg_fd, res, c, sn_len, n;
+ int res, c, sn_len, n;
+ int sg_fd = -1;
int ret = 0;
int verbose = 0;
uint8_t rmsn_buff[4];
@@ -130,8 +131,11 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
memset(rmsn_buff, 0x0, sizeof(rmsn_buff));
@@ -185,11 +189,18 @@ int main(int argc, char * argv[])
err_out:
if (bp)
free(bp);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_rmsn failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_rtpg.c b/src/sg_rtpg.c
index 9a366583..2203c015 100644
--- a/src/sg_rtpg.c
+++ b/src/sg_rtpg.c
@@ -31,7 +31,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.25 20180219";
+static const char * version_str = "1.26 20180513";
#define REPORT_TGT_GRP_BUFF_LEN 1024
@@ -143,7 +143,8 @@ int main(int argc, char * argv[])
bool raw = false;
bool o_readonly = false;
bool extended = false;
- int sg_fd, k, j, off, res, c, report_len, tgt_port_count;
+ int k, j, off, res, c, report_len, tgt_port_count;
+ int sg_fd = -1;
int ret = 0;
int verbose = 0;
uint8_t reportTgtGrpBuff[REPORT_TGT_GRP_BUFF_LEN];
@@ -217,8 +218,11 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
memset(reportTgtGrpBuff, 0x0, sizeof(reportTgtGrpBuff));
@@ -312,11 +316,18 @@ int main(int argc, char * argv[])
}
err_out:
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_rtpg failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_safte.c b/src/sg_safte.c
index 9edb9083..0a257851 100644
--- a/src/sg_safte.c
+++ b/src/sg_safte.c
@@ -514,7 +514,8 @@ main(int argc, char * argv[])
{
bool do_insertions = false;
bool no_hex_raw;
- int sg_fd, c, ret, peri_type;
+ int c, ret, peri_type;
+ int sg_fd = -1;
int res = SG_LIB_CAT_OTHER;
const char * device_name = NULL;
char ebuff[EBUFF_SZ];
@@ -610,10 +611,13 @@ main(int argc, char * argv[])
if ((sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose))
< 0) {
- snprintf(ebuff, EBUFF_SZ, "sg_safte: error opening file: %s (rw)",
- device_name);
- perror(ebuff);
- return SG_LIB_FILE_ERROR;
+ if (verbose) {
+ snprintf(ebuff, EBUFF_SZ, "sg_safte: error opening file: %s (rw)",
+ device_name);
+ perror(ebuff);
+ }
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
no_hex_raw = ((0 == do_hex) && (0 == do_raw));
@@ -728,11 +732,19 @@ err_out:
break;
}
ret = res;
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_safte failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_sanitize.c b/src/sg_sanitize.c
index 38e5030b..aaa98c04 100644
--- a/src/sg_sanitize.c
+++ b/src/sg_sanitize.c
@@ -31,7 +31,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.07 20180219";
+static const char * version_str = "1.08 20180515";
/* Not all environments support the Unix sleep() */
#if defined(MSC_VER) || defined(__MINGW32__)
@@ -432,7 +432,8 @@ int
main(int argc, char * argv[])
{
bool got_stdin = false;
- int sg_fd, k, res, c, infd, progress, vb, n, resp_len;
+ int k, res, c, infd, progress, vb, n, resp_len, err;
+ int sg_fd = -1;
int param_lst_len = 0;
int ret = -1;
const char * device_name = NULL;
@@ -582,9 +583,11 @@ main(int argc, char * argv[])
if (! got_stdin) {
memset(&a_stat, 0, sizeof(a_stat));
if (stat(op->pattern_fn, &a_stat) < 0) {
+ err = errno;
pr2serr("pattern file: unable to stat(%s): %s\n",
- op->pattern_fn, safe_strerror(errno));
- return SG_LIB_FILE_ERROR;
+ op->pattern_fn, safe_strerror(err));
+ ret = sg_convert_errno(err);
+ goto err_out;
}
if (op->ipl <= 0) {
op->ipl = (int)a_stat.st_size;
@@ -605,9 +608,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, vb);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (op->verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
ret = print_dev_id(sg_fd, inq_resp, sizeof(inq_resp), op->verbose);
@@ -741,11 +746,18 @@ main(int argc, char * argv[])
err_out:
if (wBuff)
free(wBuff);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_sanitize failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_sat_identify.c b/src/sg_sat_identify.c
index 2fbe53e8..454b8c06 100644
--- a/src/sg_sat_identify.c
+++ b/src/sg_sat_identify.c
@@ -52,9 +52,10 @@
#define EBUFF_SZ 256
-static const char * version_str = "1.16 20180219";
+static const char * version_str = "1.17 20180515";
static struct option long_options[] = {
+ {"ck-cond", no_argument, 0, 'c'},
{"ck_cond", no_argument, 0, 'c'},
{"extend", no_argument, 0, 'e'},
{"help", no_argument, 0, 'h'},
@@ -392,7 +393,8 @@ int main(int argc, char * argv[])
bool o_readonly = false;
bool ck_cond = false; /* set to true to read register(s) back */
bool extend = false; /* set to true to send 48 bit LBA with command */
- int sg_fd, c, res;
+ int c, res;
+ int sg_fd = -1;
int cdb_len = SAT_ATA_PASS_THROUGH16_LEN;
int do_hex = 0;
int verbose = 0;
@@ -483,19 +485,29 @@ int main(int argc, char * argv[])
}
if ((sg_fd = sg_cmds_open_device(device_name, o_readonly, verbose)) < 0) {
- pr2serr("error opening file: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("error opening file: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
ret = do_identify_dev(sg_fd, do_packet, cdb_len, ck_cond, extend,
do_ident, do_hex, do_raw, verbose);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_sat_identify failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_sat_phy_event.c b/src/sg_sat_phy_event.c
index 0325c6f7..87b7ce54 100644
--- a/src/sg_sat_phy_event.c
+++ b/src/sg_sat_phy_event.c
@@ -25,7 +25,7 @@
#include "sg_cmds_extra.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.11 20180219";
+static const char * version_str = "1.12 20180515";
/* This program uses a ATA PASS-THROUGH SCSI command. This usage is
* defined in the SCSI to ATA Translation (SAT) drafts and standards.
@@ -62,6 +62,7 @@ static const char * version_str = "1.11 20180219";
static struct option long_options[] = {
{"ck_cond", no_argument, 0, 'c'},
+ {"ck-cond", no_argument, 0, 'c'},
{"extend", no_argument, 0, 'e'},
{"hex", no_argument, 0, 'H'},
{"ignore", no_argument, 0, 'i'},
diff --git a/src/sg_sat_read_gplog.c b/src/sg_sat_read_gplog.c
index 0dbaa0fa..17885479 100644
--- a/src/sg_sat_read_gplog.c
+++ b/src/sg_sat_read_gplog.c
@@ -52,7 +52,7 @@
#define DEF_TIMEOUT 20
-static const char * version_str = "1.18 20180219";
+static const char * version_str = "1.19 20180513";
struct opts_t {
bool ck_cond;
@@ -69,6 +69,7 @@ struct opts_t {
static struct option long_options[] = {
{"count", required_argument, 0, 'c'},
{"ck_cond", no_argument, 0, 'C'},
+ {"ck-cond", no_argument, 0, 'C'},
{"dma", no_argument, 0, 'd'},
{"help", no_argument, 0, 'h'},
{"hex", no_argument, 0, 'H'},
@@ -328,9 +329,11 @@ do_read_gplog(int sg_fd, int ata_cmd, uint8_t *inbuff,
int
main(int argc, char * argv[])
{
- int sg_fd, c, ret, res, n;
+ int c, ret, res, n;
+ int sg_fd = -1;
int ata_cmd = ATA_READ_LOG_EXT;
- uint8_t *inbuff;
+ uint8_t *inbuff = NULL;
+ uint8_t *free_inbuff = NULL;
struct opts_t opts;
struct opts_t * op;
@@ -431,7 +434,7 @@ main(int argc, char * argv[])
}
n = op->count * 512;
- inbuff = (uint8_t *)malloc(n);
+ inbuff = (uint8_t *)sg_memalign(n, 0, &free_inbuff, op->verbose > 3);
if (!inbuff) {
pr2serr("Cannot allocate output buffer of size %d\n", n);
return SG_LIB_CAT_OTHER;
@@ -439,21 +442,30 @@ main(int argc, char * argv[])
if ((sg_fd = sg_cmds_open_device(op->device_name, op->rdonly,
op->verbose)) < 0) {
- pr2serr("error opening file: %s: %s\n", op->device_name,
- safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ if (op->verbose)
+ pr2serr("error opening file: %s: %s\n", op->device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
goto fini;
}
ret = do_read_gplog(sg_fd, ata_cmd, inbuff, op);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
- }
fini:
- free(inbuff);
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_sat_read_gplog failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
+ if (free_inbuff)
+ free(free_inbuff);
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_sat_set_features.c b/src/sg_sat_set_features.c
index 523e38a4..dbcd8353 100644
--- a/src/sg_sat_set_features.c
+++ b/src/sg_sat_set_features.c
@@ -50,11 +50,12 @@
#define DEF_TIMEOUT 20
-static const char * version_str = "1.16 20180219";
+static const char * version_str = "1.17 20180513";
static struct option long_options[] = {
{"count", required_argument, 0, 'c'},
{"ck_cond", no_argument, 0, 'C'},
+ {"ck-cond", no_argument, 0, 'C'},
{"extended", no_argument, 0, 'e'},
{"feature", required_argument, 0, 'f'},
{"help", no_argument, 0, 'h'},
@@ -304,7 +305,8 @@ main(int argc, char * argv[])
bool ck_cond = false;
bool extend = false;
bool rdonly = false;
- int sg_fd, c, ret, res;
+ int c, ret, res;
+ int sg_fd = -1;
int count = 0;
int feature = 0;
int verbose = 0;
@@ -409,19 +411,29 @@ main(int argc, char * argv[])
}
if ((sg_fd = sg_cmds_open_device(device_name, rdonly, verbose)) < 0) {
- pr2serr("error opening file: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("error opening file: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
ret = do_set_features(sg_fd, feature, count, lba, cdb_len, ck_cond,
extend, verbose);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_sat_set_feature failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_seek.c b/src/sg_seek.c
index 55ef5f02..784770c7 100644
--- a/src/sg_seek.c
+++ b/src/sg_seek.c
@@ -47,7 +47,7 @@
* to that LBA ...
*/
-static const char * version_str = "1.03 20180304";
+static const char * version_str = "1.05 20180513";
#define BACKGROUND_CONTROL_SA 0x15
@@ -136,7 +136,8 @@ main(int argc, char * argv[])
bool prefetch = false;
bool readonly = false;
bool start_tm_valid = false;
- int sg_fd, res, c;
+ int res, c;
+ int sg_fd = -1;
int first_err = 0;
int last_err = 0;
int ret = 0;
@@ -283,9 +284,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s %s\n", device_name, cdb_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s %s\n", device_name, cdb_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
if (do_time) {
@@ -375,11 +378,19 @@ main(int argc, char * argv[])
printf(" code: %d\n", last_err);
}
}
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_seek failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_senddiag.c b/src/sg_senddiag.c
index 98f3e23f..410e1409 100644
--- a/src/sg_senddiag.c
+++ b/src/sg_senddiag.c
@@ -670,7 +670,8 @@ list_page_codes()
int
main(int argc, char * argv[])
{
- int sg_fd, k, num, rsp_len, res, rsp_buff_size, pg, bd_len, resid, vb;
+ int k, num, rsp_len, res, rsp_buff_size, pg, bd_len, resid, vb;
+ int sg_fd = -1;
int read_in_len = 0;
int ret = 0;
struct opts_t opts;
@@ -791,8 +792,9 @@ main(int argc, char * argv[])
if ((sg_fd = sg_cmds_open_device(op->device_name, false /* rw */, vb)) <
0) {
- pr2serr(ME "error opening file: %s: %s\n", op->device_name,
- safe_strerror(-sg_fd));
+ if (vb)
+ pr2serr(ME "error opening file: %s: %s\n", op->device_name,
+ safe_strerror(-sg_fd));
ret = sg_convert_errno(-sg_fd);
goto fini;
}
@@ -920,13 +922,20 @@ err_out9:
if (vb < 2)
pr2serr(" try again with '-vv' for more information\n");
close_fini:
- res = sg_cmds_close_device(sg_fd);
- if ((res < 0) && (0 == ret))
- ret = SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
fini:
if (free_read_in)
free(free_read_in);
if (free_rsp_buff)
free(free_rsp_buff);
+ if (0 == vb) {
+ if (! sg_if_can2stderr("sg_senddiag failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_ses.c b/src/sg_ses.c
index 15d76295..cd75bf58 100644
--- a/src/sg_ses.c
+++ b/src/sg_ses.c
@@ -36,7 +36,7 @@
* commands tailored for SES (enclosure) devices.
*/
-static const char * version_str = "2.37 20180502"; /* ses4r02 */
+static const char * version_str = "2.38 20180511"; /* ses4r02 */
#define MX_ALLOC_LEN ((64 * 1024) - 4) /* max allowable for big enclosures */
#define MX_ELEM_HDR 1024
@@ -558,7 +558,7 @@ static struct acronym2tuple ecs_a2t_arr[] = {
{"hotspare", ARRAY_DEV_ETC, 1, 5, 1, NULL},
{"hotswap", COOLING_ETC, 3, 7, 1, NULL},
{"hotswap", ENC_SCELECTR_ETC, 3, 7, 1, NULL}, /* status only */
- {"hw_reset", ENC_SCELECTR_ETC, 1, 2, 1, "hardware reset"}, /* 18-047r0 */
+ {"hw_reset", ENC_SCELECTR_ETC, 1, 2, 1, "hardware reset"}, /* 18-047r1 */
{"ident", DEVICE_ETC, 2, 1, 1, "flash LED"},
{"ident", ARRAY_DEV_ETC, 2, 1, 1, "flash LED"},
{"ident", POWER_SUPPLY_ETC, 1, 7, 1, "flash LED"},
@@ -670,7 +670,7 @@ static struct acronym2tuple ecs_a2t_arr[] = {
"0: leave; 1: lowest... 7: highest"},
{"size_mult", NV_CACHE_ETC, 1, 1, 2, NULL},
{"swap", -1, 0, 4, 1, NULL}, /* Reset swap */
- {"sw_reset", ENC_SCELECTR_ETC, 1, 3, 1, "software reset"},/* 18-047r0 */
+ {"sw_reset", ENC_SCELECTR_ETC, 1, 3, 1, "software reset"},/* 18-047r1 */
{"temp", TEMPERATURE_ETC, 2, 7, 8, "(Requested) temperature"},
{"unlock", DOOR_ETC, 3, 0, 1, NULL},
{"undertemp_fail", TEMPERATURE_ETC, 3, 1, 1, "Undertemperature failure"},
@@ -5617,10 +5617,11 @@ main(int argc, char * argv[])
if (op->dev_name) {
sg_fd = sg_cmds_open_device(op->dev_name, op->o_readonly, vb);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", op->dev_name,
- safe_strerror(-sg_fd));
+ if (vb)
+ pr2serr("open error: %s: %s\n", op->dev_name,
+ safe_strerror(-sg_fd));
ret = sg_convert_errno(-sg_fd);
- goto err_out;
+ goto early_out;
}
ptvp = construct_scsi_pt_obj_with_fd(sg_fd, vb);
if (NULL == ptvp) {
@@ -5830,10 +5831,6 @@ err_out:
sg_get_category_sense_str(ret, sizeof(b), b, vb);
pr2serr(" %s\n", b);
}
- if (sg_fd >= 0)
- res = sg_cmds_close_device(sg_fd);
- else
- res = 0;
if (free_enc_stat_rsp)
free(free_enc_stat_rsp);
if (free_elem_desc_rsp)
@@ -5842,12 +5839,16 @@ err_out:
free(free_add_elem_rsp);
if (free_threshold_rsp)
free(free_threshold_rsp);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
- }
+
early_out:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
if (ptvp)
destruct_scsi_pt_obj(ptvp);
if ((0 == vb) && (! op->quiet)) {
diff --git a/src/sg_ses_microcode.c b/src/sg_ses_microcode.c
index f503180e..f8ffccd2 100644
--- a/src/sg_ses_microcode.c
+++ b/src/sg_ses_microcode.c
@@ -41,7 +41,7 @@
* RESULTS commands in order to send microcode to the given SES device.
*/
-static const char * version_str = "1.13 20180219"; /* ses4r02 */
+static const char * version_str = "1.14 20180513"; /* ses4r02 */
#define ME "sg_ses_microcode: "
#define MAX_XFER_LEN (128 * 1024 * 1024)
@@ -480,7 +480,8 @@ main(int argc, char * argv[])
{
bool last, got_stdin, is_reg;
bool want_file = false;
- int sg_fd, res, c, len, k, n, rsp_len, resid, act_len, din_len, verb;
+ int res, c, len, k, n, rsp_len, resid, act_len, din_len, verb;
+ int sg_fd = -1;
int infd = -1;
int do_help = 0;
int ret = 0;
@@ -686,9 +687,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, op->verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (op->verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (file_name && (! want_file))
@@ -896,21 +899,18 @@ fini:
free(dout.free_doutp);
if (free_dip)
free(free_dip);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
}
- if (ret && (0 == op->verbose)) {
- if (SG_LIB_CAT_INVALID_OP == ret)
- pr2serr("%sRECEIVE DIAGNOSTIC RESULTS command not supported\n",
- ((MODE_DNLD_STATUS == op->mc_mode) ?
- "" : "SEND DIAGNOSTIC or "));
- else if (ret > 0)
- pr2serr("Failed, exit status %d\n", ret);
- else if (ret < 0)
- pr2serr("Some error occurred\n");
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_ses_mocrocode failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_start.c b/src/sg_start.c
index 8fee166e..28f22f20 100644
--- a/src/sg_start.c
+++ b/src/sg_start.c
@@ -34,7 +34,7 @@
#include "sg_pr2serr.h"
-static const char * version_str = "0.64 20180302"; /* sbc3r14; mmc6r01a */
+static const char * version_str = "0.65 20180513"; /* sbc3r14; mmc6r01a */
static struct option long_options[] = {
{"eject", no_argument, 0, 'e'},
@@ -71,7 +71,7 @@ struct opts_t {
int do_help;
int do_mod;
int do_pc;
- int do_verbose;
+ int verbose;
const char * device_name;
};
@@ -247,7 +247,7 @@ news_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
op->do_stop = true;
break;
case 'v':
- ++op->do_verbose;
+ ++op->verbose;
break;
case 'V':
op->do_version = true;
@@ -315,7 +315,7 @@ old_parse_cmd_line(struct opts_t * op, int argc, char * argv[])
op->do_readonly = true;
break;
case 'v':
- ++op->do_verbose;
+ ++op->verbose;
break;
case 'V':
op->do_version = true;
@@ -482,7 +482,8 @@ parse_cmd_line(struct opts_t * op, int argc, char * argv[])
int
main(int argc, char * argv[])
{
- int fd, res;
+ int res;
+ int sg_fd = -1;
int ret = 0;
struct opts_t opts;
struct opts_t * op;
@@ -545,39 +546,49 @@ main(int argc, char * argv[])
}
}
- fd = sg_cmds_open_device(op->device_name, op->do_readonly,
- op->do_verbose);
- if (fd < 0) {
- pr2serr("Error trying to open %s: %s\n", op->device_name,
- safe_strerror(-fd));
- return SG_LIB_FILE_ERROR;
+ sg_fd = sg_cmds_open_device(op->device_name, op->do_readonly,
+ op->verbose);
+ if (sg_fd < 0) {
+ if (op->verbose)
+ pr2serr("Error trying to open %s: %s\n", op->device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (op->do_fl >= 0)
- res = sg_ll_start_stop_unit(fd, op->do_immed, op->do_fl, 0 /* pc */,
+ res = sg_ll_start_stop_unit(sg_fd, op->do_immed, op->do_fl, 0 /* pc */,
true /* fl */, true /* loej */,
true /*start */, true /* noisy */,
- op->do_verbose);
+ op->verbose);
else if (op->do_pc > 0)
- res = sg_ll_start_stop_unit(fd, op->do_immed, op->do_mod,
+ res = sg_ll_start_stop_unit(sg_fd, op->do_immed, op->do_mod,
op->do_pc, op->do_noflush, false, false,
- true, op->do_verbose);
+ true, op->verbose);
else
- res = sg_ll_start_stop_unit(fd, op->do_immed, 0, false,
+ res = sg_ll_start_stop_unit(sg_fd, op->do_immed, 0, false,
op->do_noflush, op->do_loej,
- op->do_start, true, op->do_verbose);
+ op->do_start, true, op->verbose);
ret = res;
if (res) {
- if (op->do_verbose < 2) {
+ if (op->verbose < 2) {
char b[80];
- sg_get_category_sense_str(res, sizeof(b), b, op->do_verbose);
+ sg_get_category_sense_str(res, sizeof(b), b, op->verbose);
pr2serr("%s\n", b);
}
pr2serr("START STOP UNIT command failed\n");
}
- res = sg_cmds_close_device(fd);
- if ((res < 0) && (0 == ret))
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_start failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_stpg.c b/src/sg_stpg.c
index b25339eb..c5e6b466 100644
--- a/src/sg_stpg.c
+++ b/src/sg_stpg.c
@@ -32,7 +32,7 @@
* to the given SCSI device.
*/
-static const char * version_str = "1.16 20180219";
+static const char * version_str = "1.17 20180513";
#define TGT_GRP_BUFF_LEN 1024
#define MX_ALLOC_LEN (0xc000 + 0x80)
@@ -415,7 +415,8 @@ main(int argc, char * argv[])
{
bool hex = false;
bool raw = false;
- int sg_fd, k, off, res, c, report_len, tgt_port_count;
+ int k, off, res, c, report_len, tgt_port_count;
+ int sg_fd = -1;
int port_arr_len = 0;
int verbose = 0;
uint8_t reportTgtGrpBuff[TGT_GRP_BUFF_LEN];
@@ -561,8 +562,11 @@ main(int argc, char * argv[])
}
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
if (0 == port_arr_len) {
@@ -683,11 +687,18 @@ main(int argc, char * argv[])
}
err_out:
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_stpg failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_stream_ctl.c b/src/sg_stream_ctl.c
index f2372ed7..794bf254 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.03 20180427";
+static const char * version_str = "1.04 20180513";
#define STREAM_CONTROL_SA 0x14
#define GET_STREAM_STATUS_SA 0x16
@@ -242,7 +242,8 @@ main(int argc, char * argv[])
bool ctl_given = false;
bool maxlen_given = false;
bool read_only = false;
- int c, k, sg_fd, res, resid;
+ int c, k, res, resid;
+ int sg_fd = -1;
int maxlen = 0;
int ret = 0;
int verbose = 0;
@@ -253,8 +254,8 @@ main(int argc, char * argv[])
uint32_t param_dl;
const char * device_name = NULL;
const char * cmd_name = NULL;
- uint8_t * arr;
- uint8_t * free_arr;
+ uint8_t * arr = NULL;
+ uint8_t * free_arr = NULL;
while (1) {
int option_index = 0;
@@ -367,9 +368,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, read_only, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (maxlen > (int)pg_sz)
@@ -464,11 +467,18 @@ main(int argc, char * argv[])
fini:
if (free_arr)
free(free_arr);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_stream_ctl failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_sync.c b/src/sg_sync.c
index 59cf8276..23a26d5b 100644
--- a/src/sg_sync.c
+++ b/src/sg_sync.c
@@ -35,7 +35,7 @@
* (e.g. disks).
*/
-static const char * version_str = "1.20 20180219";
+static const char * version_str = "1.21 20180514";
#define SYNCHRONIZE_CACHE16_CMD 0x91
#define SYNCHRONIZE_CACHE16_CMDLEN 16
@@ -152,7 +152,8 @@ int main(int argc, char * argv[])
bool do_16 = false;
bool immed = false;
bool sync_nv = false;
- int sg_fd, res, c;
+ int res, c;
+ int sg_fd = -1;
int group = 0;
int ret = 0;
int to_secs = DEF_PT_TIMEOUT;
@@ -245,9 +246,11 @@ int main(int argc, char * argv[])
}
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (do_16)
@@ -264,11 +267,19 @@ int main(int argc, char * argv[])
pr2serr("Synchronize cache failed: %s\n", b);
}
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_sync failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_timestamp.c b/src/sg_timestamp.c
index 976bca56..2049052c 100644
--- a/src/sg_timestamp.c
+++ b/src/sg_timestamp.c
@@ -316,7 +316,8 @@ main(int argc, char * argv[])
bool no_timestamp = false;
bool readonly = false;
bool secs_given = false;
- int sg_fd, res, c;
+ int res, c;
+ int sg_fd = 1;
int elapsed = 0;
int do_origin = 0;
int do_help = 0;
@@ -427,9 +428,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
memset(d_buff, 0, 12);
@@ -495,11 +498,19 @@ main(int argc, char * argv[])
}
}
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_timestamp failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_unmap.c b/src/sg_unmap.c
index 7b1bf424..32295e0a 100644
--- a/src/sg_unmap.c
+++ b/src/sg_unmap.c
@@ -44,7 +44,7 @@
* logical blocks. Note that DATA MAY BE LOST.
*/
-static const char * version_str = "1.14 20180330";
+static const char * version_str = "1.15 20180514";
#define DEF_TIMEOUT_SECS 60
@@ -771,18 +771,18 @@ retry:
}
err_out:
- if ((0 == vb) && (! err_printed)) {
- if (! sg_if_can2stderr("sg_unmap failed: ", ret))
- pr2serr("Some error occurred, try again with '-v' or '-vv' for "
- "more information\n");
- }
if (sg_fd >= 0) {
res = sg_cmds_close_device(sg_fd);
if (res < 0) {
pr2serr("close error: %s\n", safe_strerror(-res));
if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(-res);
}
}
+ if ((0 == vb) && (! err_printed)) {
+ if (! sg_if_can2stderr("sg_unmap failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' or '-vv' for "
+ "more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_verify.c b/src/sg_verify.c
index 5defc175..34954d65 100644
--- a/src/sg_verify.c
+++ b/src/sg_verify.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.
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdbool.h>
+#include <errno.h>
#include <string.h>
#include <getopt.h>
#define __STDC_FORMAT_MACROS 1
@@ -36,7 +37,7 @@
* the possibility of protection data (DIF).
*/
-static const char * version_str = "1.23 20171012"; /* sbc4r01 */
+static const char * version_str = "1.23 20180515"; /* sbc4r01 */
#define ME "sg_verify: "
@@ -131,7 +132,8 @@ main(int argc, char * argv[])
bool quiet = false;
bool readonly = false;
bool verify16 = false;
- int sg_fd, res, c, num, nread, infd;
+ int res, c, num, nread, infd;
+ int sg_fd = -1;
int bpc = 128;
int group = 0;
int bytchk = 0;
@@ -146,7 +148,8 @@ main(int argc, char * argv[])
uint64_t info64 = 0;
uint64_t lba = 0;
uint64_t orig_lba;
- char *ref_data = NULL;
+ uint8_t * ref_data = NULL;
+ uint8_t * free_ref_data = NULL;
const char * device_name = NULL;
const char * file_name = NULL;
const char * vc;
@@ -299,10 +302,11 @@ main(int argc, char * argv[])
orig_lba = lba;
if (ndo > 0) {
- ref_data = (char *)malloc(ndo);
+ ref_data = (uint8_t *)sg_memalign(ndo, 0, &free_ref_data, verbose > 4);
if (NULL == ref_data) {
pr2serr("failed to allocate %d byte buffer\n", ndo);
- return SG_LIB_FILE_ERROR;
+ ret = sg_convert_errno(ENOMEM);
+ goto err_out;
}
if ((NULL == file_name) || (0 == strcmp(file_name, "-"))) {
got_stdin = true;
@@ -342,8 +346,10 @@ main(int argc, char * argv[])
}
sg_fd = sg_cmds_open_device(device_name, readonly, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- ret = SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
goto err_out;
}
@@ -399,15 +405,21 @@ main(int argc, char * argv[])
" [0x%" PRIx64 "]\n without error\n", orig_count,
(uint64_t)orig_count, orig_lba, orig_lba);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
- }
-
err_out:
- if (ref_data)
- free(ref_data);
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (free_ref_data)
+ free(free_ref_data);
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_verify failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
+ }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_wr_mode.c b/src/sg_wr_mode.c
index c6ebf13a..425b3a41 100644
--- a/src/sg_wr_mode.c
+++ b/src/sg_wr_mode.c
@@ -320,8 +320,9 @@ int main(int argc, char * argv[])
bool mode_6 = false; /* so default is mode_10 */
bool rtd = false; /* added in spc5r11 */
bool save = false;
- int sg_fd, res, c, num, alloc_len, off, pdt;
- int k, md_len, hdr_len, bd_len, mask_in_len;
+ int res, c, num, alloc_len, off, pdt, k, md_len, hdr_len, bd_len;
+ int mask_in_len;
+ int sg_fd = -1;
int pg_code = -1;
int sub_pg_code = 0;
int verbose = 0;
@@ -457,8 +458,11 @@ int main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (rtd)
goto revert_to_defaults;
@@ -595,11 +599,13 @@ revert_to_defaults:
save, NULL, 0, true, verbose);
ret = res;
fini:
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = SG_LIB_FILE_ERROR;
+ }
}
if (0 == verbose) {
if (! sg_if_can2stderr("sg_wr_mode failed: ", ret))
diff --git a/src/sg_write_buffer.c b/src/sg_write_buffer.c
index e50d7a4d..4591c1a4 100644
--- a/src/sg_write_buffer.c
+++ b/src/sg_write_buffer.c
@@ -13,6 +13,7 @@
#include <stdint.h>
#include <stdbool.h>
#include <ctype.h>
+#include <errno.h>
#include <string.h>
#include <getopt.h>
#define __STDC_FORMAT_MACROS 1
@@ -37,7 +38,7 @@
* This utility issues the SCSI WRITE BUFFER command to the given device.
*/
-static const char * version_str = "1.25 20180217"; /* spc5r19 */
+static const char * version_str = "1.26 20180515"; /* spc5r19 */
#define ME "sg_write_buffer: "
#define DEF_XFER_LEN (8 * 1024 * 1024)
@@ -193,7 +194,8 @@ main(int argc, char * argv[])
bool dry_run = false;
bool got_stdin = false;
bool wb_len_given = false;
- int sg_fd, infd, res, c, len, k, n;
+ int infd, res, c, len, k, n;
+ int sg_fd = -1;
int bpw = 0;
int do_help = 0;
int ret = 0;
@@ -369,9 +371,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name,
- safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
if (file_name || (wb_len > 0)) {
if (0 == wb_len)
@@ -379,7 +383,7 @@ main(int argc, char * argv[])
dop = sg_memalign(wb_len, 0, &free_dop, false);
if (NULL == dop) {
pr2serr(ME "out of memory\n");
- ret = SG_LIB_SYNTAX_ERROR;
+ ret = sg_convert_errno(ENOMEM);
goto err_out;
}
memset(dop, 0xff, wb_len);
@@ -509,11 +513,18 @@ main(int argc, char * argv[])
err_out:
if (free_dop)
free(free_dop);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_write_buffer failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_write_long.c b/src/sg_write_long.c
index b6f9e694..0080343b 100644
--- a/src/sg_write_long.c
+++ b/src/sg_write_long.c
@@ -35,7 +35,7 @@
#include "sg_cmds_extra.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.17 20180502";
+static const char * version_str = "1.18 20180515";
#define MAX_XFER_LEN (15 * 1024)
@@ -105,7 +105,8 @@ main(int argc, char * argv[])
bool got_stdin;
bool pblock = false;
bool wr_uncor = false;
- int sg_fd, res, c, infd, offset;
+ int res, c, infd, offset;
+ int sg_fd = -1;
int xfer_len = 520;
int ret = 1;
int verbose = 0;
@@ -204,8 +205,11 @@ main(int argc, char * argv[])
}
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
if (wr_uncor) {
@@ -285,11 +289,18 @@ main(int argc, char * argv[])
err_out:
if (free_rawp)
free(free_rawp);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_write_long failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_write_same.c b/src/sg_write_same.c
index 2d6d241a..a8060de0 100644
--- a/src/sg_write_same.c
+++ b/src/sg_write_same.c
@@ -31,7 +31,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.22 20180425";
+static const char * version_str = "1.23 20180515";
#define ME "sg_write_same: "
@@ -150,7 +150,8 @@ usage()
"specified blocks\nwill be filled with zeros or the "
"'provisioning initialization pattern'\nas indicated by the "
"LBPRZ field. As a precaution one of the '--in=',\n'--lba=' or "
- "'--num=' options is required.\n"
+ "'--num=' options is required.\nAnother implementation of WRITE "
+ "SAME is found in the sg_write_x utility.\n"
);
}
@@ -310,7 +311,8 @@ main(int argc, char * argv[])
bool lba_given = false;
bool num_given = false;
bool prot_en;
- int sg_fd, res, c, infd, act_cdb_len, vb;
+ int res, c, infd, act_cdb_len, vb;
+ int sg_fd = -1;
int ret = -1;
uint32_t block_size;
int64_t ll;
@@ -491,8 +493,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, vb);
if (sg_fd < 0) {
- pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd));
- return SG_LIB_FILE_ERROR;
+ if (op->verbose)
+ pr2serr(ME "open error: %s: %s\n", device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto err_out;
}
if (! op->ndob) {
@@ -613,11 +618,18 @@ main(int argc, char * argv[])
err_out:
if (free_wBuff)
free(free_wBuff);
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- return SG_LIB_FILE_ERROR;
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
+ if (0 == op->verbose) {
+ if (! sg_if_can2stderr("sg_write_same failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' "
+ "or '-vv' for more information\n");
}
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_write_x.c b/src/sg_write_x.c
index 3311ad0d..6467319b 100644
--- a/src/sg_write_x.c
+++ b/src/sg_write_x.c
@@ -36,7 +36,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.16 20180425";
+static const char * version_str = "1.17 20180515";
/* Protection Information refers to 8 bytes of extra information usually
* associated with each logical block and is often abbreviated to PI while
@@ -2370,9 +2370,11 @@ main(int argc, char * argv[])
/* Open device file, do READ CAPACITY(16, maybe 10) if no BS */
sg_fd = sg_cmds_open_device(op->device_name, false /* rw */, vb);
if (sg_fd < 0) {
- pr2serr("open error: %s: %s\n", op->device_name,
- safe_strerror(-sg_fd));
- goto file_err_out;
+ if (op->verbose)
+ pr2serr("open error: %s: %s\n", op->device_name,
+ safe_strerror(-sg_fd));
+ ret = sg_convert_errno(-sg_fd);
+ goto fini;
}
if (0 == op->bs) { /* ask DEVICE about logical/actual block size */
ret = do_read_capacity(sg_fd, op);
diff --git a/src/sg_xcopy.c b/src/sg_xcopy.c
index c114e860..08602809 100644
--- a/src/sg_xcopy.c
+++ b/src/sg_xcopy.c
@@ -338,13 +338,13 @@ open_sg(struct xcopy_fp_t * fp, int vb)
fp->sg_type & FT_BLOCK ? "block" : "char",
devmajor, devminor);
perror(ebuff);
- return -1;
+ return -sg_convert_errno(-fp->sg_fd);
}
if (sg_simple_inquiry(fp->sg_fd, &sir, false, vb)) {
pr2serr("INQUIRY failed on %s\n", ebuff);
sg_cmds_close_device(fp->sg_fd);
fp->sg_fd = -1;
- return -2;
+ return -1;
}
fp->pdt = sir.peripheral_type;
@@ -1716,22 +1716,25 @@ main(int argc, char * argv[])
pr2serr("Unit attention (%s), continuing\n",
rec_copy_op_params_str);
res = scsi_operating_parameter(&ixcf, 0);
- } else {
- if (-res == SG_LIB_CAT_INVALID_OP) {
- pr2serr("%s command not supported on %s\n",
- rec_copy_op_params_str, ixcf.fname);
- return EINVAL;
- } else if (-res == SG_LIB_CAT_NOT_READY)
- pr2serr("%s failed on %s - not ready\n",
- rec_copy_op_params_str, ixcf.fname);
- else {
- pr2serr("Unable to %s on %s\n", rec_copy_op_params_str,
- ixcf.fname);
- return -res;
- }
}
- } else if (res == 0)
- return SG_LIB_CAT_INVALID_OP;
+ if (-res == SG_LIB_CAT_INVALID_OP) {
+ pr2serr("%s command not supported on %s\n",
+ rec_copy_op_params_str, ixcf.fname);
+ ret = sg_convert_errno(EINVAL);
+ goto fini;
+ } else if (-res == SG_LIB_CAT_NOT_READY)
+ pr2serr("%s failed on %s - not ready\n",
+ rec_copy_op_params_str, ixcf.fname);
+ else {
+ pr2serr("Unable to %s on %s\n", rec_copy_op_params_str,
+ ixcf.fname);
+ ret = -res;
+ goto fini;
+ }
+ } else if (res == 0) {
+ ret = SG_LIB_CAT_INVALID_OP;
+ goto fini;
+ }
if (res & TD_VPD) {
if (verbose)
@@ -1741,10 +1744,12 @@ main(int argc, char * argv[])
sizeof(src_desc), ixcf.sect_sz, ixcf.pad);
if (src_desc_len > (int)sizeof(src_desc)) {
pr2serr("source descriptor too large (%d bytes)\n", res);
- return SG_LIB_CAT_MALFORMED;
+ ret = SG_LIB_CAT_MALFORMED;
+ goto fini;
}
} else {
- return SG_LIB_CAT_INVALID_OP;
+ ret = SG_LIB_CAT_INVALID_OP;
+ goto fini;
}
res = scsi_operating_parameter(&oxcf, 1);
@@ -1753,22 +1758,25 @@ main(int argc, char * argv[])
pr2serr("Unit attention (%s), continuing\n",
rec_copy_op_params_str);
res = scsi_operating_parameter(&oxcf, 1);
- } else {
- if (-res == SG_LIB_CAT_INVALID_OP) {
- pr2serr("%s command not supported on %s\n",
- rec_copy_op_params_str, oxcf.fname);
- return EINVAL;
- } else if (-res == SG_LIB_CAT_NOT_READY)
- pr2serr("%s failed on %s - not ready\n",
- rec_copy_op_params_str, oxcf.fname);
- else {
- pr2serr("Unable to %s on %s\n", rec_copy_op_params_str,
- oxcf.fname);
- return -res;
- }
}
- } else if (res == 0)
- return SG_LIB_CAT_INVALID_OP;
+ if (-res == SG_LIB_CAT_INVALID_OP) {
+ pr2serr("%s command not supported on %s\n",
+ rec_copy_op_params_str, oxcf.fname);
+ ret = sg_convert_errno(EINVAL);
+ goto fini;
+ } else if (-res == SG_LIB_CAT_NOT_READY)
+ pr2serr("%s failed on %s - not ready\n",
+ rec_copy_op_params_str, oxcf.fname);
+ else {
+ pr2serr("Unable to %s on %s\n", rec_copy_op_params_str,
+ oxcf.fname);
+ ret = -res;
+ goto fini;
+ }
+ } else if (res == 0) {
+ ret = SG_LIB_CAT_INVALID_OP;
+ goto fini;
+ }
if (res & TD_VPD) {
if (verbose)
@@ -1778,10 +1786,12 @@ main(int argc, char * argv[])
sizeof(dst_desc), oxcf.sect_sz, oxcf.pad);
if (dst_desc_len > (int)sizeof(dst_desc)) {
pr2serr("destination descriptor too large (%d bytes)\n", res);
- return SG_LIB_CAT_MALFORMED;
+ ret = SG_LIB_CAT_MALFORMED;
+ goto fini;
}
} else {
- return SG_LIB_CAT_INVALID_OP;
+ ret = SG_LIB_CAT_INVALID_OP;
+ goto fini;
}
if (dd_count < 0) {
@@ -1865,6 +1875,14 @@ main(int argc, char * argv[])
else
pr2serr("sg_xcopy: %" PRId64 " blocks, %d command%s\n", in_full,
num_xcopy, ((num_xcopy > 1) ? "s" : ""));
+ ret = res;
- return res;
+fini:
+ /* file handles not explicity closed; let process cleanup do that */
+ if (0 == verbose) {
+ if (! sg_if_can2stderr("sg_xcopy failed: ", ret))
+ pr2serr("Some error occurred, try again with '-v' or '-vv' for "
+ "more information\n");
+ }
+ return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}
diff --git a/src/sg_zone.c b/src/sg_zone.c
index 7b2c616a..77c409c0 100644
--- a/src/sg_zone.c
+++ b/src/sg_zone.c
@@ -35,7 +35,7 @@
* to the given SCSI device. Based on zbc-r04c.pdf .
*/
-static const char * version_str = "1.08 20180504";
+static const char * version_str = "1.09 20180515";
#define SG_ZONING_OUT_CMDLEN 16
#define CLOSE_ZONE_SA 0x1
@@ -169,7 +169,8 @@ main(int argc, char * argv[])
bool finish = false;
bool open = false;
bool sequentialize = false;
- int sg_fd, res, c, n;
+ int res, c, n;
+ int sg_fd = -1;
int verbose = 0;
int ret = 0;
int sa = 0;
@@ -272,9 +273,11 @@ main(int argc, char * argv[])
sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose);
if (sg_fd < 0) {
int err = -sg_fd;
- pr2serr("open error: %s: %s\n", device_name,
- safe_strerror(err));
- return sg_convert_errno(err);
+ if (verbose)
+ pr2serr("open error: %s: %s\n", device_name,
+ safe_strerror(err));
+ ret = sg_convert_errno(err);
+ goto fini;
}
res = sg_ll_zone_out(sg_fd, sa, zid, zc, all, true, verbose);
@@ -290,16 +293,19 @@ main(int argc, char * argv[])
}
}
+fini:
+ if (sg_fd >= 0) {
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ pr2serr("close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ ret = sg_convert_errno(-res);
+ }
+ }
if (0 == verbose) {
if (! sg_if_can2stderr("sg_zone failed: ", ret))
pr2serr("Some error occurred, try again with '-v' or '-vv' for "
"more information\n");
}
- res = sg_cmds_close_device(sg_fd);
- if (res < 0) {
- pr2serr("close error: %s\n", safe_strerror(-res));
- if (0 == ret)
- ret = sg_convert_errno(-res);
- }
return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}