1 #ifdef _AIX
2 #include "../include/lalloca.h"	/* MUST come first for AIX! */
3 #endif
4 
5 #include "epkowa_scsi.h"
6 
7 #include "../include/lalloca.h"
8 
9 #ifdef HAVE_STDDEF_H
10 #include <stddef.h>
11 #endif
12 
13 #ifdef HAVE_STDLIB_H
14 #include <stdlib.h>
15 #endif
16 
17 #ifdef NEED_SYS_TYPES_H
18 #include <sys/types.h>
19 #endif
20 
21 #include <string.h>		/* for memset and memcpy */
22 #include <stdio.h>
23 
24 /*
25  * sense handler for the sanei_scsi_XXX comands
26  */
27 SANE_Status
sanei_epson_scsi_sense_handler(int scsi_fd,u_char * result,void * arg)28 sanei_epson_scsi_sense_handler (int scsi_fd, u_char * result, void *arg)
29 {
30   /* to get rid of warnings */
31   scsi_fd = scsi_fd;
32   arg = arg;
33 
34   if (result[0] && result[0] != 0x70)
35   {
36     // DBG (2, "sense_handler() : sense code = 0x%02x\n", result[0]);
37     return SANE_STATUS_IO_ERROR;
38   }
39   else
40   {
41     return SANE_STATUS_GOOD;
42   }
43 }
44 
45 /*
46  *
47  *
48  */
49 SANE_Status
sanei_epson_scsi_inquiry(int fd,int page_code,void * buf,size_t * buf_size)50 sanei_epson_scsi_inquiry (int fd, int page_code, void *buf, size_t * buf_size)
51 {
52   u_char cmd[6];
53   int status;
54 
55   memset (cmd, 0, 6);
56   cmd[0] = INQUIRY_COMMAND;
57   cmd[2] = page_code;
58   cmd[4] = *buf_size > 255 ? 255 : *buf_size;
59   status = sanei_scsi_cmd (fd, cmd, sizeof cmd, buf, buf_size);
60 
61   return status;
62 }
63 
64 /*
65  *
66  *
67  */
68 int
sanei_epson_scsi_read(int fd,void * buf,size_t buf_size,SANE_Status * status)69 sanei_epson_scsi_read (int fd, void *buf, size_t buf_size,
70 		       SANE_Status * status)
71 {
72   u_char cmd[6];
73 
74   memset (cmd, 0, 6);
75   cmd[0] = READ_6_COMMAND;
76   cmd[2] = buf_size >> 16;
77   cmd[3] = buf_size >> 8;
78   cmd[4] = buf_size;
79 
80   if (SANE_STATUS_GOOD ==
81       (*status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, &buf_size)))
82     return buf_size;
83 
84   return 0;
85 }
86 
87 /*
88  *
89  *
90  */
91 int
sanei_epson_scsi_write(int fd,const void * buf,size_t buf_size,SANE_Status * status)92 sanei_epson_scsi_write (int fd, const void *buf, size_t buf_size,
93 			SANE_Status * status)
94 {
95   u_char *cmd;
96 
97   cmd = alloca (8 + buf_size);
98   memset (cmd, 0, 8);
99   cmd[0] = WRITE_6_COMMAND;
100   cmd[2] = buf_size >> 16;
101   cmd[3] = buf_size >> 8;
102   cmd[4] = buf_size;
103   memcpy (cmd + 8, buf, buf_size);
104 
105   if (SANE_STATUS_GOOD ==
106       (*status = sanei_scsi_cmd2 (fd, cmd, 6, cmd + 8, buf_size, NULL, NULL)))
107     return buf_size;
108 
109   return 0;
110 }
111