Check USB vendor IDs to avoid hanging scanners, fix bug in dither matrix computation

DEVEL_2_0_BRANCH-1
Oliver Schwartz 2001-10-27 09:08:17 +00:00
rodzic de16f98b44
commit a39d1a1518
5 zmienionych plików z 82 dodań i 46 usunięć

Wyświetl plik

@ -260,6 +260,7 @@ libsane-sm3600.la: ../sanei/sanei_constrain_value.lo
libsane-snapscan.la: ../sanei/sanei_config2.lo
libsane-snapscan.la: ../sanei/sanei_constrain_value.lo
libsane-snapscan.la: ../sanei/sanei_scsi.lo
libsane-snapscan.la: ../sanei/sanei_usb.lo
libsane-sp15c.la: ../sanei/sanei_config2.lo
libsane-sp15c.la: ../sanei/sanei_constrain_value.lo
libsane-sp15c.la: ../sanei/sanei_scsi.lo

Wyświetl plik

@ -125,12 +125,26 @@ static SANE_Status atomic_usb_cmd(int fd, const void *src, size_t src_size,
static SANE_Status snapscani_usb_open(const char *dev, int *fdp)
{
return usb_open(dev,fdp);
static const char me[] = "snapscani_usb_open";
DBG (DL_CALL_TRACE, "%s(%s)\n", me, dev);
if((sem_id = semget( ftok(dev,0x1234), 1, IPC_CREAT | 0660 )) == -1) {
DBG (DL_MAJOR_ERROR, "%s: Can't get semaphore\n", me);
return SANE_STATUS_INVAL;
}
semop(sem_id, &sem_signal, 1);
sanei_usb_init();
return sanei_usb_open(dev, fdp);
}
static void snapscani_usb_close(int fd) {
usb_close(fd);
static const char me[] = "snapscani_usb_close";
DBG (DL_CALL_TRACE, "%s(%d)\n", me, fd);
semctl(sem_id, 0, IPC_RMID, 0);
sanei_usb_close(fd);
}
@ -170,33 +184,6 @@ static char *usb_debug_data(char *str,const char *data, int len) {
return str;
}
static SANE_Status usb_open(const char *dev, int *fdp)
{
static const char me[] = "usb_open";
DBG (DL_CALL_TRACE, "%s(%s)\n", me, dev);
if((sem_id = semget( ftok(dev,0x1234), 1, IPC_CREAT | 0660 )) == -1) {
DBG (DL_MAJOR_ERROR, "%s: Can't get semaphore\n", me);
return SANE_STATUS_INVAL;
}
semop(sem_id, &sem_signal, 1);
*fdp = open(dev, O_RDWR);
if( *fdp < 0)
return SANE_STATUS_INVAL;
return SANE_STATUS_GOOD;
}
static void usb_close(int fd) {
static const char me[] = "usb_close";
DBG (DL_CALL_TRACE, "%s(%d)\n", me, fd);
semctl(sem_id, 0, IPC_RMID, 0);
close(fd);
}
/*
static int usb_status(char *status_buf) {
int status;
@ -419,6 +406,9 @@ static void dequeue_bq()
}
/*
* $Log$
* Revision 1.4 2001/10/27 09:08:13 oliverschwartz
* Check USB vendor IDs to avoid hanging scanners, fix bug in dither matrix computation
*
* Revision 1.3 2001/10/10 07:30:06 oliverschwartz
* fix compiler warnings
*

Wyświetl plik

@ -75,10 +75,6 @@ static int is_queueable(const char *src);
static SANE_Status atomic_usb_cmd(int fd, const void *src, size_t src_size,
void *dst, size_t * dst_size);
static SANE_Status usb_open(const char *dev, int *fdp);
static void usb_close(int fd);
static SANE_Status usb_cmd(int fd, const void *src, size_t src_size,
void *dst, size_t * dst_size);
@ -86,6 +82,9 @@ static SANE_Status usb_cmd(int fd, const void *src, size_t src_size,
/*
* $Log$
* Revision 1.3 2001/10/27 09:08:14 oliverschwartz
* Check USB vendor IDs to avoid hanging scanners, fix bug in dither matrix computation
*
* Revision 1.2 2001/10/09 09:45:15 oliverschwartz
* update snapscan to snapshot 20011008
*

Wyświetl plik

@ -70,6 +70,7 @@
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
#include "../include/sane/sanei_scsi.h"
#include "../include/sane/sanei_usb.h"
#ifndef PATH_MAX
#define PATH_MAX 1024
@ -941,8 +942,15 @@ static void mkDn (u_char *Dn, u_char *Dn2, unsigned n)
unsigned f;
/* compute 4*D(n/2) */
/* Oliver Schwartz, 27 Oct. 2001: Changed code from
tmp[i] = (u_char) (4 * Dn2[i]);
to
tmp[i] = (u_char) (4 * Dn2[i/4]);
to avoid illegal indices in Dn2. Don't know if this
is the desired algorithm.
*/
for (i = 0; i < nsq; i++)
tmp[i] = (u_char) (4 * Dn2[i]);
tmp[i] = (u_char) (4 * Dn2[i/4]);
/* now the dither matrix */
for (r = 0, imin = 0, f = 0; r < 2; r++, imin += n2)
@ -993,8 +1001,10 @@ static SANE_Status add_device (SANE_String_Const name)
SnapScan_Device *pd;
SnapScan_Model model_num = UNKNOWN;
SnapScan_Bus bus_type = UNKNOWN_BUS;
SANE_Word vendor_id, product_id;
int i;
int supported_vendor = 0;
int supported_usb_vendor = 0;
char vendor[8];
char model[17];
@ -1007,7 +1017,7 @@ static SANE_Status add_device (SANE_String_Const name)
vendor[0] = model[0] = '\0';
if((strstr (name, "usb")) || (strstr (name, "USB")))
{
{
DBG (DL_VERBOSE, "%s: Detected (kind of) an USB device\n", me);
bus_type = USB;
@ -1018,31 +1028,52 @@ static SANE_Status add_device (SANE_String_Const name)
}
status = snapscani_usb_open (name, &fd);
if (status != SANE_STATUS_GOOD)
{
{
DBG (DL_MAJOR_ERROR,
"%s: error opening device %s: %s\n",
me,
name,
sane_strstatus (status));
return status;
}
}
}
if (sanei_usb_get_vendor_product(fd, &vendor_id, &product_id) ==
SANE_STATUS_GOOD)
{
/* check for known USB vendors to avoid hanging scanners by
inquiry-command.
*/
DBG(DL_INFO, "%s: Checking if 0x%04x is a supported USB vendor ID\n",
me, vendor_id);
for (i = 0; i < known_usb_vendor_ids; i++) {
if (vendor_id == usb_vendor_ids[i]) {
supported_usb_vendor = 1;
}
}
if (!supported_usb_vendor) {
DBG(DL_MINOR_ERROR,
"%s: USB vendor ID 0x%04x is currently NOT supported by the snapscan backend.\n",
me, vendor_id);
snapscani_usb_close (fd);
return SANE_STATUS_INVAL;
}
}
}
else
{
{
DBG (DL_VERBOSE, "%s: Detected (kind of) a SCSI device\n", me);
bus_type = SCSI;
status = sanei_scsi_open (name, &fd, sense_handler, NULL);
if (status != SANE_STATUS_GOOD)
{
{
DBG (DL_MAJOR_ERROR,
"%s: error opening device %s: %s\n",
me,
name,
sane_strstatus (status));
return status;
}
}
}
}
/* check that the device is legitimate */
if ((status = mini_inquiry (bus_type, fd, vendor, model)) != SANE_STATUS_GOOD)
@ -1053,13 +1084,13 @@ static SANE_Status add_device (SANE_String_Const name)
sane_strstatus (status));
if(bus_type == SCSI)
{
{
sanei_scsi_close (fd);
}
}
else if(bus_type == USB)
{
{
snapscani_usb_close (fd);
}
}
return status;
}
@ -3092,6 +3123,9 @@ SANE_Status sane_get_select_fd (SANE_Handle h, SANE_Int * fd)
/*
* $Log$
* Revision 1.10 2001/10/27 09:08:14 oliverschwartz
* Check USB vendor IDs to avoid hanging scanners, fix bug in dither matrix computation
*
* Revision 1.9 2001/10/25 10:56:39 oliverschwartz
* Change snapscan backend version number to 1.4.0
*

Wyświetl plik

@ -142,6 +142,15 @@ static char *vendors[] =
};
#define known_vendors ((int) (sizeof(vendors)/sizeof(vendors[0])))
static SANE_Word usb_vendor_ids[] =
{
/* USB Vendor IDs */
0x06bd, /* Agfa */
0x04a5 /* Acer */
};
#define known_usb_vendor_ids ((int) (sizeof(usb_vendor_ids)/sizeof(usb_vendor_ids[0])))
typedef enum
{
OPT_COUNT = 0, /* option count */
@ -312,6 +321,9 @@ struct snapscan_scanner
/*
* $Log$
* Revision 1.7 2001/10/27 09:08:17 oliverschwartz
* Check USB vendor IDs to avoid hanging scanners, fix bug in dither matrix computation
*
* Revision 1.6 2001/10/12 21:19:16 oliverschwartz
* update to snapscan-20011012
*