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