diff options
-rw-r--r-- | tools/sane-find-scanner.c.orig | 2108 | ||||
-rw-r--r-- | tools/sane-find-scanner.c.rej | 22 |
2 files changed, 0 insertions, 2130 deletions
diff --git a/tools/sane-find-scanner.c.orig b/tools/sane-find-scanner.c.orig deleted file mode 100644 index 25e5954..0000000 --- a/tools/sane-find-scanner.c.orig +++ /dev/null @@ -1,2108 +0,0 @@ -/* sane-find-scanner.c - - Copyright (C) 1997-2013 Oliver Rauch, Henning Meier-Geinitz, and others. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - - */ - -#include "../include/sane/config.h" - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <dirent.h> -#include <errno.h> - -#if defined (HAVE_DDK_NTDDSCSI_H) || defined (HAVE_NTDDSCSI_H) -# define WIN32_SCSI -# include <windows.h> -# if defined (HAVE_DDK_NTDDSCSI_H) -# include <ddk/scsi.h> -# include <ddk/ntddscsi.h> -# elif defined (HAVE_NTDDSCSI_H) -# include <ntddscsi.h> -# endif -#endif - -#include "../include/sane/sanei.h" -#include "../include/sane/sanei_scsi.h" -#include "../include/sane/sanei_pa4s2.h" -#include "../include/sane/sanei_config.h" - -#ifdef HAVE_LIBUSB_LEGACY -#ifdef HAVE_LUSB0_USB_H -#include <lusb0_usb.h> -#else -#include <usb.h> -#endif -extern char * check_usb_chip (struct usb_device *dev, int verbosity, SANE_Bool from_file); -#endif - -#ifdef HAVE_LIBUSB -#include <libusb.h> -extern char * check_usb_chip (int verbosity, - struct libusb_device_descriptor desc, - libusb_device_handle *hdl, - struct libusb_config_descriptor *config0); -#endif - -#include "../include/sane/sanei_usb.h" - -#ifndef PATH_MAX -# define PATH_MAX 1024 -#endif - -static const char *prog_name; -static int verbose = 1; -static SANE_Bool force = SANE_FALSE; -static SANE_Bool device_found = SANE_FALSE; -static SANE_Bool libusb_device_found = SANE_FALSE; -static SANE_Bool unknown_found = SANE_FALSE; - -#ifdef HAVE_LIBUSB -libusb_context *sfs_usb_ctx; -#endif - -typedef struct -{ - unsigned char *cmd; - size_t size; -} -scsiblk; - -#define INQUIRY 0x12 -#define set_inquiry_return_size(icb,val) icb[0x04]=val -#define IN_periph_devtype_cpu 0x03 -#define IN_periph_devtype_scanner 0x06 -#define get_scsi_inquiry_vendor(in, buf) strncpy(buf, in + 0x08, 0x08) -#define get_scsi_inquiry_product(in, buf) strncpy(buf, in + 0x10, 0x010) -#define get_scsi_inquiry_version(in, buf) strncpy(buf, in + 0x20, 0x04) -#define get_scsi_inquiry_periph_devtype(in) (in[0] & 0x1f) -#define get_scsi_inquiry_additional_length(in) in[0x04] -#define set_scsi_inquiry_length(out,n) out[0x04]=n-5 - -static unsigned char inquiryC[] = { - INQUIRY, 0x00, 0x00, 0x00, 0xff, 0x00 -}; -static scsiblk inquiry = { - inquiryC, sizeof (inquiryC) -}; - -static void -usage (char *msg) -{ - fprintf (stderr, "Usage: %s [-hvqf] [devname ...]\n", prog_name); - fprintf (stderr, "\t-h: print this help message\n"); - fprintf (stderr, "\t-v: be more verbose (can be used multiple times)\n"); - fprintf (stderr, "\t-q: be quiet (print only devices, no comments)\n"); - fprintf (stderr, "\t-f: force opening devname as SCSI even if it looks " - "like USB\n"); - fprintf (stderr, "\t-p: enable scanning for parallel port devices\n"); -#ifdef HAVE_LIBUSB_LEGACY - fprintf (stderr, "\t-F file: try to detect chipset from given " - "/proc/bus/usb/devices file\n"); -#endif - if (msg) - fprintf (stderr, "\t%s\n", msg); -} - -/* if SCSI generic is optional on your OS, and there is a software test - which will determine if it is included, add it here. If you are sure - that SCSI generic was found, return 1. If SCSI generic is always - available in your OS, return 1 */ - -static int -check_sg (void) -{ -#if defined(__linux__) - /* Assumption: /proc/devices lines are shorter than 256 characters */ - char line[256], driver[256] = ""; - FILE *stream; - - stream = fopen ("/proc/devices", "r"); - /* Likely reason for failure, no /proc => probably no SG either */ - if (stream == NULL) - return 0; - - while (fgets (line, sizeof (line) - 1, stream)) - { - if (sscanf (line, " %*d %s\n", driver) > 0 && !strcmp (driver, "sg")) - break; - } - fclose (stream); - - if (strcmp (driver, "sg")) - { - return 0; - } - else - { - return 1; - } -#endif - return 1; /* Give up, and assume yes to avoid false negatives */ -} - -/* Display a buffer in the log. Display by lines of 16 bytes. */ -static void -hexdump (const char *comment, unsigned char *buf, const int length) -{ - int i; - char line[128]; - char *ptr; - char asc_buf[17]; - char *asc_ptr; - - printf (" %s\n", comment); - - i = 0; - goto start; - - do - { - if (i < length) - { - ptr += sprintf (ptr, " %2.2x", *buf); - - if (*buf >= 32 && *buf <= 127) - { - asc_ptr += sprintf (asc_ptr, "%c", *buf); - } - else - { - asc_ptr += sprintf (asc_ptr, "."); - } - } - else - { - /* After the length; do nothing. */ - ptr += sprintf (ptr, " "); - } - - i++; - buf++; - - if ((i % 16) == 0) - { - /* It's a new line */ - printf (" %s %s\n", line, asc_buf); - - start: - ptr = line; - *ptr = '\0'; - asc_ptr = asc_buf; - *asc_ptr = '\0'; - - ptr += sprintf (ptr, " %3.3d:", i); - } - - } - while (i < ((length + 15) & ~15)); -} - -static SANE_Status -scanner_do_scsi_inquiry (unsigned char *buffer, int sfd) -{ - size_t size; - SANE_Status status; - - memset (buffer, '\0', 256); /* clear buffer */ - - size = 5; /* first get only 5 bytes to get size of - inquiry_return_block */ - set_inquiry_return_size (inquiry.cmd, size); - status = sanei_scsi_cmd (sfd, inquiry.cmd, inquiry.size, buffer, &size); - - if (status != SANE_STATUS_GOOD) - return (status); - - size = get_scsi_inquiry_additional_length (buffer) + 5; - - /* then get inquiry with actual size */ - set_inquiry_return_size (inquiry.cmd, size); - status = sanei_scsi_cmd (sfd, inquiry.cmd, inquiry.size, buffer, &size); - - return (status); -} - -static void -scanner_identify_scsi_scanner (unsigned char *buffer, int sfd, - char *devicename) -{ - unsigned char vendor[9]; - unsigned char product[17]; - unsigned char version[5]; - unsigned char *pp; - unsigned int devtype; - SANE_Status status; - static char *devtypes[] = { - "disk", "tape", "printer", "processor", "CD-writer", - "CD-drive", "scanner", "optical-drive", "jukebox", - "communicator" - }; - status = scanner_do_scsi_inquiry (buffer, sfd); - if (status != SANE_STATUS_GOOD) - { - if (verbose > 1) - printf ("inquiry for device %s failed (%s)\n", - devicename, sane_strstatus (status)); - return; - } - - if (verbose > 2) - hexdump ("Inquiry for device:", buffer, - get_scsi_inquiry_additional_length (buffer) + 5); - - devtype = get_scsi_inquiry_periph_devtype (buffer); - if (verbose <= 1 && devtype != IN_periph_devtype_scanner - /* old HP scanners use the CPU id ... */ - && devtype != IN_periph_devtype_cpu) - return; /* no, continue searching */ - - get_scsi_inquiry_vendor ((char *) buffer, (char *) vendor); - get_scsi_inquiry_product ((char *) buffer, (char *) product); - get_scsi_inquiry_version ((char *) buffer, (char *) version); - - pp = &vendor[7]; - vendor[8] = '\0'; - while (pp >= vendor && (*pp == ' ' || *pp >= 127)) - *pp-- = '\0'; - - pp = &product[15]; - product[16] = '\0'; - while (pp >= product && (*pp == ' ' || *pp >= 127)) - *pp-- = '\0'; - - pp = &version[3]; - version[4] = '\0'; - while (pp >= version && (*pp == ' ' || *(pp - 1) >= 127)) - *pp-- = '\0'; - - device_found = SANE_TRUE; - printf ("found SCSI %s \"%s %s %s\" at %s\n", - devtype < NELEMS (devtypes) ? devtypes[devtype] : "unknown device", - vendor, product, version, devicename); - return; -} - -static void -check_scsi_file (char *file_name) -{ - int result; - int sfd; - unsigned char buffer[16384]; - - if (strstr (file_name, "usb") - || strstr (file_name, "uscanner") || strstr (file_name, "ugen")) - { - if (force) - { - if (verbose > 1) - printf ("checking %s even though it looks like a USB device...", - file_name); - } - else - { - if (verbose > 1) - printf ("ignored %s (not a SCSI device)\n", file_name); - return; - } - } - else if (verbose > 1) - printf ("checking %s...", file_name); - - result = sanei_scsi_open (file_name, &sfd, NULL, NULL); - - if (verbose > 1) - { - if (result != 0) - printf (" failed to open (%s)\n", sane_strstatus (result)); - else - printf (" open ok\n"); - } - - if (result == SANE_STATUS_GOOD) - { - scanner_identify_scsi_scanner (buffer, sfd, file_name); - sanei_scsi_close (sfd); - } - return; -} - -static void -check_usb_file (char *file_name) -{ - SANE_Status result; - SANE_Word vendor, product; - SANE_Int fd; - - if (!strstr (file_name, "usb") - && !strstr (file_name, "uscanner") && !strstr (file_name, "ugen")) - { - if (force) - { - if (verbose > 1) - printf ("checking %s even though doesn't look like a " - "USB device...", file_name); - } - else - { - if (verbose > 1) - printf ("ignored %s (not a USB device)\n", file_name); - return; - } - } - else if (verbose > 1) - printf ("checking %s...", file_name); - - result = sanei_usb_open (file_name, &fd); - - if (result != SANE_STATUS_GOOD) - { - if (verbose > 1) - printf (" failed to open (%s)\n", sane_strstatus (result)); - } - else - { - result = sanei_usb_get_vendor_product (fd, &vendor, &product); - if (result == SANE_STATUS_GOOD) - { - if (verbose > 1) - printf (" open ok, vendor and product ids were identified\n"); - printf ("found USB scanner (vendor=0x%04x, " - "product=0x%04x) at %s\n", vendor, product, file_name); - } - else - { - if (verbose > 1) - printf (" open ok, but vendor and product could NOT be " - "identified\n"); - printf ("found USB scanner (UNKNOWN vendor and product) " - "at device %s\n", file_name); - unknown_found = SANE_TRUE; - } - device_found = SANE_TRUE; - sanei_usb_close (fd); - } -} - -#ifdef HAVE_LIBUSB_LEGACY - -static char * -get_libusb_string_descriptor (struct usb_device *dev, int index) -{ - usb_dev_handle *handle; - char *buffer, short_buffer[2]; - struct usb_string_descriptor *sd; - int size = 2; - int i; - - if (!index) - return 0; - - handle = usb_open (dev); - if (!handle) - return 0; - - sd = (struct usb_string_descriptor *) short_buffer; - - if (usb_control_msg (handle, - USB_ENDPOINT_IN + USB_TYPE_STANDARD + USB_RECIP_DEVICE, - USB_REQ_GET_DESCRIPTOR, - (USB_DT_STRING << 8) + index, 0, short_buffer, - size, 1000) < 0) - { - usb_close (handle); - return 0; - } - - if (sd->bLength < 2 - || sd->bDescriptorType != USB_DT_STRING) - { - usb_close (handle); - return 0; - } - - size = sd->bLength; - - buffer = calloc (1, size + 1); - if (!buffer) - return 0; - - sd = (struct usb_string_descriptor *) buffer; - - if (usb_control_msg (handle, - USB_ENDPOINT_IN + USB_TYPE_STANDARD + USB_RECIP_DEVICE, - USB_REQ_GET_DESCRIPTOR, - (USB_DT_STRING << 8) + index, 0, buffer, - size, 1000) < 0) - { - usb_close (handle); - free (buffer); - return 0; - } - - if (sd->bLength < 2 || sd->bLength > size - || sd->bDescriptorType != USB_DT_STRING) - { - usb_close (handle); - free (buffer); - return 0; - } - size = sd->bLength - 2; - for (i = 0; i < (size / 2); i++) - buffer[i] = buffer[2 + 2 * i]; - buffer[i] = 0; - - usb_close (handle); - return buffer; -} - -static char * -get_libusb_vendor (struct usb_device *dev) -{ - return get_libusb_string_descriptor (dev, dev->descriptor.iManufacturer); -} - -static char * -get_libusb_product (struct usb_device *dev) -{ - return get_libusb_string_descriptor (dev, dev->descriptor.iProduct); -} - -static void -check_libusb_device (struct usb_device *dev, SANE_Bool from_file) -{ - int is_scanner = 0; - char *vendor; - char *product; - int interface_nr; - - if (!dev->config) - { - if (verbose > 1) - printf ("device 0x%04x/0x%04x is not configured\n", - dev->descriptor.idVendor, dev->descriptor.idProduct); - return; - } - - vendor = get_libusb_vendor (dev); - product = get_libusb_product (dev); - - if (verbose > 2) - { - /* print everything we know about the device */ - char *buf; - int config_nr; - struct usb_device_descriptor *d = &dev->descriptor; - - printf ("\n"); - printf ("<device descriptor of 0x%04x/0x%04x at %s:%s", - d->idVendor, d->idProduct, dev->bus->dirname, dev->filename); - if (vendor || product) - { - printf (" (%s%s%s)", vendor ? vendor : "", - (vendor && product) ? " " : "", product ? product : ""); - } - printf (">\n"); - printf ("bLength %d\n", d->bLength); - printf ("bDescriptorType %d\n", d->bDescriptorType); - printf ("bcdUSB %d.%d%d\n", d->bcdUSB >> 8, - (d->bcdUSB >> 4) & 15, d->bcdUSB & 15); - printf ("bDeviceClass %d\n", d->bDeviceClass); - printf ("bDeviceSubClass %d\n", d->bDeviceSubClass); - printf ("bDeviceProtocol %d\n", d->bDeviceProtocol); - printf ("bMaxPacketSize0 %d\n", d->bMaxPacketSize0); - printf ("idVendor 0x%04X\n", d->idVendor); - printf ("idProduct 0x%04X\n", d->idProduct); - printf ("bcdDevice %d.%d%d\n", d->bcdDevice >> 8, - (d->bcdDevice >> 4) & 15, d->bcdDevice & 15); - printf ("iManufacturer %d (%s)\n", d->iManufacturer, - (vendor) ? vendor : ""); - printf ("iProduct %d (%s)\n", d->iProduct, - (product) ? product : ""); - - buf = get_libusb_string_descriptor (dev, d->iSerialNumber); - printf ("iSerialNumber %d (%s)\n", d->iSerialNumber, - (buf) ? buf : ""); - if (buf) - free (buf); - printf ("bNumConfigurations %d\n", d->bNumConfigurations); - - for (config_nr = 0; config_nr < d->bNumConfigurations; config_nr++) - { - struct usb_config_descriptor *c = &dev->config[config_nr]; - int interface_nr; - - printf (" <configuration %d>\n", config_nr); - printf (" bLength %d\n", c->bLength); - printf (" bDescriptorType %d\n", c->bDescriptorType); - printf (" wTotalLength %d\n", c->wTotalLength); - printf (" bNumInterfaces %d\n", c->bNumInterfaces); - printf (" bConfigurationValue %d\n", c->bConfigurationValue); - buf = get_libusb_string_descriptor (dev, c->iConfiguration); - printf (" iConfiguration %d (%s)\n", c->iConfiguration, - (buf) ? buf : ""); - if (buf) - free (buf); - printf (" bmAttributes %d (%s%s)\n", c->bmAttributes, - c->bmAttributes & 64 ? "Self-powered" : "", - c->bmAttributes & 32 ? "Remote Wakeup" : ""); - printf (" MaxPower %d mA\n", c->MaxPower * 2); - - for (interface_nr = 0; interface_nr < c->bNumInterfaces; - interface_nr++) - { - struct usb_interface *interface = &c->interface[interface_nr]; - int alt_setting_nr; - - printf (" <interface %d>\n", interface_nr); - for (alt_setting_nr = 0; - alt_setting_nr < interface->num_altsetting; - alt_setting_nr++) - { - struct usb_interface_descriptor *i - = &interface->altsetting[alt_setting_nr]; - int ep_nr; - printf (" <altsetting %d>\n", alt_setting_nr); - printf (" bLength %d\n", i->bLength); - printf (" bDescriptorType %d\n", i->bDescriptorType); - printf (" bInterfaceNumber %d\n", i->bInterfaceNumber); - printf (" bAlternateSetting %d\n", i->bAlternateSetting); - printf (" bNumEndpoints %d\n", i->bNumEndpoints); - printf (" bInterfaceClass %d\n", i->bInterfaceClass); - printf (" bInterfaceSubClass %d\n", - i->bInterfaceSubClass); - printf (" bInterfaceProtocol %d\n", - i->bInterfaceProtocol); - buf = get_libusb_string_descriptor (dev, i->iInterface); - printf (" iInterface %d (%s)\n", i->iInterface, - (buf) ? buf : ""); - if (buf) - free (buf); - - for (ep_nr = 0; ep_nr < i->bNumEndpoints; ep_nr++) - { - struct usb_endpoint_descriptor *e = &i->endpoint[ep_nr]; - char *ep_type; - - switch (e->bmAttributes & USB_ENDPOINT_TYPE_MASK) - { - case USB_ENDPOINT_TYPE_CONTROL: - ep_type = "control"; - break; - case USB_ENDPOINT_TYPE_ISOCHRONOUS: - ep_type = "isochronous"; - break; - case USB_ENDPOINT_TYPE_BULK: - ep_type = "bulk"; - break; - case USB_ENDPOINT_TYPE_INTERRUPT: - ep_type = "interrupt"; - break; - default: - ep_type = "unknown"; - break; - } - printf (" <endpoint %d>\n", ep_nr); - printf (" bLength %d\n", e->bLength); - printf (" bDescriptorType %d\n", - e->bDescriptorType); - printf (" bEndpointAddress 0x%02X (%s 0x%02X)\n", - e->bEndpointAddress, - e->bEndpointAddress & USB_ENDPOINT_DIR_MASK ? - "in" : "out", - e-> - bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK); - printf (" bmAttributes %d (%s)\n", - e->bmAttributes, ep_type); - printf (" wMaxPacketSize %d\n", - e->wMaxPacketSize); - printf (" bInterval %d ms\n", e->bInterval); - printf (" bRefresh %d\n", e->bRefresh); - printf (" bSynchAddress %d\n", e->bSynchAddress); - } - } - } - } - - } - - /* Some heuristics, which device may be a scanner */ - if (dev->descriptor.idVendor == 0) /* hub */ - --is_scanner; - if (dev->descriptor.idProduct == 0) /* hub */ - --is_scanner; - - for (interface_nr = 0; interface_nr < dev->config[0].bNumInterfaces && is_scanner <= 0; interface_nr++) - { - switch (dev->descriptor.bDeviceClass) - { - case USB_CLASS_VENDOR_SPEC: - ++is_scanner; - break; - case USB_CLASS_PER_INTERFACE: - if (dev->config[0].interface[interface_nr].num_altsetting == 0 || - !dev->config[0].interface[interface_nr].altsetting) - break; - switch (dev->config[0].interface[interface_nr].altsetting[0].bInterfaceClass) - { - case USB_CLASS_VENDOR_SPEC: - case USB_CLASS_PER_INTERFACE: - case 16: /* data? */ - ++is_scanner; - break; - } - break; - } - } - - if (is_scanner > 0) - { - char * chipset = check_usb_chip (dev, verbose, from_file); - - printf ("found USB scanner (vendor=0x%04x", dev->descriptor.idVendor); - if (vendor) - printf (" [%s]", vendor); - printf (", product=0x%04x", dev->descriptor.idProduct); - if (product) - printf (" [%s]", product); - if (chipset) - printf (", chip=%s", chipset); - if (from_file) - printf (")\n"); - else - printf (") at libusb:%s:%s\n", dev->bus->dirname, dev->filename); - - libusb_device_found = SANE_TRUE; - device_found = SANE_TRUE; - } - - if (vendor) - free (vendor); - - if (product) - free (product); -} -#endif /* HAVE_LIBUSB_LEGACY */ - - -#ifdef HAVE_LIBUSB -static char * -sfs_libusb_strerror (int errcode) -{ - /* Error codes & descriptions from the libusb-1.0 documentation */ - - switch (errcode) - { - case LIBUSB_SUCCESS: - return "Success (no error)"; - - case LIBUSB_ERROR_IO: - return "Input/output error"; - - case LIBUSB_ERROR_INVALID_PARAM: - return "Invalid parameter"; - - case LIBUSB_ERROR_ACCESS: - return "Access denied (insufficient permissions)"; - - case LIBUSB_ERROR_NO_DEVICE: - return "No such device (it may have been disconnected)"; - - case LIBUSB_ERROR_NOT_FOUND: - return "Entity not found"; - - case LIBUSB_ERROR_BUSY: - return "Resource busy"; - - case LIBUSB_ERROR_TIMEOUT: - return "Operation timed out"; - - case LIBUSB_ERROR_OVERFLOW: - return "Overflow"; - - case LIBUSB_ERROR_PIPE: - return "Pipe error"; - - case LIBUSB_ERROR_INTERRUPTED: - return "System call interrupted (perhaps due to signal)"; - - case LIBUSB_ERROR_NO_MEM: - return "Insufficient memory"; - - case LIBUSB_ERROR_NOT_SUPPORTED: - return "Operation not supported or unimplemented on this platform"; - - case LIBUSB_ERROR_OTHER: - return "Other error"; - - default: - return "Unknown libusb-1.0 error code"; - } -} - -static char * -get_libusb_string_descriptor (libusb_device_handle *hdl, int index) -{ - unsigned char *buffer, short_buffer[2]; - int size; - int ret; - int i; - - if (!index) - return NULL; - - ret = libusb_get_descriptor (hdl, LIBUSB_DT_STRING, index, - short_buffer, sizeof (short_buffer)); - if (ret < 0) - { - printf ("could not fetch string descriptor: %s\n", - sfs_libusb_strerror (ret)); - return NULL; - } - - if ((short_buffer[0] < 2) /* descriptor length */ - || (short_buffer[1] != LIBUSB_DT_STRING)) /* descriptor type */ - return NULL; - - size = short_buffer[0]; - - buffer = calloc (1, size + 1); - if (!buffer) - return NULL; - - ret = libusb_get_descriptor (hdl, LIBUSB_DT_STRING, index, - buffer, size); - if (ret < 0) - { - printf ("could not fetch string descriptor (again): %s\n", - sfs_libusb_strerror (ret)); - free (buffer); - return NULL; - } - - if ((buffer[0] < 2) || (buffer[0] > size) /* descriptor length */ - || (buffer[1] != LIBUSB_DT_STRING)) /* descriptor type */ - { - free (buffer); - return NULL; - } - - size = buffer[0] - 2; - for (i = 0; i < (size / 2); i++) - buffer[i] = buffer[2 + 2 * i]; - buffer[i] = '\0'; - - return (char *) buffer; -} - -static void -check_libusb_device (libusb_device *dev, SANE_Bool from_file) -{ - libusb_device_handle *hdl; - struct libusb_device_descriptor desc; - struct libusb_config_descriptor *config0; - - int is_scanner = 0; - char *vendor; - char *product; - unsigned short vid, pid; - unsigned char busno, address; - int config; - int intf; - int ret; - - busno = libusb_get_bus_number (dev); - address = libusb_get_device_address (dev); - - ret = libusb_get_device_descriptor (dev, &desc); - if (ret < 0) - { - printf ("could not get device descriptor for device at %03d:%03d: %s\n", - busno, address, sfs_libusb_strerror (ret)); - return; - } - - vid = desc.idVendor; - pid = desc.idProduct; - - ret = libusb_open (dev, &hdl); - if (ret < 0) - { - printf ("could not open USB device 0x%04x/0x%04x at %03d:%03d: %s\n", - vid, pid, busno, address, sfs_libusb_strerror (ret)); - return; - } - - ret = libusb_get_configuration (hdl, &config); - if (ret < 0) - { - printf ("could not get configuration for device 0x%04x/0x%04x at %03d:%03d: %s\n", - vid, pid, busno, address, sfs_libusb_strerror (ret)); - libusb_close (hdl); - return; - } - - if (config == 0) - { - if (verbose > 1) - printf ("device 0x%04x/0x%04x at %03d:%03d is not configured\n", - vid, pid, busno, address); - libusb_close (hdl); - return; - } - - vendor = get_libusb_string_descriptor (hdl, desc.iManufacturer); - product = get_libusb_string_descriptor (hdl, desc.iProduct); - - if (verbose > 2) - { - /* print everything we know about the device */ - char *buf; - int config_nr; - - printf ("\n"); - printf ("<device descriptor of 0x%04x/0x%04x at %03d:%03d", - vid, pid, busno, address); - if (vendor || product) - { - printf (" (%s%s%s)", (vendor) ? vendor : "", - (vendor && product) ? " " : "", (product) ? product : ""); - } - printf (">\n"); - printf ("bLength %d\n", desc.bLength); - printf ("bDescriptorType %d\n", desc.bDescriptorType); - printf ("bcdUSB %d.%d%d\n", desc.bcdUSB >> 8, - (desc.bcdUSB >> 4) & 15, desc.bcdUSB & 15); - printf ("bDeviceClass %d\n", desc.bDeviceClass); - printf ("bDeviceSubClass %d\n", desc.bDeviceSubClass); - printf ("bDeviceProtocol %d\n", desc.bDeviceProtocol); - printf ("bMaxPacketSize0 %d\n", desc.bMaxPacketSize0); - printf ("idVendor 0x%04X\n", desc.idVendor); - printf ("idProduct 0x%04X\n", desc.idProduct); - printf ("bcdDevice %d.%d%d\n", desc.bcdDevice >> 8, - (desc.bcdDevice >> 4) & 15, desc.bcdDevice & 15); - printf ("iManufacturer %d (%s)\n", desc.iManufacturer, - (vendor) ? vendor : ""); - printf ("iProduct %d (%s)\n", desc.iProduct, - (product) ? product : ""); - buf = get_libusb_string_descriptor (hdl, desc.iSerialNumber); - printf ("iSerialNumber %d (%s)\n", desc.iSerialNumber, - (buf) ? buf : ""); - if (buf) - free (buf); - printf ("bNumConfigurations %d\n", desc.bNumConfigurations); - - for (config_nr = 0; config_nr < desc.bNumConfigurations; config_nr++) - { - struct libusb_config_descriptor *c; - - ret = libusb_get_config_descriptor (dev, config_nr, &c); - if (ret < 0) - { - printf ("could not get configuration descriptor %d: %s\n", - config_nr, sfs_libusb_strerror (ret)); - continue; - } - - printf (" <configuration %d>\n", config_nr); - printf (" bLength %d\n", c->bLength); - printf (" bDescriptorType %d\n", c->bDescriptorType); - printf (" wTotalLength %d\n", c->wTotalLength); - printf (" bNumInterfaces %d\n", c->bNumInterfaces); - printf (" bConfigurationValue %d\n", c->bConfigurationValue); - - buf = get_libusb_string_descriptor (hdl, c->iConfiguration); - printf (" iConfiguration %d (%s)\n", c->iConfiguration, - (buf) ? buf : ""); - free (buf); - - printf (" bmAttributes %d (%s%s)\n", c->bmAttributes, - c->bmAttributes & 64 ? "Self-powered" : "", - c->bmAttributes & 32 ? "Remote Wakeup" : ""); - printf (" MaxPower %d mA\n", c->MaxPower * 2); - - for (intf = 0; intf < c->bNumInterfaces; intf++) - { - const struct libusb_interface *interface; - int alt_setting_nr; - - interface = &c->interface[intf]; - - printf (" <interface %d>\n", intf); - for (alt_setting_nr = 0; - alt_setting_nr < interface->num_altsetting; - alt_setting_nr++) - { - const struct libusb_interface_descriptor *i; - int ep_nr; - - i = &interface->altsetting[alt_setting_nr]; - - printf (" <altsetting %d>\n", alt_setting_nr); - printf (" bLength %d\n", i->bLength); - printf (" bDescriptorType %d\n", i->bDescriptorType); - printf (" bInterfaceNumber %d\n", i->bInterfaceNumber); - printf (" bAlternateSetting %d\n", i->bAlternateSetting); - printf (" bNumEndpoints %d\n", i->bNumEndpoints); - printf (" bInterfaceClass %d\n", i->bInterfaceClass); - printf (" bInterfaceSubClass %d\n", - i->bInterfaceSubClass); - printf (" bInterfaceProtocol %d\n", - i->bInterfaceProtocol); - - buf = NULL; - buf = get_libusb_string_descriptor (hdl, i->iInterface); - printf (" iInterface %d (%s)\n", i->iInterface, - (buf) ? buf : ""); - free (buf); - for (ep_nr = 0; ep_nr < i->bNumEndpoints; ep_nr++) - { - const struct libusb_endpoint_descriptor *e; - char *ep_type; - - e = &i->endpoint[ep_nr]; - - switch (e->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) - { - case LIBUSB_TRANSFER_TYPE_CONTROL: - ep_type = "control"; - break; - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - ep_type = "isochronous"; - break; - case LIBUSB_TRANSFER_TYPE_BULK: - ep_type = "bulk"; - break; - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - ep_type = "interrupt"; - break; - default: - ep_type = "unknown"; - break; - } - printf (" <endpoint %d>\n", ep_nr); - printf (" bLength %d\n", e->bLength); - printf (" bDescriptorType %d\n", - e->bDescriptorType); - printf (" bEndpointAddress 0x%02X (%s 0x%02X)\n", - e->bEndpointAddress, - e->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK ? - "in" : "out", - e-> - bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK); - printf (" bmAttributes %d (%s)\n", - e->bmAttributes, ep_type); - printf (" wMaxPacketSize %d\n", - e->wMaxPacketSize); - printf (" bInterval %d ms\n", e->bInterval); - printf (" bRefresh %d\n", e->bRefresh); - printf (" bSynchAddress %d\n", e->bSynchAddress); - } - } - } - } - } - - - /* Some heuristics, which device may be a scanner */ - if (desc.idVendor == 0) /* hub */ - --is_scanner; - if (desc.idProduct == 0) /* hub */ - --is_scanner; - - ret = libusb_get_config_descriptor (dev, 0, &config0); - if (ret < 0) - { - printf ("could not get config[0] descriptor: %s\n", - sfs_libusb_strerror (ret)); - - goto out_free; - } - - for (intf = 0; (intf < config0->bNumInterfaces) && (is_scanner <= 0); intf++) - { - switch (desc.bDeviceClass) - { - case USB_CLASS_VENDOR_SPEC: - ++is_scanner; - break; - case USB_CLASS_PER_INTERFACE: - if ((config0->interface[intf].num_altsetting == 0) - || !config0->interface[intf].altsetting) - break; - switch (config0->interface[intf].altsetting[0].bInterfaceClass) - { - case USB_CLASS_VENDOR_SPEC: - case USB_CLASS_PER_INTERFACE: - case 16: /* data? */ - ++is_scanner; - break; - } - break; - } - } - - if (is_scanner > 0) - { - char *chipset = NULL; - - if(!from_file) - chipset = check_usb_chip (verbose, desc, hdl, config0); - - printf ("found USB scanner (vendor=0x%04x", vid); - if (vendor) - printf (" [%s]", vendor); - printf (", product=0x%04x", pid); - if (product) - printf (" [%s]", product); - if (chipset) - printf (", chip=%s", chipset); - if (from_file) - printf (")\n"); - else - printf (") at libusb:%03d:%03d\n", busno, address); - - libusb_device_found = SANE_TRUE; - device_found = SANE_TRUE; - } - - libusb_free_config_descriptor (config0); - - out_free: - libusb_close (hdl); - if (vendor) - free (vendor); - - if (product) - free (product); -} -#endif /* HAVE_LIBUSB */ - - -static DIR * -scan_directory (char *dir_name) -{ - struct stat stat_buf; - DIR *dir; - - if (verbose > 2) - printf ("scanning directory %s\n", dir_name); - - if (stat (dir_name, &stat_buf) < 0) - { - if (verbose > 1) - printf ("cannot stat `%s' (%s)\n", dir_name, strerror (errno)); - return 0; - } - if (!S_ISDIR (stat_buf.st_mode)) - { - if (verbose > 1) - printf ("`%s' is not a directory\n", dir_name); - return 0; - } - if ((dir = opendir (dir_name)) == 0) - { - if (verbose > 1) - printf ("cannot read directory `%s' (%s)\n", dir_name, - strerror (errno)); - return 0; - } - return dir; -} - -static char * -get_next_file (char *dir_name, DIR * dir) -{ - struct dirent *dir_entry; - static char file_name[PATH_MAX]; - - do - { - dir_entry = readdir (dir); - if (!dir_entry) - return 0; - } - while (strcmp (dir_entry->d_name, ".") == 0 - || strcmp (dir_entry->d_name, "..") == 0); - - if (strlen (dir_name) + strlen (dir_entry->d_name) + 1 > PATH_MAX) - { - if (verbose > 1) - printf ("filename too long\n"); - return 0; - } - sprintf (file_name, "%s%s", dir_name, dir_entry->d_name); - return file_name; -} - -#if defined(WIN32_SCSI) -/* Return a list of potential scanners. There's a lot of hardcoded values here that might break on a system with lots of scsi devices. */ -static char **build_scsi_dev_list(void) -{ - char **dev_list; - int dev_list_index; - int hca; - HANDLE fd; - char scsi_hca_name[20]; - char buffer[4096]; - DWORD BytesReturned; - BOOL ret; - size_t dev_list_size; - PSCSI_ADAPTER_BUS_INFO adapter; - PSCSI_INQUIRY_DATA inquiry; - int i; - - /* Allocate room for about 100 scanners. That should be enough. */ - dev_list_size = 100; - dev_list_index = 0; - dev_list = calloc(1, dev_list_size * sizeof(char *)); - - hca = 0; - - for(hca = 0; ; hca++) { - - /* Open the adapter */ - snprintf(scsi_hca_name, 20, "\\\\.\\Scsi%d:", hca); - fd = CreateFile(scsi_hca_name, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, - FILE_FLAG_RANDOM_ACCESS, NULL ); - - if (fd == INVALID_HANDLE_VALUE) { - /* Assume there is no more adapter. This is wrong in the case - * of hot-plug stuff, but I have yet to see it on a user - * machine. */ - break; - } - - /* Get the inquiry info for the devices on that hca. */ - ret = DeviceIoControl(fd, - IOCTL_SCSI_GET_INQUIRY_DATA, - NULL, - 0, - buffer, - sizeof(buffer), - &BytesReturned, - FALSE); - - if(ret == 0) - { - CloseHandle(fd); - continue; - } - - adapter = (PSCSI_ADAPTER_BUS_INFO)buffer; - - for(i = 0; i < adapter->NumberOfBuses; i++) { - - if (adapter->BusData[i].InquiryDataOffset == 0) { - /* No device here */ - continue; - } - - inquiry = (PSCSI_INQUIRY_DATA) (buffer + - adapter->BusData[i].InquiryDataOffset); - while(1) { - /* Check if it is a scanner or a processor - * device. Ignore the other - * device types. */ - if (inquiry->InquiryDataLength >= 5 && - ((inquiry->InquiryData[0] & 0x1f) == 3 || - (inquiry->InquiryData[0] & 0x1f) == 6)) { - char device_name[20]; - sprintf(device_name, "h%db%dt%dl%d", hca, inquiry->PathId, inquiry->TargetId, inquiry->Lun); - dev_list[dev_list_index] = strdup(device_name); - dev_list_index++; - } - - if (inquiry->NextInquiryDataOffset == 0) { - /* No device here */ - break; - } else { - inquiry = (PSCSI_INQUIRY_DATA) (buffer + - inquiry->NextInquiryDataOffset); - } - } - } - - CloseHandle(fd); - - } - - return dev_list; - -} -#endif - -#if defined (HAVE_IOKIT_CDB_IOSCSILIB_H) || \ - defined (HAVE_IOKIT_SCSI_SCSICOMMANDOPERATIONCODES_H) || \ - defined (HAVE_IOKIT_SCSI_COMMANDS_SCSICOMMANDOPERATIONCODES_H) -char **scsi_dev_list; -int scsi_dev_list_index; - -static SANE_Status AddToSCSIDeviceList (const char *dev) { - if (scsi_dev_list_index < 99) { - scsi_dev_list [scsi_dev_list_index] = strdup (dev); - scsi_dev_list_index++; - return SANE_STATUS_GOOD; - } - else - return SANE_STATUS_NO_MEM; -} - -static char **build_scsi_dev_list(void) -{ - scsi_dev_list_index = 0; - scsi_dev_list = malloc (100 * sizeof(char *)); - sanei_scsi_find_devices (NULL, NULL, NULL, -1, -1, -1, -1, - AddToSCSIDeviceList); - scsi_dev_list [scsi_dev_list_index] = NULL; - return scsi_dev_list; -} -#endif - -static int -check_mustek_pp_device (void) -{ - const char **devices; - int ctr = 0, found = 0, scsi = 0; - - if (verbose > 1) - printf ("searching for Mustek parallel port scanners:\n"); - - devices = sanei_pa4s2_devices (); - - while (devices[ctr] != NULL) { - int fd; - SANE_Status result; - - /* ordinary parallel port scanner type */ - if (verbose > 1) - printf ("checking %s...", devices[ctr]); - - result = sanei_pa4s2_open (devices[ctr], &fd); - - if (verbose > 1) - { - if (result != 0) - printf (" failed to open (%s)\n", sane_strstatus (result)); - else - printf (" open ok\n"); - } - - if (result == 0) { - printf ("found possible Mustek parallel port scanner at \"%s\"\n", - devices[ctr]); - found++; - sanei_pa4s2_close(fd); - } - - /* trying scsi over pp devices */ - if (verbose > 1) - printf ("checking %s (SCSI emulation)...", devices[ctr]); - - result = sanei_pa4s2_scsi_pp_open (devices[ctr], &fd); - - if (verbose > 1) - { - if (result != 0) - printf (" failed to open (%s)\n", sane_strstatus (result)); - else - printf (" open ok\n"); - } - - if (result == 0) { - printf ("found possible Mustek SCSI over PP scanner at \"%s\"\n", - devices[ctr]); - scsi++; - sanei_pa4s2_close(fd); - } - - ctr++; - } - - free(devices); - - if (found > 0 && verbose > 0) - printf("\n # Your Mustek parallel port scanner was detected. It may or\n" - " # may not be supported by SANE. Please read the sane-mustek_pp\n" - " # man-page for setup instructions.\n"); - - if (scsi > 0 && verbose > 0) - printf("\n # Your Mustek parallel port scanner was detected. It may or\n" - " # may not be supported by SANE. Please read the sane-mustek_pp\n" - " # man-page for setup instructions.\n"); - - return (found > 0 || scsi > 0); -} - -#ifdef HAVE_LIBUSB_LEGACY -static SANE_Bool -parse_num (char* search, const char* line, int base, long int * number) -{ - char* start_number; - - start_number = strstr (line, search); - if (start_number == NULL) - return SANE_FALSE; - start_number += strlen (search); - - *number = strtol (start_number, NULL, base); - if (verbose > 2) - printf ("Found %s%ld\n", search, *number); - return SANE_TRUE; -} - -static SANE_Bool -parse_bcd (char* search, const char* line, long int * number) -{ - char* start_number; - char* end_number; - int first_part; - int second_part; - - start_number = strstr (line, search); - if (start_number == NULL) - return SANE_FALSE; - start_number += strlen (search); - - first_part = strtol (start_number, &end_number, 10); - start_number = end_number + 1; /* skip colon */ - second_part = strtol (start_number, NULL, 10); - *number = ((first_part / 10) << 12) + ((first_part % 10) << 8) - + ((second_part / 10) << 4) + (second_part % 10); - if (verbose > 2) - printf ("Found %s%ld\n", search, *number); - return SANE_TRUE; -} - -static void -parse_file (char *filename) -{ - FILE * parsefile; - char line [PATH_MAX], *token; - const char * p; - struct usb_device *dev = 0; - long int number = 0; - int current_config = 1; - int current_if = -1; - int current_as = -1; - int current_ep = -1; - - if (verbose > 1) - printf ("trying to open %s\n", filename); - parsefile = fopen (filename, "r"); - - if (parsefile == NULL) - { - if (verbose > 0) - printf ("opening %s failed: %s\n", filename, strerror (errno)); - return; - } - - while (sanei_config_read (line, PATH_MAX, parsefile)) - { - if (verbose > 2) - printf ("parsing line: `%s'\n", line); - p = sanei_config_get_string (line, &token); - if (!token || !p || token[0] == '\0') - continue; - if (token[1] != ':') - { - if (verbose > 2) - printf ("missing `:'?\n"); - continue; - } - switch (token[0]) - { - case 'T': - if (dev) - check_libusb_device (dev, SANE_TRUE); - dev = calloc (1, sizeof (struct usb_device)); - dev->bus = calloc (1, sizeof (struct usb_bus)); - current_config = 1; - current_if = -1; - current_as = -1; - current_ep = -1; - break; - case 'D': - if (parse_bcd ("Ver=", line, &number)) - dev->descriptor.bcdUSB = number; - if (parse_num ("Cls=", line, 16, &number)) - dev->descriptor.bDeviceClass = number; - if (parse_num ("Sub=", line, 16, &number)) - dev->descriptor.bDeviceSubClass = number; - if (parse_num ("Prot=", line, 16, &number)) - dev->descriptor.bDeviceProtocol = number; - if (parse_num ("MxPS=", line, 10, &number)) - dev->descriptor.bMaxPacketSize0 = number; - if (parse_num ("#Cfgs=", line, 10, &number)) - dev->descriptor.bNumConfigurations = number; - dev->config = calloc (number, sizeof (struct usb_config_descriptor)); - break; - case 'P': - if (parse_num ("Vendor=", line, 16, &number)) - dev->descriptor.idVendor = number; - if (parse_num ("ProdID=", line, 16, &number)) - dev->descriptor.idProduct = number; - if (parse_bcd ("Rev=", line, &number)) - dev->descriptor.bcdDevice = number; - break; - case 'C': - current_if = -1; - current_as = -1; - current_ep = -1; - if (parse_num ("Cfg#=", line, 10, &number)) - { - current_config = number - 1; - dev->config[current_config].bConfigurationValue = number; - } - if (parse_num ("Ifs=", line, 10, &number)) - dev->config[current_config].bNumInterfaces = number; - dev->config[current_config].interface - = calloc (number, sizeof (struct usb_interface)); - if (parse_num ("Atr=", line, 16, &number)) - dev->config[current_config].bmAttributes = number; - if (parse_num ("MxPwr=", line, 10, &number)) - dev->config[current_config].MaxPower = number / 2; - break; - case 'I': - current_ep = -1; - if (parse_num ("If#=", line, 10, &number)) - { - if (current_if != number) - { - current_if = number; - current_as = -1; - dev->config[current_config].interface[current_if].altsetting - = calloc (20, sizeof (struct usb_interface_descriptor)); - /* Can't read number of altsettings */ - dev->config[current_config].interface[current_if].num_altsetting = 1; - } - else - dev->config[current_config].interface[current_if].num_altsetting++; - } - if (parse_num ("Alt=", line, 10, &number)) - { - current_as = number; - dev->config[current_config].interface[current_if].altsetting[current_as].bInterfaceNumber - = current_if; - dev->config[current_config].interface[current_if].altsetting[current_as].bAlternateSetting - = current_as; - } - if (parse_num ("#EPs=", line, 10, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as].bNumEndpoints - = number; - dev->config[current_config].interface[current_if].altsetting[current_as].endpoint - = calloc (number, sizeof (struct usb_endpoint_descriptor)); - if (parse_num ("Cls=", line, 16, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as].bInterfaceClass - = number; - if (parse_num ("Sub=", line, 16, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as].bInterfaceSubClass - = number; - if (parse_num ("Prot=", line, 16, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as].bInterfaceProtocol - = number; - break; - case 'E': - current_ep++; - if (parse_num ("Ad=", line, 16, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as] - .endpoint[current_ep].bEndpointAddress = number; - if (parse_num ("Atr=", line, 16, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as] - .endpoint[current_ep].bmAttributes = number; - if (parse_num ("MxPS=", line, 10, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as] - .endpoint[current_ep].wMaxPacketSize = number; - if (parse_num ("Ivl=", line, 10, &number)) - dev->config[current_config].interface[current_if].altsetting[current_as] - .endpoint[current_ep].bInterval = number; - break; - case 'S': - case 'B': - continue; - default: - if (verbose > 1) - printf ("ignoring unknown line identifier: %c\n", token[0]); - continue; - } - free (token); - } - if (dev) - check_libusb_device (dev, SANE_TRUE); - fclose (parsefile); - return; -} -#endif - -int -main (int argc, char **argv) -{ - char **dev_list, **usb_dev_list, *dev_name, **ap; - int enable_pp_checks = SANE_FALSE; - - prog_name = strrchr (argv[0], '/'); - if (prog_name) - ++prog_name; - else - prog_name = argv[0]; - - for (ap = argv + 1; ap < argv + argc; ++ap) - { - if ((*ap)[0] != '-') - break; - switch ((*ap)[1]) - { - case '?': - case 'h': - usage (0); - exit (0); - - case 'v': - ++verbose; - break; - - case 'q': - --verbose; - break; - - case 'f': - force = SANE_TRUE; - break; - - case 'p': - enable_pp_checks = SANE_TRUE; - break; - - case 'F': -#ifdef HAVE_LIBUSB_LEGACY - parse_file ((char *) (*(++ap))); -#elif defined(HAVE_LIBUSB) - printf ("option -F not implemented with libusb-1.0\n"); -#else - printf ("libusb not available: option -F can't be used\n"); -#endif - exit (0); - - case '-': - if (!strcmp((*ap), "--help")) - { - usage (0); - exit (0); - } - // fall through - default: - printf ("unknown option: -%c, try -h for help\n", (*ap)[1]); - exit (0); - } - } - if (ap < argv + argc) - { - dev_list = ap; - usb_dev_list = ap; - } - else - { - static char *default_dev_list[] = { -#if defined(__sgi) - "/dev/scsi/sc0d1l0", "/dev/scsi/sc0d2l0", - "/dev/scsi/sc0d3l0", "/dev/scsi/sc0d4l0", - "/dev/scsi/sc0d5l0", "/dev/scsi/sc0d6l0", - "/dev/scsi/sc0d7l0", "/dev/scsi/sc0d8l0", - "/dev/scsi/sc0d9l0", "/dev/scsi/sc0d10l0", - "/dev/scsi/sc0d11l0", "/dev/scsi/sc0d12l0", - "/dev/scsi/sc0d13l0", "/dev/scsi/sc0d14l0", - "/dev/scsi/sc0d15l0", - "/dev/scsi/sc1d1l0", "/dev/scsi/sc1d2l0", - "/dev/scsi/sc1d3l0", "/dev/scsi/sc1d4l0", - "/dev/scsi/sc1d5l0", "/dev/scsi/sc1d6l0", - "/dev/scsi/sc1d7l0", "/dev/scsi/sc1d8l0", - "/dev/scsi/sc1d9l0", "/dev/scsi/sc1d10l0", - "/dev/scsi/sc1d11l0", "/dev/scsi/sc1d12l0", - "/dev/scsi/sc1d13l0", "/dev/scsi/sc1d14l0", - "/dev/scsi/sc1d15l0", - "/dev/scsi/sc2d1l0", "/dev/scsi/sc2d2l0", - "/dev/scsi/sc2d3l0", "/dev/scsi/sc2d4l0", - "/dev/scsi/sc2d5l0", "/dev/scsi/sc2d6l0", - "/dev/scsi/sc2d7l0", "/dev/scsi/sc2d8l0", - "/dev/scsi/sc2d9l0", "/dev/scsi/sc2d10l0", - "/dev/scsi/sc2d11l0", "/dev/scsi/sc2d12l0", - "/dev/scsi/sc2d13l0", "/dev/scsi/sc2d14l0", - "/dev/scsi/sc2d15l0", - "/dev/scsi/sc3d1l0", "/dev/scsi/sc3d2l0", - "/dev/scsi/sc3d3l0", "/dev/scsi/sc3d4l0", - "/dev/scsi/sc3d5l0", "/dev/scsi/sc3d6l0", - "/dev/scsi/sc3d7l0", "/dev/scsi/sc3d8l0", - "/dev/scsi/sc3d9l0", "/dev/scsi/sc3d10l0", - "/dev/scsi/sc3d11l0", "/dev/scsi/sc3d12l0", - "/dev/scsi/sc3d13l0", "/dev/scsi/sc3d14l0", - "/dev/scsi/sc3d15l0", - "/dev/scsi/sc4d1l0", "/dev/scsi/sc4d2l0", - "/dev/scsi/sc4d3l0", "/dev/scsi/sc4d4l0", - "/dev/scsi/sc4d5l0", "/dev/scsi/sc4d6l0", - "/dev/scsi/sc4d7l0", "/dev/scsi/sc4d8l0", - "/dev/scsi/sc4d9l0", "/dev/scsi/sc4d10l0", - "/dev/scsi/sc4d11l0", "/dev/scsi/sc4d12l0", - "/dev/scsi/sc4d13l0", "/dev/scsi/sc4d14l0", - "/dev/scsi/sc4d15l0", - "/dev/scsi/sc5d1l0", "/dev/scsi/sc5d2l0", - "/dev/scsi/sc5d3l0", "/dev/scsi/sc5d4l0", - "/dev/scsi/sc5d5l0", "/dev/scsi/sc5d6l0", - "/dev/scsi/sc5d7l0", "/dev/scsi/sc5d8l0", - "/dev/scsi/sc5d9l0", "/dev/scsi/sc5d10l0", - "/dev/scsi/sc5d11l0", "/dev/scsi/sc5d12l0", - "/dev/scsi/sc5d13l0", "/dev/scsi/sc5d14l0", - "/dev/scsi/sc5d15l0", - "/dev/scsi/sc6d1l0", "/dev/scsi/sc6d2l0", - "/dev/scsi/sc6d3l0", "/dev/scsi/sc6d4l0", - "/dev/scsi/sc6d5l0", "/dev/scsi/sc6d6l0", - "/dev/scsi/sc6d7l0", "/dev/scsi/sc6d8l0", - "/dev/scsi/sc6d9l0", "/dev/scsi/sc6d10l0", - "/dev/scsi/sc6d11l0", "/dev/scsi/sc6d12l0", - "/dev/scsi/sc6d13l0", "/dev/scsi/sc6d14l0", - "/dev/scsi/sc6d15l0", - "/dev/scsi/sc7d1l0", "/dev/scsi/sc7d2l0", - "/dev/scsi/sc7d3l0", "/dev/scsi/sc7d4l0", - "/dev/scsi/sc7d5l0", "/dev/scsi/sc7d6l0", - "/dev/scsi/sc7d7l0", "/dev/scsi/sc7d8l0", - "/dev/scsi/sc7d9l0", "/dev/scsi/sc7d10l0", - "/dev/scsi/sc7d11l0", "/dev/scsi/sc7d12l0", - "/dev/scsi/sc7d13l0", "/dev/scsi/sc7d14l0", - "/dev/scsi/sc7d15l0", - "/dev/scsi/sc8d1l0", "/dev/scsi/sc8d2l0", - "/dev/scsi/sc8d3l0", "/dev/scsi/sc8d4l0", - "/dev/scsi/sc8d5l0", "/dev/scsi/sc8d6l0", - "/dev/scsi/sc8d7l0", "/dev/scsi/sc8d8l0", - "/dev/scsi/sc8d9l0", "/dev/scsi/sc8d10l0", - "/dev/scsi/sc8d11l0", "/dev/scsi/sc8d12l0", - "/dev/scsi/sc8d13l0", "/dev/scsi/sc8d14l0", - "/dev/scsi/sc8d15l0", - "/dev/scsi/sc9d1l0", "/dev/scsi/sc9d2l0", - "/dev/scsi/sc9d3l0", "/dev/scsi/sc9d4l0", - "/dev/scsi/sc9d5l0", "/dev/scsi/sc9d6l0", - "/dev/scsi/sc9d7l0", "/dev/scsi/sc9d8l0", - "/dev/scsi/sc9d9l0", "/dev/scsi/sc9d10l0", - "/dev/scsi/sc9d11l0", "/dev/scsi/sc9d12l0", - "/dev/scsi/sc9d13l0", "/dev/scsi/sc9d14l0", - "/dev/scsi/sc9d15l0", - "/dev/scsi/sc10d1l0", "/dev/scsi/sc10d2l0", - "/dev/scsi/sc10d3l0", "/dev/scsi/sc10d4l0", - "/dev/scsi/sc10d5l0", "/dev/scsi/sc10d6l0", - "/dev/scsi/sc10d7l0", "/dev/scsi/sc10d8l0", - "/dev/scsi/sc10d9l0", "/dev/scsi/sc10d10l0", - "/dev/scsi/sc10d11l0", "/dev/scsi/sc10d12l0", - "/dev/scsi/sc10d13l0", "/dev/scsi/sc10d14l0", - "/dev/scsi/sc10d15l0", - "/dev/scsi/sc11d1l0", "/dev/scsi/sc11d2l0", - "/dev/scsi/sc11d3l0", "/dev/scsi/sc11d4l0", - "/dev/scsi/sc11d5l0", "/dev/scsi/sc11d6l0", - "/dev/scsi/sc11d7l0", "/dev/scsi/sc11d8l0", - "/dev/scsi/sc11d9l0", "/dev/scsi/sc11d10l0", - "/dev/scsi/sc11d11l0", "/dev/scsi/sc11d12l0", - "/dev/scsi/sc11d13l0", "/dev/scsi/sc11d14l0", - "/dev/scsi/sc11d15l0", - "/dev/scsi/sc12d1l0", "/dev/scsi/sc12d2l0", - "/dev/scsi/sc12d3l0", "/dev/scsi/sc12d4l0", - "/dev/scsi/sc12d5l0", "/dev/scsi/sc12d6l0", - "/dev/scsi/sc12d7l0", "/dev/scsi/sc12d8l0", - "/dev/scsi/sc12d9l0", "/dev/scsi/sc12d10l0", - "/dev/scsi/sc12d11l0", "/dev/scsi/sc12d12l0", - "/dev/scsi/sc12d13l0", "/dev/scsi/sc12d14l0", - "/dev/scsi/sc12d15l0", - "/dev/scsi/sc13d1l0", "/dev/scsi/sc13d2l0", - "/dev/scsi/sc13d3l0", "/dev/scsi/sc13d4l0", - "/dev/scsi/sc13d5l0", "/dev/scsi/sc13d6l0", - "/dev/scsi/sc13d7l0", "/dev/scsi/sc13d8l0", - "/dev/scsi/sc13d9l0", "/dev/scsi/sc13d10l0", - "/dev/scsi/sc13d11l0", "/dev/scsi/sc13d12l0", - "/dev/scsi/sc13d13l0", "/dev/scsi/sc13d14l0", - "/dev/scsi/sc13d15l0", - "/dev/scsi/sc14d1l0", "/dev/scsi/sc14d2l0", - "/dev/scsi/sc14d3l0", "/dev/scsi/sc14d4l0", - "/dev/scsi/sc14d5l0", "/dev/scsi/sc14d6l0", - "/dev/scsi/sc14d7l0", "/dev/scsi/sc14d8l0", - "/dev/scsi/sc14d9l0", "/dev/scsi/sc14d10l0", - "/dev/scsi/sc14d11l0", "/dev/scsi/sc14d12l0", - "/dev/scsi/sc14d13l0", "/dev/scsi/sc14d14l0", - "/dev/scsi/sc14d15l0", - "/dev/scsi/sc15d1l0", "/dev/scsi/sc15d2l0", - "/dev/scsi/sc15d3l0", "/dev/scsi/sc15d4l0", - "/dev/scsi/sc15d5l0", "/dev/scsi/sc15d6l0", - "/dev/scsi/sc15d7l0", "/dev/scsi/sc15d8l0", - "/dev/scsi/sc15d9l0", "/dev/scsi/sc15d10l0", - "/dev/scsi/sc15d11l0", "/dev/scsi/sc15d12l0", - "/dev/scsi/sc15d13l0", "/dev/scsi/sc15d14l0", - "/dev/scsi/sc15d15l0", -#elif defined(__EMX__) - "b0t0l0", "b0t1l0", "b0t2l0", "b0t3l0", - "b0t4l0", "b0t5l0", "b0t6l0", "b0t7l0", - "b1t0l0", "b1t1l0", "b1t2l0", "b1t3l0", - "b1t4l0", "b1t5l0", "b1t6l0", "b1t7l0", - "b2t0l0", "b2t1l0", "b2t2l0", "b2t3l0", - "b2t4l0", "b2t5l0", "b2t6l0", "b2t7l0", - "b3t0l0", "b3t1l0", "b3t2l0", "b3t3l0", - "b3t4l0", "b3t5l0", "b3t6l0", "b3t7l0", -#elif defined(__linux__) - "/dev/scanner", - "/dev/sg0", "/dev/sg1", "/dev/sg2", "/dev/sg3", - "/dev/sg4", "/dev/sg5", "/dev/sg6", "/dev/sg7", - "/dev/sg8", "/dev/sg9", - "/dev/sga", "/dev/sgb", "/dev/sgc", "/dev/sgd", - "/dev/sge", "/dev/sgf", "/dev/sgg", "/dev/sgh", - "/dev/sgi", "/dev/sgj", "/dev/sgk", "/dev/sgl", - "/dev/sgm", "/dev/sgn", "/dev/sgo", "/dev/sgp", - "/dev/sgq", "/dev/sgr", "/dev/sgs", "/dev/sgt", - "/dev/sgu", "/dev/sgv", "/dev/sgw", "/dev/sgx", - "/dev/sgy", "/dev/sgz", -#elif defined(__NeXT__) - "/dev/sg0a", "/dev/sg0b", "/dev/sg0c", "/dev/sg0d", - "/dev/sg0e", "/dev/sg0f", "/dev/sg0g", "/dev/sg0h", - "/dev/sg1a", "/dev/sg1b", "/dev/sg1c", "/dev/sg1d", - "/dev/sg1e", "/dev/sg1f", "/dev/sg1g", "/dev/sg1h", - "/dev/sg2a", "/dev/sg2b", "/dev/sg2c", "/dev/sg2d", - "/dev/sg2e", "/dev/sg2f", "/dev/sg2g", "/dev/sg2h", - "/dev/sg3a", "/dev/sg3b", "/dev/sg3c", "/dev/sg3d", - "/dev/sg3e", "/dev/sg3f", "/dev/sg3g", "/dev/sg3h", -#elif defined(_AIX) - "/dev/scanner", - "/dev/gsc0", "/dev/gsc1", "/dev/gsc2", "/dev/gsc3", - "/dev/gsc4", "/dev/gsc5", "/dev/gsc6", "/dev/gsc7", - "/dev/gsc8", "/dev/gsc9", "/dev/gsc10", "/dev/gsc11", - "/dev/gsc12", "/dev/gsc13", "/dev/gsc14", "/dev/gsc15", -#elif defined(__sun) - "/dev/scg0a", "/dev/scg0b", "/dev/scg0c", "/dev/scg0d", - "/dev/scg0e", "/dev/scg0f", "/dev/scg0g", - "/dev/scg1a", "/dev/scg1b", "/dev/scg1c", "/dev/scg1d", - "/dev/scg1e", "/dev/scg1f", "/dev/scg1g", - "/dev/scg2a", "/dev/scg2b", "/dev/scg2c", "/dev/scg2d", - "/dev/scg2e", "/dev/scg2f", "/dev/scg2g", - "/dev/sg/0", "/dev/sg/1", "/dev/sg/2", "/dev/sg/3", - "/dev/sg/4", "/dev/sg/5", "/dev/sg/6", - "/dev/scsi/scanner/", "/dev/scsi/processor/", -#elif defined(HAVE_CAMLIB_H) - "/dev/scanner", "/dev/scanner0", "/dev/scanner1", - "/dev/pass0", "/dev/pass1", "/dev/pass2", "/dev/pass3", - "/dev/pass4", "/dev/pass5", "/dev/pass6", "/dev/pass7", -#elif defined(__FreeBSD__) || defined(__DragonFly__) - "/dev/uk0", "/dev/uk1", "/dev/uk2", "/dev/uk3", "/dev/uk4", - "/dev/uk5", "/dev/uk6", -#elif defined(__NetBSD__) - "/dev/uk0", "/dev/uk1", "/dev/uk2", "/dev/uk3", "/dev/uk4", - "/dev/uk5", "/dev/uk6", - "/dev/ss0", -#elif defined(__OpenBSD__) - "/dev/uk0", "/dev/uk1", "/dev/uk2", "/dev/uk3", "/dev/uk4", - "/dev/uk5", "/dev/uk6", -#elif defined(__hpux) - "/dev/rscsi/", -#endif - 0 - }; - static char *usb_default_dev_list[] = { -#if defined(__linux__) - "/dev/usb/scanner", - "/dev/usb/scanner0", "/dev/usb/scanner1", - "/dev/usb/scanner2", "/dev/usb/scanner3", - "/dev/usb/scanner4", "/dev/usb/scanner5", - "/dev/usb/scanner5", "/dev/usb/scanner7", - "/dev/usb/scanner8", "/dev/usb/scanner9", - "/dev/usb/scanner10", "/dev/usb/scanner11", - "/dev/usb/scanner12", "/dev/usb/scanner13", - "/dev/usb/scanner14", "/dev/usb/scanner15", - "/dev/usbscanner", - "/dev/usbscanner0", "/dev/usbscanner1", - "/dev/usbscanner2", "/dev/usbscanner3", - "/dev/usbscanner4", "/dev/usbscanner5", - "/dev/usbscanner6", "/dev/usbscanner7", - "/dev/usbscanner8", "/dev/usbscanner9", - "/dev/usbscanner10", "/dev/usbscanner11", - "/dev/usbscanner12", "/dev/usbscanner13", - "/dev/usbscanner14", "/dev/usbscanner15", -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) - "/dev/uscanner", - "/dev/uscanner0", "/dev/uscanner1", - "/dev/uscanner2", "/dev/uscanner3", - "/dev/uscanner4", "/dev/uscanner5", - "/dev/uscanner6", "/dev/uscanner7", - "/dev/uscanner8", "/dev/uscanner9", - "/dev/uscanner10", "/dev/uscanner11", - "/dev/uscanner12", "/dev/uscanner13", - "/dev/uscanner14", "/dev/uscanner15", -#endif - 0 - }; - -#if defined (WIN32_SCSI) || \ - defined (HAVE_IOKIT_CDB_IOSCSILIB_H) || \ - defined (HAVE_IOKIT_SCSI_SCSICOMMANDOPERATIONCODES_H) || \ - defined (HAVE_IOKIT_SCSI_COMMANDS_SCSICOMMANDOPERATIONCODES_H) - /* Build a list of valid of possible scanners found */ - dev_list = build_scsi_dev_list(); -#else - dev_list = default_dev_list; -#endif - - usb_dev_list = usb_default_dev_list; - } - if (verbose > 1) - printf ("This is sane-find-scanner from %s\n", PACKAGE_STRING); - - if (verbose > 0) - printf ("\n # sane-find-scanner will now attempt to detect your scanner. If the" - "\n # result is different from what you expected, first make sure your" - "\n # scanner is powered up and properly connected to your computer.\n\n"); - - if (verbose > 1) - printf ("searching for SCSI scanners:\n"); - - while ((dev_name = *dev_list++)) - { - if (strlen (dev_name) == 0) - continue; /* Empty device names ... */ - - if (dev_name[strlen (dev_name) - 1] == '/') - { - /* check whole directories */ - DIR *dir; - char *file_name; - - dir = scan_directory (dev_name); - if (!dir) - continue; - - while ((file_name = get_next_file (dev_name, dir))) - check_scsi_file (file_name); - } - else - { - /* check device files */ - check_scsi_file (dev_name); - } - } - if (device_found) - { - if (verbose > 0) - printf - (" # Your SCSI scanner was detected. It may or may not be " - "supported by SANE. Try\n # scanimage -L and read the backend's " - "manpage.\n"); - } - else - { - if (verbose > 0) - printf - (" # No SCSI scanners found. If you expected something different, " - "make sure that\n # you have loaded a kernel SCSI driver for your SCSI " - "adapter.\n"); - if (!check_sg ()) - { - if (verbose > 0) - printf - (" # Also you need support for SCSI Generic (sg) in your " - "operating system.\n # If using Linux, try \"modprobe " - "sg\".\n"); - } - } - if (verbose > 0) - printf ("\n"); - device_found = SANE_FALSE; - sanei_usb_init (); - if (verbose > 1) - printf ("searching for USB scanners:\n"); - - while ((dev_name = *usb_dev_list++)) - { - if (strlen (dev_name) == 0) - continue; /* Empty device names ... */ - - if (dev_name[strlen (dev_name) - 1] == '/') - { - /* check whole directories */ - DIR *dir; - char *file_name; - - dir = scan_directory (dev_name); - if (!dir) - continue; - - while ((file_name = get_next_file (dev_name, dir))) - check_usb_file (file_name); - } - else - { - /* check device files */ - check_usb_file (dev_name); - } - } -#ifdef HAVE_LIBUSB_LEGACY - /* Now the libusb devices */ - { - struct usb_bus *bus; - struct usb_device *dev; - - if (ap < argv + argc) - { - /* user-specified devices not useful for libusb */ - if (verbose > 1) - printf ("ignoring libusb devices\n"); - } - else - { - if (verbose > 2) - printf ("trying libusb:\n"); - for (bus = usb_get_busses (); bus; bus = bus->next) - { - for (dev = bus->devices; dev; dev = dev->next) - { - check_libusb_device (dev, SANE_FALSE); - } /* for (dev) */ - } /* for (bus) */ - } - } -#elif defined(HAVE_LIBUSB) - /* Now the libusb-1.0 devices */ - { - if (ap < argv + argc) - { - /* user-specified devices not useful for libusb */ - if (verbose > 1) - printf ("ignoring libusb devices\n"); - } - else - { - libusb_device **devlist; - ssize_t devcnt; - int i; - int ret; - - if (verbose > 2) - printf ("trying libusb:\n"); - - ret = libusb_init (&sfs_usb_ctx); - if (ret < 0) - { - printf ("# Could not initialize libusb-1.0, error %d\n", ret); - printf ("# Skipping libusb devices\n"); - - goto failed_libusb_1_0; - } - - if (verbose > 3) -#if LIBUSB_API_VERSION >= 0x01000106 - libusb_set_option (sfs_usb_ctx, LIBUSB_OPTION_LOG_LEVEL, - LIBUSB_LOG_LEVEL_INFO); -#else - libusb_set_debug (sfs_usb_ctx, 3); -#endif - - devcnt = libusb_get_device_list (sfs_usb_ctx, &devlist); - if (devcnt < 0) - { - printf ("# Could not get device list, error %d\n", ret); - - goto deinit_libusb_1_0; - } - - for (i = 0; i < devcnt; i++) - { - check_libusb_device (devlist[i], SANE_FALSE); - } - - libusb_free_device_list (devlist, 1); - - deinit_libusb_1_0: - libusb_exit (sfs_usb_ctx); - - failed_libusb_1_0: - ; /* init failed, jumping here */ - } - } -#else /* not HAVE_LIBUSB_LEGACY && not HAVE_LIBUSB */ - if (verbose > 1) - printf ("libusb not available\n"); -#endif /* not HAVE_LIBUSB_LEGACY && not HAVE_LIBUSB */ - - if (device_found) - { - if (libusb_device_found) - { - if (verbose > 0) - printf - (" # Your USB scanner was (probably) detected. It " - "may or may not be supported by\n # SANE. Try scanimage " - "-L and read the backend's manpage.\n"); - } - else if (verbose > 0) - printf - (" # Your USB scanner was detected. It may or may not " - "be supported by\n # SANE. Try scanimage -L and read the " - "backend's manpage.\n"); - if (unknown_found && verbose > 0) - printf - (" # `UNKNOWN vendor and product' means that there seems to be a " - "scanner at this\n # device file but the vendor and product ids " - "couldn't be identified.\n # Currently identification only works " - "with Linux versions >= 2.4.8. You may\n # need to configure your " - "backend manually, see the backend's manpage.\n"); - } - else - { - if (verbose > 0) - printf - (" # No USB scanners found. If you expected something different, " - "make sure that\n # you have loaded a kernel driver for your USB host " - "controller and have setup\n # the USB system correctly. " - "See man sane-usb for details.\n"); -#if !defined(HAVE_LIBUSB_LEGACY) && !defined(HAVE_LIBUSB) - if (verbose > 0) - printf (" # SANE has been built without libusb support. This may be a " - "reason\n # for not detecting USB scanners. Read README for " - "more details.\n"); -#endif - } - if (enable_pp_checks == SANE_TRUE) - { - if (!check_mustek_pp_device() && verbose > 0) - printf ("\n # No Mustek parallel port scanners found. If you expected" - " something\n # different, make sure the scanner is correctly" - " connected to your computer\n # and you have appropriate" - " access rights.\n"); - } - else if (verbose > 0) - printf ("\n # Not checking for parallel port scanners.\n"); - if (verbose > 0) - printf ("\n # Most Scanners connected to the parallel port or other " - "proprietary ports\n # can't be detected by this program.\n"); -#ifdef HAVE_GETUID - if (getuid ()) - if (verbose > 0) - printf - ("\n # You may want to run this program as root to find all devices. " - "Once you\n # found the scanner devices, be sure to adjust access " - "permissions as\n # necessary.\n"); -#endif - - if (verbose > 1) - printf ("done\n"); - - return 0; -} diff --git a/tools/sane-find-scanner.c.rej b/tools/sane-find-scanner.c.rej deleted file mode 100644 index 719a906..0000000 --- a/tools/sane-find-scanner.c.rej +++ /dev/null @@ -1,22 +0,0 @@ ---- tools/sane-find-scanner.c -+++ tools/sane-find-scanner.c -@@ -384,7 +384,7 @@ check_usb_file (char *file_name) - { - if (verbose > 1) - printf (" open ok, vendor and product ids were identified\n"); -- printf ("found USB scanner (vendor=0x%04x, " -+ printf ("found possible USB scanner (vendor=0x%04x, " - "product=0x%04x) at %s\n", vendor, product, file_name); - } - else -@@ -392,8 +392,8 @@ check_usb_file (char *file_name) - if (verbose > 1) - printf (" open ok, but vendor and product could NOT be " - "identified\n"); -- printf ("found USB scanner (UNKNOWN vendor and product) " -- "at device %s\n", file_name); -+ printf ("found possible USB scanner (UNKNOWN vendor and " -+ "product) at %s\n", file_name); - unknown_found = SANE_TRUE; - } - device_found = SANE_TRUE; |