SCSI scanners can now be selected by LUN on MacOS X

sane-find-scanner now finds SCSI scanners on MacOS X
making some sanei_scsi internal functions static
merge-requests/1/head
Mattias Ellert 2004-06-19 21:31:42 +00:00
rodzic cfe712c392
commit 3458605b55
3 zmienionych plików z 108 dodań i 93 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2004-06-19 Mattias Ellert <mattias.ellert@tsl.uu.se>
* sanei/sanei_scsi.c, tools/sane-find-scanner.c
* SCSI scanners can now be selected by LUN on MacOS X
* sane-find-scanner now finds SCSI scanners on MacOS X
* making some sanei_scsi internal functions static
2004-05-30 Peter Fales <peter@fales-lorenz.net>
* acinclude.m4, aclocal.m4, configure.in, configure
In addition to using pkg-config to find the gphoto2 library flags,

Wyświetl plik

@ -195,8 +195,6 @@
# include <IOKit/scsi-commands/SCSICmds_INQUIRY_Definitions.h>
# include <IOKit/scsi-commands/SCSICommandOperationCodes.h>
# include <IOKit/scsi-commands/SCSITaskLib.h>
CFDataRef CreateGUIDFromDevName (const char *devname);
char *CreateDevNameFromGUID (CFDataRef dataDesc);
# endif
#elif defined (HAVE_WINDOWS_H)
# define USE WIN32_INTERFACE
@ -838,6 +836,10 @@ sanei_scsi_open (const char *dev, int *fdp,
int fd, i;
#if USE == LINUX_INTERFACE
static int first_time = 1;
#elif USE == MACOSX_INTERFACE
UInt8 *guid;
int len;
u_int d;
#endif
cc = getenv ("SANE_SCSICMD_TIMEOUT");
@ -1143,7 +1145,21 @@ sanei_scsi_open (const char *dev, int *fdp,
#elif USE == MACOSX_INTERFACE
{
# ifdef HAVE_IOKIT_SCSI_COMMANDS_SCSICOMMANDOPERATIONCODES_H
pdata = (void*) CreateGUIDFromDevName (dev);
len = strlen (dev);
if (len > 2 && len % 2 == 0 && dev [0] == '<' && dev [len - 1] == '>')
{
len = (len - 2) / 2;
guid = (UInt8 *) malloc (len);
for (i = 0; i < len; i++)
{
if (sscanf (&dev [2 * i + 1], "%02x", &d) != 1)
break;
guid [i] = d;
}
if (i == len)
pdata = (void *) CFDataCreate (kCFAllocatorDefault, guid, len);
free (guid);
}
# endif
# ifdef HAVE_IOKIT_CDB_IOSCSILIB_H
if ((pdata == NULL) &&
@ -4859,7 +4875,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
# ifdef HAVE_IOKIT_CDB_IOSCSILIB_H
SANE_Status
static SANE_Status
sanei_scsi_cmd2_old_api (int fd,
const void *cmd, size_t cmd_size,
const void *src, size_t src_size,
@ -5029,7 +5045,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
}
void
static void
sanei_scsi_find_devices_old_api (const char *findvendor,
const char *findmodel,
const char *findtype, int findbus,
@ -5152,6 +5168,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
# ifdef HAVE_IOKIT_SCSI_COMMANDS_SCSICOMMANDOPERATIONCODES_H
static
void CreateMatchingDictionaryForSTUC (SInt32 peripheralDeviceType,
const char *findvendor,
const char *findmodel,
@ -5232,74 +5249,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
CFRelease (subDict);
}
CFDataRef CreateGUIDFromDevName (const char *devname)
{
const char *p;
int L;
UInt8 *guid;
UInt8 *g;
int i, d;
CFDataRef dataDesc;
/* Decode a fake devname */
if (strncmp ("iokitscsi@<", devname, 11) != 0)
return NULL;
p = devname + 11;
L = strlen (p) - 1;
if ((L < 2) || ((L % 2) != 0))
return NULL;
L = L / 2;
/* Allocate a buffer for the GUID */
guid = (UInt8 *) malloc (L);
g = guid;
for (i = L; i > 0; i--, p += 2)
{
if (sscanf (p, "%02x", &d) != 1)
return NULL;
*g++ = d & 0xff;
}
/* Create the CFData */
dataDesc = CFDataCreate (kCFAllocatorDefault, guid, L);
free (guid);
return dataDesc;
}
char *CreateDevNameFromGUID (CFDataRef dataDesc)
{
int L;
const char *p;
char *devname;
char *d;
if (dataDesc == NULL)
return NULL;
/* Create a fake device name */
L = CFDataGetLength (dataDesc);
p = CFDataGetBytePtr (dataDesc);
devname = (char *) malloc (13 + 2 * L);
d = devname + 11;
sprintf (devname, "iokitscsi@<");
for (; L > 0; L--, d += 2)
{
sprintf (d, "%02x", (*p++) & 0xff);
}
sprintf (d, ">");
return devname;
}
static
void CreateDeviceInterfaceUsingSTUC (io_object_t scsiDevice,
IOCFPlugInInterface ***
thePlugInInterface,
@ -5349,7 +5299,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
*theInterface = interface;
}
SANE_Status
static SANE_Status
ExecuteSCSITask (SCSITaskInterface ** task,
const void *cmd, size_t cmd_size,
const void *src, size_t src_size,
@ -5452,7 +5402,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
return SANE_STATUS_GOOD;
}
SANE_Status
static SANE_Status
ExecuteCommandUsingSTUC (SCSITaskDeviceInterface ** interface,
const void *cmd, size_t cmd_size,
const void *src, size_t src_size,
@ -5609,7 +5559,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
return returnValue;
}
void
static void
sanei_scsi_find_devices_stuc_api (const char *findvendor,
const char *findmodel,
const char *findtype, int findbus,
@ -5625,6 +5575,11 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
io_object_t scsiDevice;
CFDataRef GUIDRef;
char *devname;
int len;
const unsigned char *p;
CFDictionaryRef protocolCharacteristics;
CFNumberRef scsiLunRef;
int scsilun;
masterPort = NULL;
ioReturnValue = IOMasterPort (MACH_PORT_NULL, &masterPort);
@ -5671,24 +5626,50 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
while ((scsiDevice = IOIteratorNext (iokIterator)))
{
/* Create a fake device name from the SCSITaskUserClient GUID */
GUIDRef = IORegistryEntryCreateCFProperty
(scsiDevice, CFSTR (kIOPropertySCSITaskUserClientInstanceGUID),
NULL, 0);
devname = CreateDevNameFromGUID (GUIDRef);
CFRelease (GUIDRef);
if (devname)
scsilun = 0;
protocolCharacteristics = IORegistryEntryCreateCFProperty
(scsiDevice, CFSTR ("Protocol Characteristics"), NULL, 0);
if (protocolCharacteristics)
{
DBG (1, "Found:%s\n", devname);
/* Attach to the device */
(*attach) (devname);
free (devname);
scsiLunRef = CFDictionaryGetValue
(protocolCharacteristics,
CFSTR ("SCSI Logical Unit Number"));
if (scsiLunRef)
CFNumberGetValue (scsiLunRef, kCFNumberIntType, &scsilun);
CFRelease (protocolCharacteristics);
}
else
if (findlun < 0 || findlun == scsilun)
{
DBG (1, "Can't find SCSITaskUserClient GUID\n");
/* Create device name from the SCSITaskUserClient GUID */
GUIDRef = IORegistryEntryCreateCFProperty
(scsiDevice,
CFSTR (kIOPropertySCSITaskUserClientInstanceGUID),
NULL, 0);
if (GUIDRef)
{
len = CFDataGetLength (GUIDRef);
p = CFDataGetBytePtr (GUIDRef);
devname = (char *) malloc (2 * len + 3);
devname [0] = '<';
for (i = 0; i < len; i++)
sprintf (&devname [2 * i + 1], "%02x", p [i]);
devname [2 * len + 1] = '>';
devname [2 * len + 2] = NULL;
CFRelease (GUIDRef);
DBG (1, "Found: %s\n", devname);
/* Attach to the device */
(*attach) (devname);
free (devname);
}
else
DBG (1, "Can't find SCSITaskUserClient GUID\n");
}
}
IOObjectRelease (iokIterator);

Wyświetl plik

@ -783,6 +783,32 @@ static char **build_scsi_dev_list()
}
#endif
#if defined (HAVE_IOKIT_CDB_IOSCSILIB_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()
{
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)
{
@ -1149,9 +1175,11 @@ main (int argc, char **argv)
0
};
#if defined (HAVE_WINDOWS_H)
#if defined (HAVE_WINDOWS_H) || \
defined (HAVE_IOKIT_CDB_IOSCSILIB_H) || \
defined (HAVE_IOKIT_SCSI_COMMANDS_SCSICOMMANDOPERATIONCODES_H)
/* Build a list of valid of possible scanners found */
dev_list = build_scsi_dev_list();
dev_list = build_scsi_dev_list();
#else
dev_list = default_dev_list;
#endif