2003-07-17 Abel Deuring <a.deuring@satzbau-gmbh.de>

* sanei/sanei_scsi.c: improved SCSI error handling in
          sanei_scsi_cmd2 for FREEBSD_CAM_INTERFACE
merge-requests/1/head
Abel Deuring 2003-07-17 20:35:25 +00:00
rodzic 8007efa1a3
commit ee430a8af6
2 zmienionych plików z 23 dodań i 11 usunięć

Wyświetl plik

@ -1,3 +1,8 @@
2003-07-17 Abel Deuring <a.deuring@satzbau-gmbh.de>
* sanei/sanei_scsi.c: improved SCSI error handling in
sanei_scsi_cmd2 for FREEBSD_CAM_INTERFACE
2003-07-17 Henning Meier-Geinitz <henning@meier-geinitz.de> 2003-07-17 Henning Meier-Geinitz <henning@meier-geinitz.de>
* sanei/sanei_usb.c: Enable close_on_exec in sanei_usb_open. * sanei/sanei_usb.c: Enable close_on_exec in sanei_usb_open.

Wyświetl plik

@ -2768,22 +2768,19 @@ SANE_Status sanei_scsi_cmd2(int fd,
const void *src, size_t src_size, const void *src, size_t src_size,
void *dst, size_t * dst_size) { void *dst, size_t * dst_size) {
/* xxx obsolete size_t cdb_size;
*/
struct cam_device *dev; struct cam_device *dev;
union ccb *ccb; union ccb *ccb;
int rv; int rv;
u_int32_t ccb_flags; u_int32_t ccb_flags;
char* data_buf; char* data_buf;
size_t data_len; size_t data_len;
SANE_Status status;
if (fd < 0 || fd > CAM_MAXDEVS || cam_devices[fd] == NULL) { if (fd < 0 || fd > CAM_MAXDEVS || cam_devices[fd] == NULL) {
fprintf(stderr, "attempt to reference invalid unit %d\n", fd); fprintf(stderr, "attempt to reference invalid unit %d\n", fd);
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
/* xxx obsolete: cdb_size = CDB_SIZE (*(u_char *) src);
*/
dev = cam_devices[fd]; dev = cam_devices[fd];
ccb = cam_getccb(dev); ccb = cam_getccb(dev);
@ -2836,19 +2833,29 @@ SANE_Status sanei_scsi_cmd2(int fd,
DBG (1, "sanei_scsi_cmd: scsi returned with status %d\n", DBG (1, "sanei_scsi_cmd: scsi returned with status %d\n",
(ccb->ccb_h.status & CAM_STATUS_MASK)); (ccb->ccb_h.status & CAM_STATUS_MASK));
if((ccb->ccb_h.status & CAM_STATUS_MASK) switch (ccb->ccb_h.status & CAM_STATUS_MASK)
== SANE_STATUS_DEVICE_BUSY) {
return SANE_STATUS_DEVICE_BUSY; case CAM_BUSY:
case CAM_SEL_TIMEOUT:
case CAM_SCSI_BUSY:
status = SANE_STATUS_DEVICE_BUSY;
break;
default:
status = SANE_STATUS_IO_ERROR;
}
handler = fd_info[fd].sense_handler; handler = fd_info[fd].sense_handler;
if (handler) { if (handler && (ccb->ccb_h.status & CAM_AUTOSNS_VALID)) {
SANE_Status st = (*handler) (fd, ((u_char*)(&ccb->csio.sense_data)), SANE_Status st = (*handler)
(fd, ((u_char*)(&ccb->csio.sense_data)),
fd_info[fd].sense_handler_arg); fd_info[fd].sense_handler_arg);
cam_freeccb(ccb); cam_freeccb(ccb);
return st; return st;
} }
else else {
return SANE_STATUS_IO_ERROR; cam_freeccb(ccb);
return status;
}
} }
cam_freeccb(ccb); cam_freeccb(ccb);
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;