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