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