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