kopia lustrzana https://gitlab.com/sane-project/backends
Make sure that frontend bugs concerning the select fd are detected.
rodzic
02e2a1b0e4
commit
f63abd633e
|
@ -31,6 +31,8 @@
|
||||||
doc/descriptions-external/viceo.desc: Added description files for
|
doc/descriptions-external/viceo.desc: Added description files for
|
||||||
scanwit and viceo backends.
|
scanwit and viceo backends.
|
||||||
* doc/descriptions-external/tevion9693usb.desc: Removed (now included).
|
* doc/descriptions-external/tevion9693usb.desc: Removed (now included).
|
||||||
|
* backend/test.c doc/descriptions/test.desc: Make sure that frontend bugs
|
||||||
|
concerning the select fd are detected.
|
||||||
|
|
||||||
|
|
||||||
2002-12-28 Karl Heinz Kremer <khk@khk.net>
|
2002-12-28 Karl Heinz Kremer <khk@khk.net>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
This backend is for testing frontends.
|
This backend is for testing frontends.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define BUILD 19
|
#define BUILD 20
|
||||||
|
|
||||||
#include "../include/sane/config.h"
|
#include "../include/sane/config.h"
|
||||||
|
|
||||||
|
@ -1247,7 +1247,8 @@ reader_process (Test_Device * test_device, SANE_Int fd)
|
||||||
|
|
||||||
free (buffer);
|
free (buffer);
|
||||||
DBG (4, "(child) reader_process: finished, wrote %d bytes, expected %d "
|
DBG (4, "(child) reader_process: finished, wrote %d bytes, expected %d "
|
||||||
"bytes\n", byte_count, bytes_total);
|
"bytes, now waiting\n", byte_count, bytes_total);
|
||||||
|
sleep (1000);
|
||||||
close (fd);
|
close (fd);
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
@ -1258,6 +1259,14 @@ finish_pass (Test_Device * test_device)
|
||||||
SANE_Status return_status = SANE_STATUS_GOOD;
|
SANE_Status return_status = SANE_STATUS_GOOD;
|
||||||
|
|
||||||
DBG (2, "finish_pass: test_device=%p\n", test_device);
|
DBG (2, "finish_pass: test_device=%p\n", test_device);
|
||||||
|
test_device->scanning = SANE_FALSE;
|
||||||
|
if (test_device->pipe > 0)
|
||||||
|
{
|
||||||
|
DBG (2, "finish_pass: closing pipe\n");
|
||||||
|
close (test_device->pipe);
|
||||||
|
DBG (2, "finish_pass: pipe closed\n");
|
||||||
|
test_device->pipe = 0;
|
||||||
|
}
|
||||||
if (test_device->reader_pid > 0)
|
if (test_device->reader_pid > 0)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
@ -1291,13 +1300,6 @@ finish_pass (Test_Device * test_device)
|
||||||
|
|
||||||
test_device->reader_pid = 0;
|
test_device->reader_pid = 0;
|
||||||
}
|
}
|
||||||
if (test_device->pipe > 0)
|
|
||||||
{
|
|
||||||
DBG (2, "finish_pass: closing pipe\n");
|
|
||||||
fclose (test_device->pipe_handle);
|
|
||||||
close (test_device->pipe);
|
|
||||||
test_device->pipe = 0;
|
|
||||||
}
|
|
||||||
return return_status;
|
return return_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2451,9 +2453,6 @@ sane_start (SANE_Handle handle)
|
||||||
|
|
||||||
close (pipe_descriptor[0]);
|
close (pipe_descriptor[0]);
|
||||||
status = reader_process (test_device, pipe_descriptor[1]);
|
status = reader_process (test_device, pipe_descriptor[1]);
|
||||||
DBG (2, "(child) sane_start: reader_process waiting ... returned %s\n",
|
|
||||||
sane_strstatus (status));
|
|
||||||
sleep (1000); /* wait for explicit kill */
|
|
||||||
DBG (2, "(child) sane_start: reader_process timed out\n");
|
DBG (2, "(child) sane_start: reader_process timed out\n");
|
||||||
_exit (status);
|
_exit (status);
|
||||||
}
|
}
|
||||||
|
@ -2465,7 +2464,6 @@ sane_start (SANE_Handle handle)
|
||||||
/* parent */
|
/* parent */
|
||||||
close (pipe_descriptor[1]);
|
close (pipe_descriptor[1]);
|
||||||
test_device->pipe = pipe_descriptor[0];
|
test_device->pipe = pipe_descriptor[0];
|
||||||
test_device->pipe_handle = fdopen (pipe_descriptor[0], "r");
|
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
@ -2479,6 +2477,8 @@ sane_read (SANE_Handle handle, SANE_Byte * data,
|
||||||
SANE_Int max_scan_length;
|
SANE_Int max_scan_length;
|
||||||
ssize_t bytes_read;
|
ssize_t bytes_read;
|
||||||
size_t read_count;
|
size_t read_count;
|
||||||
|
SANE_Int bytes_total = test_device->lines * test_device->bytes_per_line;
|
||||||
|
|
||||||
|
|
||||||
DBG (4, "sane_read: handle=%p, data=%p, max_length = %d, length=%p\n",
|
DBG (4, "sane_read: handle=%p, data=%p, max_length = %d, length=%p\n",
|
||||||
handle, data, max_length, length);
|
handle, data, max_length, length);
|
||||||
|
@ -2552,20 +2552,21 @@ sane_read (SANE_Handle handle, SANE_Byte * data,
|
||||||
DBG (1, "sane_read: scan was cancelled\n");
|
DBG (1, "sane_read: scan was cancelled\n");
|
||||||
return SANE_STATUS_CANCELLED;
|
return SANE_STATUS_CANCELLED;
|
||||||
}
|
}
|
||||||
|
if (test_device->eof)
|
||||||
|
{
|
||||||
|
DBG (2, "sane_read: No more data available, sending EOF\n");
|
||||||
|
return SANE_STATUS_EOF;
|
||||||
|
}
|
||||||
if (!test_device->scanning)
|
if (!test_device->scanning)
|
||||||
{
|
{
|
||||||
DBG (1, "sane_read: not scanning (call sane_start first)\n");
|
DBG (1, "sane_read: not scanning (call sane_start first)\n");
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
if (test_device->eof)
|
|
||||||
{
|
|
||||||
DBG (2, "sane_read: EOF reached\n");
|
|
||||||
return SANE_STATUS_EOF;
|
|
||||||
}
|
|
||||||
read_count = max_scan_length;
|
read_count = max_scan_length;
|
||||||
|
|
||||||
bytes_read = fread (data, 1, read_count, test_device->pipe_handle);
|
bytes_read = read (test_device->pipe, data, read_count);
|
||||||
if (feof (test_device->pipe_handle))
|
if (bytes_read == 0
|
||||||
|
|| (bytes_read + test_device->bytes_total >= bytes_total))
|
||||||
{
|
{
|
||||||
SANE_Status status;
|
SANE_Status status;
|
||||||
DBG (2, "sane_read: EOF reached\n");
|
DBG (2, "sane_read: EOF reached\n");
|
||||||
|
@ -2579,25 +2580,24 @@ sane_read (SANE_Handle handle, SANE_Byte * data,
|
||||||
test_device->eof = SANE_TRUE;
|
test_device->eof = SANE_TRUE;
|
||||||
if (strcmp (test_device->val[opt_mode].s, "Color") == 0
|
if (strcmp (test_device->val[opt_mode].s, "Color") == 0
|
||||||
&& test_device->val[opt_three_pass].w == SANE_TRUE)
|
&& test_device->val[opt_three_pass].w == SANE_TRUE)
|
||||||
|
{
|
||||||
test_device->pass++;
|
test_device->pass++;
|
||||||
|
if (test_device->pass > 2)
|
||||||
|
test_device->pass = 0;
|
||||||
|
}
|
||||||
if (bytes_read == 0)
|
if (bytes_read == 0)
|
||||||
return SANE_STATUS_EOF;
|
return SANE_STATUS_EOF;
|
||||||
}
|
}
|
||||||
else if (bytes_read == 0 && ferror (test_device->pipe_handle))
|
else if (bytes_read < 0)
|
||||||
{
|
{
|
||||||
if (errno == EAGAIN)
|
if (errno == EAGAIN)
|
||||||
{
|
{
|
||||||
DBG (2, "sane_read: no data available, try again\n");
|
DBG (2, "sane_read: no data available, try again\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
else if (errno == 0)
|
|
||||||
{
|
|
||||||
DBG (2, "sane_read: huh? ferror set but errno == 0?\n");
|
|
||||||
clearerr (test_device->pipe_handle);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG (1, "sane_read: fread returned error: %s\n", strerror (errno));
|
DBG (1, "sane_read: read returned error: %s\n", strerror (errno));
|
||||||
return SANE_STATUS_IO_ERROR;
|
return SANE_STATUS_IO_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
;
|
;
|
||||||
|
|
||||||
:backend "test" ; name of backend
|
:backend "test" ; name of backend
|
||||||
:version "1.0-18" ; version of backend
|
:version "1.0-20" ; version of backend
|
||||||
:status :stable ; :alpha, :beta, :stable, :new
|
:status :stable ; :alpha, :beta, :stable, :new
|
||||||
:manpage "sane-test" ; name of manpage (if it exists)
|
:manpage "sane-test" ; name of manpage (if it exists)
|
||||||
:url "http://www.meier-geinitz.de/sane/test-backend/" ; backend's web page
|
:url "http://www.meier-geinitz.de/sane/test-backend/" ; backend's web page
|
||||||
|
|
Ładowanie…
Reference in New Issue