4201f50
--- sane-backends-1.0.18/tools/sane-desc.c.udev-098	2007-08-07 14:56:03.000000000 +0200
4201f50
+++ sane-backends-1.0.18/tools/sane-desc.c	2007-08-08 12:45:27.000000000 +0200
4201f50
@@ -3153,14 +3153,14 @@ print_udev_header (void)
4201f50
     ("#\n"
4201f50
      "# udev rules file for supported USB devices\n"
4201f50
      "#\n"
4201f50
-     "# To add a USB device, add a rule to the list below between the SUBSYSTEM...\n"
4201f50
-     "# and LABEL... lines.\n"
4201f50
+     "# To add support for a USB device, add rules to the \"usb\" and \"usb_device\"\n"
4201f50
+     "# lists below between their respective \"# BEGIN ...\" and \"# END ...\" lines.\n"
4201f50
      "#\n"
4201f50
      "# To run a script when your device is plugged in, add RUN=\"/path/to/script\"\n"
4201f50
-     "# to the appropriate rule.\n");
4201f50
+     "# to the appropriate rules.\n");
4201f50
   printf
4201f50
     ("#\n"
4201f50
-     "# The following list already contains a lot of scanners. If your scanner\n"
4201f50
+     "# The following lists already contains a lot of scanners. If your scanner\n"
4201f50
      "# isn't mentioned there, add it as explained above and mail the entry to\n"
4201f50
      "# the sane-devel mailing list (sane-devel@lists.alioth.debian.org).\n"
4201f50
      "#\n");
4201f50
@@ -3169,11 +3169,44 @@ print_udev_header (void)
4201f50
 static void
4201f50
 print_udev (void)
4201f50
 {
4201f50
-  usbid_type *usbid = create_usbids_table ();
4201f50
+  usbid_type *usbid_first = create_usbids_table ();
4201f50
+  usbid_type *usbid = usbid_first;
4201f50
 
4201f50
   print_udev_header ();
4201f50
+
4201f50
   printf ("\nACTION!=\"add\", GOTO=\"libsane_rules_end\"\n");
4201f50
-  printf ("SUBSYSTEM!=\"usb_device\", GOTO=\"libsane_rules_end\"\n\n");
4201f50
+  printf ("\nATTR{dev}!=\"?*\", GOTO=\"libsane_rules_end\"\n");
4201f50
+  printf ("SUBSYSTEM==\"usb\", GOTO=\"libsane_usb_rules\"\n");
4201f50
+  printf ("SUBSYSTEM==\"usb_device\", GOTO=\"libsane_usb_device_rules\"\n\n");
4201f50
+  printf ("GOTO=\"libsane_rules_end\"\n\n");
4201f50
+
4201f50
+  /* SUBSYSTEM=="usb" -> ATTR{} */
4201f50
+  printf ("LABEL=\"libsane_usb_rules\"\n\n");
4201f50
+  printf ("# BEGIN scanner rules for SUBSYSTEM==\"usb\"\n");
4201f50
+  while (usbid)
4201f50
+    {
4201f50
+      manufacturer_model_type * name = usbid->name;
4201f50
+
4201f50
+      printf ("# ");
4201f50
+      while (name)
4201f50
+	{
4201f50
+	  if (name != usbid->name)
4201f50
+	    printf (" | ");
4201f50
+	  printf ("%s", name->name);
4201f50
+	  name = name->next;
4201f50
+	}
4201f50
+      printf ("\n");
4201f50
+      printf ("ATTR{idVendor}==\"%s\", ATTR{idProduct}==\"%s\", SYMLINK+=\"scanner-%%k\"\n",
4201f50
+	      usbid->usb_vendor_id + 2,  usbid->usb_product_id + 2);
4201f50
+      usbid = usbid->next;
4201f50
+    }
4201f50
+  printf ("# END scanner rules for SUBSYSTEM==\"usb\"\n");
4201f50
+  printf ("GOTO=\"libsane_rules_end\"\n\n");
4201f50
+
4201f50
+  /* SUBSYSTEM=="usb_device" -> ATTRS{} */
4201f50
+  printf ("LABEL=\"libsane_usb_device_rules\"\n\n");
4201f50
+  printf ("# BEGIN scanner rules for SUBSYSTEM==\"usb_device\"\n");
4201f50
+  usbid = usbid_first;
4201f50
   while (usbid)
4201f50
     {
4201f50
       manufacturer_model_type * name = usbid->name;
4201f50
@@ -3187,10 +3220,13 @@ print_udev (void)
e2ae888
 	  name = name->next;
e2ae888
 	}
e2ae888
       printf ("\n");
e2ae888
-      printf ("SYSFS{idVendor}==\"%s\", SYSFS{idProduct}==\"%s\", SYMLINK+=\"scanner-%%k\"\n",
4201f50
+      printf ("ATTRS{idVendor}==\"%s\", ATTRS{idProduct}==\"%s\", SYMLINK+=\"scanner-%%k\"\n",
e2ae888
 	      usbid->usb_vendor_id + 2,  usbid->usb_product_id + 2);
e2ae888
       usbid = usbid->next;
e2ae888
     }
4201f50
+  printf ("# END scanner rules for SUBSYSTEM==\"usb_device\"\n");
4201f50
+  printf ("GOTO=\"libsane_rules_end\"\n");
4201f50
+
4201f50
   printf ("\nLABEL=\"libsane_rules_end\"\n");
4201f50
 }
4201f50