diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2018-01-28 06:50:39 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2018-01-28 06:50:39 +0000 |
commit | 3a7e1666843ba386946f65d8ea89fe4ddf9ed9bf (patch) | |
tree | ec2d3a035ff39e5f5786460ac09f31df45d5469f /lib/sg_cmds_basic.c | |
parent | 6293187a432dd0bbf85961a897755bd0260f28ad (diff) | |
download | sg3_utils-3a7e1666843ba386946f65d8ea89fe4ddf9ed9bf.tar.gz |
add sg_seek and sg_stream_ctl utilities; properly identify vendor-specific sense; documentation cleanup
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@747 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib/sg_cmds_basic.c')
-rw-r--r-- | lib/sg_cmds_basic.c | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c index cf5dfbc2..7405372e 100644 --- a/lib/sg_cmds_basic.c +++ b/lib/sg_cmds_basic.c @@ -36,7 +36,7 @@ #endif -static const char * const version_str = "1.80 20180117"; +static const char * const version_str = "1.82 20180126"; #define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */ @@ -351,7 +351,7 @@ sg_ll_inquiry(int sg_fd, bool cmddt, bool evpd, int pg_op, void * resp, if (evpd) inq_cdb[1] |= 1; inq_cdb[2] = (unsigned char)pg_op; - /* 16 bit allocation length (was 8, increased in spc3r09, September 2002) */ + /* 16 bit allocation length (was 8, increased in spc3r09, 200209) */ sg_put_unaligned_be16((uint16_t)mx_resp_len, inq_cdb + 3); if (verbose) { pr2ws(" %s cdb: ", inquiry_s); @@ -374,10 +374,12 @@ sg_ll_inquiry(int sg_fd, bool cmddt, bool evpd, int pg_op, void * resp, ret = sg_cmds_process_resp(ptvp, inquiry_s, res, mx_resp_len, sense_b, noisy, verbose, &sense_cat); resid = get_scsi_pt_resid(ptvp); - destruct_scsi_pt_obj(ptvp); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -393,6 +395,7 @@ sg_ll_inquiry(int sg_fd, bool cmddt, bool evpd, int pg_op, void * resp, ret = SG_LIB_CAT_MALFORMED; } else ret = 0; + destruct_scsi_pt_obj(ptvp); if (resid > 0) { if (resid > mx_resp_len) { @@ -441,9 +444,12 @@ sg_simple_inquiry(int sg_fd, struct sg_simple_inquiry_resp * inq_data, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, inquiry_s, res, sizeof(inq_resp), sense_b, noisy, verbose, &sense_cat); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -502,7 +508,7 @@ sg_ll_inquiry_v2(int sg_fd, bool evpd, int pg_op, void * resp, if (evpd) inq_cdb[1] |= 1; inq_cdb[2] = (unsigned char)pg_op; - /* 16 bit allocation length (was 8, increased in spc3r09, September 2002) */ + /* 16 bit allocation length (was 8, increased in spc3r09, 200209) */ sg_put_unaligned_be16((uint16_t)mx_resp_len, inq_cdb + 3); if (verbose) { pr2ws(" inquiry cdb: "); @@ -534,10 +540,12 @@ sg_ll_inquiry_v2(int sg_fd, bool evpd, int pg_op, void * resp, resid = get_scsi_pt_resid(ptvp); if (residp) *residp = resid; - destruct_scsi_pt_obj(ptvp); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -553,6 +561,7 @@ sg_ll_inquiry_v2(int sg_fd, bool evpd, int pg_op, void * resp, ret = SG_LIB_CAT_MALFORMED; } else ret = 0; + destruct_scsi_pt_obj(ptvp); if (resid > 0) { if (resid > mx_resp_len) { @@ -597,9 +606,12 @@ sg_ll_test_unit_ready_progress(int sg_fd, int pack_id, int * progress, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, tur_s, res, SG_NO_DATA_IN, sense_b, noisy, verbose, &sense_cat); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { if (progress) { int slen = get_scsi_pt_sense_len(ptvp); @@ -668,9 +680,12 @@ sg_ll_request_sense(int sg_fd, bool desc, void * resp, int mx_resp_len, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, rq_s, res, mx_resp_len, sense_b, noisy, verbose, &sense_cat); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -723,9 +738,12 @@ sg_ll_report_luns(int sg_fd, int select_report, void * resp, int mx_resp_len, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, report_luns_s, res, mx_resp_len, sense_b, noisy, verbose, &sense_cat); - if (-1 == ret) - ; - else if (-2 == ret) { + if (-1 == ret) { + int os_err = get_scsi_pt_os_err(ptvp); + + if ((os_err > 0) && (os_err < 47)) + ret = SG_LIB_OS_BASE_ERR + os_err; + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: |