epson2: fixed timeout and scanner crash on WP-4540 series (and others)

merge-requests/1/head
Alessandro Zummo 2014-03-13 22:57:17 +01:00
rodzic 3babe5de40
commit db31fdd1e3
2 zmienionych plików z 23 dodań i 19 usunięć

Wyświetl plik

@ -28,25 +28,32 @@
#include "sane/sanei_debug.h"
int
sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, size_t wanted,
SANE_Status * status)
static int
sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
SANE_Status *status)
{
size_t size, read = 0;
int ready, read = -1;
fd_set readable;
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
FD_ZERO(&readable);
FD_SET(s->fd, &readable);
ready = select(s->fd + 1, &readable, NULL, NULL, &tv);
if (ready > 0) {
read = sanei_tcp_read(s->fd, buf, wanted);
} else {
DBG(15, "%s: select failed: %d\n", __func__, ready);
}
*status = SANE_STATUS_GOOD;
while (read < wanted) {
size = sanei_tcp_read(s->fd, buf + read, wanted - read);
if (size == 0)
break;
read += size;
}
if (read < wanted)
if (read < wanted) {
*status = SANE_STATUS_IO_ERROR;
}
return read;
}
@ -102,7 +109,8 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
if (size == wanted) {
DBG(15, "%s: full read\n", __func__);
read = sanei_tcp_read(s->fd, buf, size);
read = sanei_epson_net_read_raw(s, buf, size, status);
if (s->netbuf) {
free(s->netbuf);
@ -111,7 +119,6 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
}
if (read < 0) {
*status = SANE_STATUS_IO_ERROR;
return 0;
}

Wyświetl plik

@ -9,9 +9,6 @@ extern int sanei_epson_net_read(struct Epson_Scanner *s, unsigned char *buf, ssi
extern int sanei_epson_net_write(struct Epson_Scanner *s, unsigned int cmd, const unsigned char *buf,
size_t buf_size, size_t reply_len,
SANE_Status *status);
extern int
sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, size_t wanted,
SANE_Status * status);
extern SANE_Status sanei_epson_net_lock(struct Epson_Scanner *s);
extern SANE_Status sanei_epson_net_unlock(struct Epson_Scanner *s);