chiark / gitweb /
[PATCH] support DRIVER as a rule key
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Sat, 13 Nov 2004 04:21:12 +0000 (05:21 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 05:26:25 +0000 (22:26 -0700)
Match with a rule against a device with a specific kernel driver.

namedev.c
namedev.h
namedev_parse.c
test/udev-test.pl
udev.8.in

index 8bf3c0e73e87ac1d702d56df0425d8cbd1339950..c5c7929ab212680cb53a76710dbf7b6ecd53c91b 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -626,6 +626,17 @@ static int match_rule(struct config_device *dev, struct sysfs_class_device *clas
                        }
                }
 
+               /* check for matching driver */
+               if (dev->driver[0] != '\0') {
+                       dbg("check for " FIELD_DRIVER " dev->driver='%s' sysfs_device->driver_name='%s'", dev->driver, sysfs_device->driver_name);
+                       if (strcmp_pattern(dev->driver, sysfs_device->driver_name) != 0) {
+                               dbg(FIELD_DRIVER " is not matching");
+                               goto try_parent;
+                       } else {
+                               dbg(FIELD_DRIVER " matches");
+                       }
+               }
+
                /* check for matching bus id */
                if (dev->id[0] != '\0') {
                        dbg("check " FIELD_ID);
index 3837e864a0049e4c70d2f60f0c3c9ecd8deebe64..7a98d66c24ca42c2b5f964c2751c6eac8610ab8d 100644 (file)
--- a/namedev.h
+++ b/namedev.h
 
 struct sysfs_class_device;
 
-#define BUS_SIZE               30
-#define FILE_SIZE              50
-#define VALUE_SIZE             100
-#define ID_SIZE                        50
-#define PLACE_SIZE             50
-#define PROGRAM_SIZE           100
+#define BUS_SIZE               32
+#define FILE_SIZE              64
+#define VALUE_SIZE             128
+#define ID_SIZE                        64
+#define PLACE_SIZE             64
+#define DRIVER_SIZE            64
+#define PROGRAM_SIZE           128
 
 #define FIELD_BUS              "BUS"
 #define FIELD_SYSFS            "SYSFS"
@@ -43,6 +44,7 @@ struct sysfs_class_device;
 #define FIELD_RESULT           "RESULT"
 #define FIELD_KERNEL           "KERNEL"
 #define FIELD_SUBSYSTEM                "SUBSYSTEM"
+#define FIELD_DRIVER           "DRIVER"
 #define FIELD_NAME             "NAME"
 #define FIELD_SYMLINK          "SYMLINK"
 #define FIELD_OWNER            "OWNER"
@@ -80,6 +82,7 @@ struct config_device {
        char program[PROGRAM_SIZE];
        char result[PROGRAM_SIZE];
        char subsystem[SUBSYSTEM_SIZE];
+       char driver[DRIVER_SIZE];
        char name[NAME_SIZE];
        char symlink[NAME_SIZE];
        struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS];
index cc02d255556fea76c052f1755f6cbb70a65fdce3..ccacceceb45ec07105348954821babfb9d094de6 100644 (file)
@@ -264,6 +264,12 @@ static int namedev_parse_rules(const char *filename, void *data)
                                continue;
                        }
 
+                       if (strcasecmp(temp2, FIELD_DRIVER) == 0) {
+                               strfieldcpy(dev.driver, temp3);
+                               valid = 1;
+                               continue;
+                       }
+
                        if (strcasecmp(temp2, FIELD_PROGRAM) == 0) {
                                program_given = 1;
                                strfieldcpy(dev.program, temp3);
index 5f6f864df2f137aff9cf6321dd53154e60b7b7bf..1e06df5220a7ae78c20601f1cd07b6c211533cb8 100644 (file)
@@ -1113,6 +1113,16 @@ EOF
 BUS="scsi", KERNEL="sda", NAME="should_not_match", SUBSYSTEM="vc"
 BUS="scsi", KERNEL="sda", NAME="node", SUBSYSTEM="block"
 BUS="scsi", KERNEL="sda", NAME="should_not_match2", SUBSYSTEM="vc"
+EOF
+       },
+       {
+               desc            => "DRIVER test",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "node",
+               conf            => <<EOF
+BUS="scsi", KERNEL="sda", NAME="should_not_match", DRIVER="sd-wrong"
+BUS="scsi", KERNEL="sda", NAME="node", DRIVER="sd"
 EOF
        },
 );
index 14a28d8dc2eb5daf77fddc606ebb10cc4058d80b..b5296b472d3c3421ebc2562c83830f4f84b0a0fa 100644 (file)
--- a/udev.8.in
+++ b/udev.8.in
@@ -172,8 +172,10 @@ Match the bus type of the device.
 Match the kernel device name.
 .TP
 .B SUBSYSTEM
-Match the kernel's subsystem name.
+Match the kernel subsystem name.
 .TP
+.B DRIVER
+Match the kernel driver name.
 .TP
 .B ID
 Match the device number on the bus, like PCI bus id.