Author: mav
Date: Sun Jan 29 14:29:02 2017
New Revision: 312951
URL: https://svnweb.freebsd.org/changeset/base/312951

Log:
  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.

Modified:
  stable/10/sbin/camcontrol/camcontrol.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/camcontrol/camcontrol.c
==============================================================================
--- stable/10/sbin/camcontrol/camcontrol.c      Sun Jan 29 14:28:29 2017        
(r312950)
+++ stable/10/sbin/camcontrol/camcontrol.c      Sun Jan 29 14:29:02 2017        
(r312951)
@@ -4145,7 +4145,7 @@ scsicmd(struct cam_device *device, int a
        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;
@@ -4449,16 +4449,20 @@ scsicmd(struct cam_device *device, int a
                }
        }
 
+       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) &&
@@ -4473,7 +4477,7 @@ scsicmd(struct cam_device *device, int a
                        } 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);
                        }
                }
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to