diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2018-12-21 19:33:41 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2018-12-21 19:33:41 +0000 |
commit | f32c01a8a383e9d15f20a6784749aab0ed248ad8 (patch) | |
tree | 6c8d68ea311299ec70cb4034b8573af048809fdd /src/sg_raw.c | |
parent | 18c9852db91032afe4bedd85857d558402b360e2 (diff) | |
download | sg3_utils-f32c01a8a383e9d15f20a6784749aab0ed248ad8.tar.gz |
sg_raw: fix --send bug when using stdin; work on sgs_dd
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@800 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_raw.c')
-rw-r--r-- | src/sg_raw.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/src/sg_raw.c b/src/sg_raw.c index 9cc0ab2b..33a85f7c 100644 --- a/src/sg_raw.c +++ b/src/sg_raw.c @@ -39,7 +39,7 @@ #include "sg_pr2serr.h" #include "sg_unaligned.h" -#define SG_RAW_VERSION "0.4.27 (2018-06-27)" +#define SG_RAW_VERSION "0.4.28 (2018-12-20)" #define DEFAULT_TIMEOUT 20 #define MIN_SCSI_CDBSZ 6 @@ -540,7 +540,7 @@ static uint8_t * fetch_dataout(struct opts_t * op, uint8_t ** free_buf, int * errp) { bool ok = false; - int fd, len, err; + int fd, len, tot_len, boff, err; uint8_t *buf = NULL; *free_buf = NULL; @@ -574,28 +574,29 @@ fetch_dataout(struct opts_t * op, uint8_t ** free_buf, int * errp) } } - buf = sg_memalign(op->dataout_len, 0 /* page_size */, free_buf, - op->verbose > 3); + tot_len = op->dataout_len; + buf = sg_memalign(tot_len, 0 /* page_size */, free_buf, op->verbose > 3); if (buf == NULL) { - pr2serr("sg_memalign: failed to get %d bytes of memory\n", - op->dataout_len); + pr2serr("sg_memalign: failed to get %d bytes of memory\n", tot_len); if (errp) *errp = sg_convert_errno(ENOMEM); goto bail; } - len = read(fd, buf, op->dataout_len); - if (len < 0) { - err = errno; - if (errp) - *errp = sg_convert_errno(err); - perror("Failed to read input data"); - goto bail; - } else if (len < op->dataout_len) { - if (errp) - *errp = SG_LIB_FILE_ERROR; - pr2serr("EOF on input file/stream\n"); - goto bail; + for (boff = 0; boff < tot_len; boff += len) { + len = read(fd, buf + boff , tot_len - boff); + if (len < 0) { + err = errno; + if (errp) + *errp = sg_convert_errno(err); + perror("Failed to read input data"); + goto bail; + } else if (0 == len) { + if (errp) + *errp = SG_LIB_FILE_ERROR; + pr2serr("EOF on input file/stream at buffer offset %d\n", boff); + goto bail; + } } ok = true; |