|
|
d59cd3e |
diff -up cups-1.3.3/backend/ieee1284.c.parallel-id cups-1.3.3/backend/ieee1284.c
|
|
|
d59cd3e |
--- cups-1.3.3/backend/ieee1284.c.parallel-id 2007-07-11 22:46:42.000000000 +0100
|
|
|
d59cd3e |
+++ cups-1.3.3/backend/ieee1284.c 2007-10-10 12:15:21.000000000 +0100
|
|
|
d59cd3e |
@@ -32,6 +32,10 @@
|
|
|
d59cd3e |
# include <linux/lp.h>
|
|
|
d59cd3e |
# define IOCNR_GET_DEVICE_ID 1
|
|
|
d59cd3e |
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
|
|
|
d59cd3e |
+# include <linux/parport.h>
|
|
|
d59cd3e |
+# include <linux/ppdev.h>
|
|
|
d59cd3e |
+# include <unistd.h>
|
|
|
d59cd3e |
+# include <fcntl.h>
|
|
|
d59cd3e |
#endif /* __linux */
|
|
|
d59cd3e |
|
|
|
d59cd3e |
#ifdef __sun
|
|
|
d59cd3e |
@@ -68,6 +72,7 @@ backendGetDeviceID(
|
|
|
d59cd3e |
int manulen; /* Length of manufacturer string */
|
|
|
d59cd3e |
#ifdef __linux
|
|
|
d59cd3e |
int length; /* Length of device ID info */
|
|
|
d59cd3e |
+ int got_id = 0;
|
|
|
d59cd3e |
#endif /* __linux */
|
|
|
d59cd3e |
#if defined(__sun) && defined(ECPPIOC_GETDEVID)
|
|
|
d59cd3e |
struct ecpp_device_id did; /* Device ID buffer */
|
|
|
d59cd3e |
@@ -93,9 +98,6 @@ backendGetDeviceID(
|
|
|
d59cd3e |
if (make_model)
|
|
|
d59cd3e |
*make_model = '\0';
|
|
|
d59cd3e |
|
|
|
d59cd3e |
- if (uri)
|
|
|
d59cd3e |
- *uri = '\0';
|
|
|
d59cd3e |
-
|
|
|
d59cd3e |
if (fd >= 0)
|
|
|
d59cd3e |
{
|
|
|
d59cd3e |
/*
|
|
|
d59cd3e |
@@ -105,7 +107,74 @@ backendGetDeviceID(
|
|
|
d59cd3e |
*device_id = '\0';
|
|
|
d59cd3e |
|
|
|
d59cd3e |
#ifdef __linux
|
|
|
d59cd3e |
- if (!ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id))
|
|
|
d59cd3e |
+ if (ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id))
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+# ifdef DEBUG
|
|
|
d59cd3e |
+ printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno));
|
|
|
d59cd3e |
+# endif /* DEBUG */
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (!strcmp (scheme, "parallel") &&
|
|
|
d59cd3e |
+ uri && !strncmp (uri, "parallel:/dev/", 14))
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ const char *n;
|
|
|
d59cd3e |
+ char devparport[16];
|
|
|
d59cd3e |
+ int devparportfd;
|
|
|
d59cd3e |
+ n = uri + strcspn (uri, "0123456789");
|
|
|
d59cd3e |
+ strcpy (devparport, "/dev/parport");
|
|
|
d59cd3e |
+ strncpy (devparport + 12, n, 3);
|
|
|
d59cd3e |
+ devparport[15] = '\0';
|
|
|
d59cd3e |
+ devparportfd = open (devparport, O_RDWR | O_NOCTTY);
|
|
|
d59cd3e |
+ if (devparportfd != -1)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ /* Put the device into Device ID mode */
|
|
|
d59cd3e |
+ int err = ioctl (devparportfd, PPCLAIM);
|
|
|
d59cd3e |
+ int m = IEEE1284_MODE_COMPAT;
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (err)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ close (devparportfd);
|
|
|
d59cd3e |
+ devparportfd = -1;
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (!err)
|
|
|
d59cd3e |
+ err = ioctl (devparportfd, PPNEGOT, &m);
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (!err)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ m = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID;
|
|
|
d59cd3e |
+ err = ioctl (devparportfd, PPNEGOT, &m);
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ /* Make the file descriptor non-blocking to guard against
|
|
|
d59cd3e |
+ * bugs in the device. */
|
|
|
d59cd3e |
+ if (!err)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ int f = fcntl (devparportfd, F_GETFL);
|
|
|
d59cd3e |
+ f |= O_NONBLOCK;
|
|
|
d59cd3e |
+ err = fcntl (devparportfd, F_SETFL, f);
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ /* Read the ID */
|
|
|
d59cd3e |
+ if (!err)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ if (read (devparportfd, device_id, device_id_size) < 2)
|
|
|
d59cd3e |
+ err = 1;
|
|
|
d59cd3e |
+ else
|
|
|
d59cd3e |
+ got_id = 1;
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (devparportfd > -1)
|
|
|
d59cd3e |
+ {
|
|
|
d59cd3e |
+ ioctl (devparportfd, PPRELEASE);
|
|
|
d59cd3e |
+ close (devparportfd);
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+ }
|
|
|
d59cd3e |
+ else
|
|
|
d59cd3e |
+ got_id = 1;
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
+ if (got_id)
|
|
|
d59cd3e |
{
|
|
|
d59cd3e |
/*
|
|
|
d59cd3e |
* Extract the length of the device ID string from the first two
|
|
|
d59cd3e |
@@ -168,6 +237,9 @@ backendGetDeviceID(
|
|
|
d59cd3e |
|
|
|
d59cd3e |
DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id));
|
|
|
d59cd3e |
|
|
|
d59cd3e |
+ if (uri)
|
|
|
d59cd3e |
+ *uri = '\0';
|
|
|
d59cd3e |
+
|
|
|
d59cd3e |
if (!*device_id)
|
|
|
d59cd3e |
return (-1);
|
|
|
d59cd3e |
|
|
|
d59cd3e |
diff -up cups-1.3.3/backend/parallel.c.parallel-id cups-1.3.3/backend/parallel.c
|
|
|
d59cd3e |
--- cups-1.3.3/backend/parallel.c.parallel-id 2007-08-22 19:34:34.000000000 +0100
|
|
|
d59cd3e |
+++ cups-1.3.3/backend/parallel.c 2007-10-10 12:14:23.000000000 +0100
|
|
|
d59cd3e |
@@ -350,9 +350,12 @@ list_devices(void)
|
|
|
d59cd3e |
* Now grab the IEEE 1284 device ID string...
|
|
|
d59cd3e |
*/
|
|
|
d59cd3e |
|
|
|
d59cd3e |
+ char device_uri[255 + 9];
|
|
|
d59cd3e |
+ strcpy (device_uri, "parallel:");
|
|
|
d59cd3e |
+ strcpy (device_uri + 9, device);
|
|
|
d59cd3e |
if (!backendGetDeviceID(fd, device_id, sizeof(device_id),
|
|
|
d59cd3e |
make_model, sizeof(make_model),
|
|
|
d59cd3e |
- NULL, NULL, 0))
|
|
|
d59cd3e |
+ "parallel", device_uri, sizeof (device_uri)))
|
|
|
d59cd3e |
printf("direct parallel:%s \"%s\" \"%s LPT #%d\" \"%s\"\n", device,
|
|
|
d59cd3e |
make_model, make_model, i + 1, device_id);
|
|
|
d59cd3e |
else
|