diff options
author | mav <mav@FreeBSD.org> | 2017-01-29 14:28:29 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2017-01-29 14:28:29 +0000 |
commit | dda74e2e758e0ce7028f2a4ba4cb25d7c8b2612c (patch) | |
tree | 56a6a6ef727eacfb028ebf63c11953d0482bb600 /sbin/camcontrol/camcontrol.c | |
parent | 903fc3d58f7addb3c7f8ce06708759e9d6608ad1 (diff) | |
download | FreeBSD-src-dda74e2e758e0ce7028f2a4ba4cb25d7c8b2612c.zip FreeBSD-src-dda74e2e758e0ce7028f2a4ba4cb25d7c8b2612c.tar.gz |
MFC r312228: Make `camcontrol cmd ... -i ...` return only valid bytes.
Previously code ignored resid field and returned extra zeroes in case of
data underflow. Now it returns only real bytes received from target.
Diffstat (limited to 'sbin/camcontrol/camcontrol.c')
-rw-r--r-- | sbin/camcontrol/camcontrol.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c index 5184fee..dda58d2 100644 --- a/sbin/camcontrol/camcontrol.c +++ b/sbin/camcontrol/camcontrol.c @@ -4150,7 +4150,7 @@ scsicmd(struct cam_device *device, int argc, char **argv, char *combinedopt, u_int8_t cdb[20]; u_int8_t atacmd[12]; struct get_hook hook; - int c, data_bytes = 0; + int c, data_bytes = 0, valid_bytes; int cdb_len = 0; int atacmd_len = 0; int dmacmd = 0; @@ -4454,16 +4454,20 @@ scsicmd(struct cam_device *device, int argc, char **argv, char *combinedopt, } } + if (cdb_len) + valid_bytes = ccb->csio.dxfer_len - ccb->csio.resid; + else + valid_bytes = ccb->ataio.dxfer_len - ccb->ataio.resid; if (((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) && (arglist & CAM_ARG_CMD_IN) - && (data_bytes > 0)) { + && (valid_bytes > 0)) { if (fd_data == 0) { - buff_decode_visit(data_ptr, data_bytes, datastr, + buff_decode_visit(data_ptr, valid_bytes, datastr, arg_put, NULL); fprintf(stdout, "\n"); } else { ssize_t amt_written; - int amt_to_write = data_bytes; + int amt_to_write = valid_bytes; u_int8_t *buf_ptr = data_ptr; for (amt_written = 0; (amt_to_write > 0) && @@ -4478,7 +4482,7 @@ scsicmd(struct cam_device *device, int argc, char **argv, char *combinedopt, } else if ((amt_written == 0) && (amt_to_write > 0)) { warnx("only wrote %u bytes out of %u", - data_bytes - amt_to_write, data_bytes); + valid_bytes - amt_to_write, valid_bytes); } } } |