#include "epkowa_scsi.h" #ifdef HAVE_STDDEF_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef NEED_SYS_TYPES_H #include #endif #include /* for memset and memcpy */ /* * sense handler for the sanei_scsi_XXX comands */ SANE_Status sanei_epson_scsi_sense_handler (int scsi_fd, u_char * result, void *arg) { /* to get rid of warnings */ scsi_fd = scsi_fd; arg = arg; if (result[0] && result[0] != 0x70) { log_data ("SCSI sense code = 0x%02x", result[0]); return SANE_STATUS_IO_ERROR; } else { return SANE_STATUS_GOOD; } } /* * * */ SANE_Status sanei_epson_scsi_inquiry (int fd, int page_code, void *buf, size_t * buf_size) { u_char cmd[6]; int status; memset (cmd, 0, 6); cmd[0] = INQUIRY_COMMAND; cmd[2] = page_code; cmd[4] = *buf_size > 255 ? 255 : *buf_size; status = sanei_scsi_cmd (fd, cmd, sizeof cmd, buf, buf_size); return status; } /* * * */ int sanei_epson_scsi_read (int fd, void *buf, size_t buf_size, SANE_Status * status) { u_char cmd[6]; memset (cmd, 0, 6); cmd[0] = READ_6_COMMAND; cmd[2] = buf_size >> 16; cmd[3] = buf_size >> 8; cmd[4] = buf_size; if (SANE_STATUS_GOOD == (*status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, &buf_size))) return buf_size; return 0; } /* * * */ int sanei_epson_scsi_write (int fd, const void *buf, size_t buf_size, SANE_Status * status) { u_char *cmd; cmd = t_alloca (8 + buf_size, u_char); memset (cmd, 0, 8); cmd[0] = WRITE_6_COMMAND; cmd[2] = buf_size >> 16; cmd[3] = buf_size >> 8; cmd[4] = buf_size; memcpy (cmd + 8, buf, buf_size); if (SANE_STATUS_GOOD == (*status = sanei_scsi_cmd2 (fd, cmd, 6, cmd + 8, buf_size, NULL, NULL))) return buf_size; return 0; }