aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2021-08-30 21:15:57 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2021-08-30 21:15:57 +0000
commitd4485d5b472462f2ee34bb18f1cef77d2c883b8e (patch)
tree6a3709bf6a6ef5ed2895c24c852281f3b3ee0580 /lib
parent5fbd329cbcb0078fc787467703a2581935405b7e (diff)
downloadsg3_utils-d4485d5b472462f2ee34bb18f1cef77d2c883b8e.tar.gz
improve transport error handling. To fix report of a BAD_TARGET transport error but the utility still continued. introduce SG_LIB_TRANSPORT_ERROR [35] exit status
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@910 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib')
-rw-r--r--lib/sg_cmds_basic.c38
-rw-r--r--lib/sg_cmds_basic2.c101
-rw-r--r--lib/sg_cmds_extra.c272
-rw-r--r--lib/sg_cmds_mmc.c36
-rw-r--r--lib/sg_io_linux.c11
-rw-r--r--lib/sg_lib.c18
-rw-r--r--lib/sg_lib_data.c20
-rw-r--r--lib/sg_pt_linux.c5
8 files changed, 327 insertions, 174 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
index 899caae1..844018c3 100644
--- a/lib/sg_cmds_basic.c
+++ b/lib/sg_cmds_basic.c
@@ -42,7 +42,7 @@
#endif
-static const char * const version_str = "1.98 20210601";
+static const char * const version_str = "1.99 20210830";
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -434,9 +434,12 @@ sg_ll_inquiry_com(struct sg_pt_base * ptvp, int sg_fd, bool cmddt, bool evpd,
resid = get_scsi_pt_resid(ptvp);
if (residp)
*residp = resid;
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -653,9 +656,12 @@ sg_ll_test_unit_ready_com(struct sg_pt_base * ptvp, int sg_fd, int pack_id,
set_scsi_pt_packet_id(ptvp, pack_id);
res = do_scsi_pt(ptvp, -1, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, tur_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
if (progress) {
int slen = get_scsi_pt_sense_len(ptvp);
@@ -768,9 +774,12 @@ sg_ll_request_sense_com(struct sg_pt_base * ptvp, int sg_fd, bool desc,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, -1, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, rq_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -860,9 +869,12 @@ sg_ll_report_luns_com(struct sg_pt_base * ptvp, int sg_fd, int select_report,
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, report_luns_s, res, noisy, verbose,
&sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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/lib/sg_cmds_basic2.c b/lib/sg_cmds_basic2.c
index ba06920e..06bbda62 100644
--- a/lib/sg_cmds_basic2.c
+++ b/lib/sg_cmds_basic2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2020 Douglas Gilbert.
+ * Copyright (c) 1999-2021 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.
@@ -121,9 +121,12 @@ sg_ll_sync_cache_10(int sg_fd, bool sync_nv, bool immed, int group,
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -174,9 +177,12 @@ sg_ll_readcap_16(int sg_fd, bool pmi, uint64_t llba, void * resp,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -224,9 +230,12 @@ sg_ll_readcap_10(int sg_fd, bool pmi, unsigned int lba, void * resp,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -279,9 +288,12 @@ sg_ll_mode_sense6(int sg_fd, bool dbd, int pc, int pg_code, int sub_pg_code,
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
resid = get_scsi_pt_resid(ptvp);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -379,9 +391,12 @@ sg_ll_mode_sense10_v2(int sg_fd, bool llbaa, bool dbd, int pc, int pg_code,
resid = get_scsi_pt_resid(ptvp);
if (residp)
*residp = resid;
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -463,9 +478,12 @@ sg_ll_mode_select6_v2(int sg_fd, bool pf, bool rtd, bool sp, void * paramp,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -531,9 +549,12 @@ sg_ll_mode_select10_v2(int sg_fd, bool pf, bool rtd, bool sp, void * paramp,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -829,9 +850,12 @@ sg_ll_log_sense_v2(int sg_fd, bool ppc, bool sp, int pc, int pg_code,
resid = get_scsi_pt_resid(ptvp);
if (residp)
*residp = resid;
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -908,9 +932,12 @@ sg_ll_log_select(int sg_fd, bool pcr, bool sp, int pc, int pg_code,
set_scsi_pt_data_out(ptvp, paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -985,9 +1012,12 @@ sg_ll_start_stop_unit_com(struct sg_pt_base * ptvp, int sg_fd, bool immed,
}
res = do_scsi_pt(ptvp, -1, START_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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:
@@ -1065,9 +1095,12 @@ sg_ll_prevent_allow(int sg_fd, int prevent, bool noisy, int verbose)
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ 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/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c
index e55e8075..cbcc8444 100644
--- a/lib/sg_cmds_extra.c
+++ b/lib/sg_cmds_extra.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2020 Douglas Gilbert.
+ * Copyright (c) 1999-2021 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.
@@ -150,9 +150,12 @@ sg_ll_get_lba_status16(int sg_fd, uint64_t start_llba, uint8_t rt,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, alloc_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -226,9 +229,12 @@ sg_ll_get_lba_status32(int sg_fd, uint64_t start_llba, uint32_t scan_len,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, alloc_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -296,9 +302,12 @@ sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -360,9 +369,12 @@ sg_ll_set_tgt_prt_grp(int sg_fd, void * paramp, int param_len, bool noisy,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -412,9 +424,12 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, bool one_seg,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -512,9 +527,12 @@ sg_ll_send_diag_com(struct sg_pt_base * ptvp, int sg_fd, int st_code,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, -1, tmout, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -616,9 +634,12 @@ sg_ll_receive_diag_com(struct sg_pt_base * ptvp, int sg_fd, bool pcv,
resid = get_scsi_pt_resid(ptvp);
if (residp)
*residp = resid;
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -722,9 +743,12 @@ sg_ll_read_defect10(int sg_fd, bool req_plist, bool req_glist, int dl_format,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -782,9 +806,12 @@ sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -845,9 +872,12 @@ sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, max_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -911,9 +941,12 @@ sg_ll_set_id_info(int sg_fd, int itype, void * paramp, int param_len,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1004,9 +1037,12 @@ sg_ll_format_unit_v2(int sg_fd, int fmtpinfo, bool longlist, bool fmtdata,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, tmout, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1059,9 +1095,12 @@ sg_ll_reassign_blocks(int sg_fd, bool longlba, bool longlist, void * paramp,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1111,9 +1150,12 @@ sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1180,9 +1222,12 @@ sg_ll_persistent_reserve_out(int sg_fd, int rq_servact, int rq_scope,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1256,9 +1301,12 @@ sg_ll_read_long10(int sg_fd, bool pblock, bool correct, unsigned int lba,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, xfer_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1346,9 +1394,12 @@ sg_ll_read_long16(int sg_fd, bool pblock, bool correct, uint64_t llba,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, xfer_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1437,9 +1488,12 @@ sg_ll_write_long10(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock,
set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, xfer_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1517,9 +1571,12 @@ sg_ll_write_long16(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock,
set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, xfer_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1602,9 +1659,12 @@ sg_ll_verify10(int sg_fd, int vrprotect, bool dpo, int bytchk,
set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, data_out_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1681,9 +1741,12 @@ sg_ll_verify16(int sg_fd, int vrprotect, bool dpo, int bytchk, uint64_t llba,
set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, data_out_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1921,9 +1984,12 @@ sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -1994,9 +2060,12 @@ sg_ll_write_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2071,9 +2140,12 @@ sg_ll_write_buffer_v2(int sg_fd, int mode, int m_specific, int buffer_id,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, timeout_secs, vb);
ret = sg_cmds_process_resp(ptvp, "Write buffer", res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2137,9 +2209,12 @@ sg_ll_unmap_v2(int sg_fd, bool anchor, int group_num, int timeout_secs,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, tmout, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2183,9 +2258,12 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2250,9 +2328,12 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, b, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2309,9 +2390,12 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, bool noisy,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2386,9 +2470,12 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, tmout, vb);
ret = sg_cmds_process_resp(ptvp, cname, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
@@ -2490,9 +2577,12 @@ sg_ll_pre_fetch_x(int sg_fd, bool do_seek10, bool cdb16, bool immed,
}
}
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (s_cat) {
case SG_LIB_CAT_RECOVERED:
case SG_LIB_CAT_NO_SENSE:
diff --git a/lib/sg_cmds_mmc.c b/lib/sg_cmds_mmc.c
index c1dabd74..e3629559 100644
--- a/lib/sg_cmds_mmc.c
+++ b/lib/sg_cmds_mmc.c
@@ -84,9 +84,12 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed,
set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b));
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_NOT_READY:
case SG_LIB_CAT_UNIT_ATTENTION:
@@ -157,9 +160,12 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_INVALID_OP:
case SG_LIB_CAT_ILLEGAL_REQ:
@@ -250,9 +256,12 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba,
set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_INVALID_OP:
case SG_LIB_CAT_ILLEGAL_REQ:
@@ -332,9 +341,12 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len,
set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len);
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat);
- if (-1 == ret)
- ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
- else if (-2 == ret) {
+ if (-1 == ret) {
+ if (get_scsi_pt_transport_err(ptvp))
+ ret = SG_LIB_TRANSPORT_ERROR;
+ else
+ ret = sg_convert_errno(get_scsi_pt_os_err(ptvp));
+ } else if (-2 == ret) {
switch (sense_cat) {
case SG_LIB_CAT_NOT_READY:
case SG_LIB_CAT_INVALID_OP:
diff --git a/lib/sg_io_linux.c b/lib/sg_io_linux.c
index 25ccb47d..9bd4b7eb 100644
--- a/lib/sg_io_linux.c
+++ b/lib/sg_io_linux.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999-2020 Douglas Gilbert.
+ * Copyright (c) 1999-2021 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.
@@ -24,7 +24,7 @@
#include "sg_pr2serr.h"
-/* Version 1.11 20200401 */
+/* Version 1.12 20210830 */
void
@@ -43,7 +43,7 @@ static const char * linux_host_bytes[] = {
"DID_RESET", "DID_BAD_INTR", "DID_PASSTHROUGH", "DID_SOFT_ERROR",
"DID_IMM_RETRY", "DID_REQUEUE", "DID_TRANSPORT_DISRUPTED",
"DID_TRANSPORT_FAILFAST", "DID_TARGET_FAILURE", "DID_NEXUS_FAILURE",
- "DID_ALLOC_FAILURE", "DID_MEDIUM_ERROR",
+ "DID_ALLOC_FAILURE", "DID_MEDIUM_ERROR", "DID_TRANSPORT_MARGINAL",
};
void
@@ -57,8 +57,9 @@ sg_print_host_status(int host_status)
pr2ws("[%s] ", linux_host_bytes[host_status]);
}
-/* DRIVER_* are Linux SCSI result (a 32 bit variable) bits 24:27 */
-
+/* DRIVER_* are Linux SCSI result (a 32 bit variable) bits 24:27 .
+ * These where made obsolete around lk 5.12.0 . Only DRIVER_SENSE [0x8] is
+ * defined in scsi/sg.h for backward comaptibility */
static const char * linux_driver_bytes[] = {
"DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA",
"DRIVER_ERROR", "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD",
diff --git a/lib/sg_lib.c b/lib/sg_lib.c
index c5eeeddc..02102a1c 100644
--- a/lib/sg_lib.c
+++ b/lib/sg_lib.c
@@ -245,22 +245,6 @@ sg_print_command(const uint8_t * cdbp)
sg_print_command_len(cdbp, 0);
}
-/* SCSI Status values */
-static const struct sg_lib_simple_value_name_t sstatus_str_arr[] = {
- {0x0, "Good"},
- {0x2, "Check Condition"},
- {0x4, "Condition Met"},
- {0x8, "Busy"},
- {0x10, "Intermediate (obsolete)"},
- {0x14, "Intermediate-Condition Met (obsolete)"},
- {0x18, "Reservation Conflict"},
- {0x22, "Command terminated (obsolete)"},
- {0x28, "Task Set Full"},
- {0x30, "ACA Active"},
- {0x40, "Task Aborted"},
- {0xffff, NULL},
-};
-
bool
sg_scsi_status_is_good(int sstatus)
{
@@ -299,7 +283,7 @@ sg_get_scsi_status_str(int scsi_status, int buff_len, char * buff)
return;
}
scsi_status &= 0x7e; /* sanitize as much as possible */
- for (sstatus_p = sstatus_str_arr; sstatus_p->name; ++sstatus_p) {
+ for (sstatus_p = sg_lib_sstatus_str_arr; sstatus_p->name; ++sstatus_p) {
if (scsi_status == sstatus_p->value)
break;
}
diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c
index ff89ac79..a132d1cb 100644
--- a/lib/sg_lib_data.c
+++ b/lib/sg_lib_data.c
@@ -19,7 +19,7 @@
#include "sg_lib_data.h"
-const char * sg_lib_version_str = "2.81 20210526";
+const char * sg_lib_version_str = "2.82 20210830";
/* spc6r05, sbc5r01, zbc2r10 */
@@ -34,6 +34,22 @@ int sg_lib_pdt_decay_arr[32] = {
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, PDT_WLUN, PDT_UNKNOWN
};
+/* SCSI Status values */
+struct sg_lib_simple_value_name_t sg_lib_sstatus_str_arr[] = {
+ {0x0, "Good"},
+ {0x2, "Check Condition"},
+ {0x4, "Condition Met"},
+ {0x8, "Busy"},
+ {0x10, "Intermediate (obsolete)"},
+ {0x14, "Intermediate-Condition Met (obsolete)"},
+ {0x18, "Reservation Conflict"},
+ {0x22, "Command terminated (obsolete)"},
+ {0x28, "Task Set Full"},
+ {0x30, "ACA Active"},
+ {0x40, "Task Aborted"},
+ {0xffff, NULL},
+};
+
#ifdef SG_SCSI_STRINGS
struct sg_lib_value_name_t sg_lib_normal_opcodes[] = {
{0, 0, "Test Unit Ready"},
@@ -1805,6 +1821,8 @@ struct sg_value_2names_t sg_exit_str_arr[] = {
{31, "Contradict", "command line options contradict or select bad mode"},
{32, "Logic error", "unexpected situation, contact author"},
{33, "SCSI command timeout", NULL}, /* OS timed out command */
+ {34, "Windows error number", "doesn't fit in 7 bits"},
+ {35, "Transport error", "driver or interconnect error"},
{36, "No errors (false)", NULL},
{40, "Aborted command, protection error", NULL},
{41, "Aborted command, protection error with Info field", NULL},
diff --git a/lib/sg_pt_linux.c b/lib/sg_pt_linux.c
index cd9083d0..c6fb9755 100644
--- a/lib/sg_pt_linux.c
+++ b/lib/sg_pt_linux.c
@@ -7,7 +7,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
-/* sg_pt_linux version 1.52 20210423 */
+/* sg_pt_linux version 1.53 20210830 */
#include <stdio.h>
@@ -71,8 +71,11 @@ static const char * linux_host_bytes[] = {
"DID_NEXUS_FAILURE (reservation conflict)",
"DID_ALLOC_FAILURE",
"DID_MEDIUM_ERROR",
+ "DID_TRANSPORT_MARGINAL", /*0x14 */
};
+/* These where made obsolete around lk 5.12.0 . Only DRIVER_SENSE [0x8] is
+ * defined in scsi/sg.h for backward comaptibility */
static const char * linux_driver_bytes[] = {
"DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA",
"DRIVER_ERROR", "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD",