summaryrefslogtreecommitdiff
path: root/backend/epson2_scsi.c
blob: 8e95c6f936533af92916b20d3371fc150e6704c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#undef BACKEND_NAME
#define BACKEND_NAME epson2_scsi

#include "../include/sane/config.h"
#include "../include/sane/sanei_debug.h"
#include "../include/sane/sanei_scsi.h"
#include "epson2_scsi.h"

#ifdef HAVE_STDDEF_H
#include <stddef.h>
#endif

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#ifdef NEED_SYS_TYPES_H
#include <sys/types.h>
#endif

#include <string.h> /* for memset and memcpy */
#include <stdio.h>

/* sense handler for the sanei_scsi_xxx comands */
SANE_Status
sanei_epson2_scsi_sense_handler(int scsi_fd,
	unsigned char *result, void *arg)
{
	/* to get rid of warnings */
	scsi_fd = scsi_fd;
	arg = arg;

	if (result[0] && result[0] != 0x70) {
		DBG(2, "%s: sense code = 0x%02x\n",
			__func__, result[0]);
		return SANE_STATUS_IO_ERROR;
	} else {
		return SANE_STATUS_GOOD;
	}
}

SANE_Status
sanei_epson2_scsi_inquiry(int fd, void *buf, size_t *buf_size)
{
	unsigned char cmd[6];
	int status;

	memset(cmd, 0, 6);
	cmd[0] = INQUIRY_COMMAND;
	cmd[4] = *buf_size > 255 ? 255 : *buf_size;
	status = sanei_scsi_cmd(fd, cmd, sizeof cmd, buf, buf_size);

	return status;
}

SANE_Status
sanei_epson2_scsi_test_unit_ready(int fd)
{
	unsigned char cmd[6];

	memset(cmd, 0, 6);
	cmd[0] = TEST_UNIT_READY_COMMAND;

	return sanei_scsi_cmd2(fd, cmd, sizeof(cmd), NULL, 0, NULL, NULL);
}

int
sanei_epson2_scsi_read(int fd, void *buf, size_t buf_size,
		      SANE_Status *status)
{
	unsigned 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;

	*status = sanei_scsi_cmd2(fd, cmd, sizeof(cmd), NULL, 0, buf, &buf_size);
	if (*status == SANE_STATUS_GOOD)
		return buf_size;

	return 0;
}

int
sanei_epson2_scsi_write(int fd, const void *buf, size_t buf_size,
		       SANE_Status *status)
{
	unsigned char cmd[6];

	memset(cmd, 0, sizeof(cmd));
	cmd[0] = WRITE_6_COMMAND;
	cmd[2] = buf_size >> 16;
	cmd[3] = buf_size >> 8;
	cmd[4] = buf_size;

	*status = sanei_scsi_cmd2(fd, cmd, sizeof(cmd), buf, buf_size, NULL, NULL);
	if (*status == SANE_STATUS_GOOD)
		return buf_size;

	return 0;
}