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);
                /* 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;
 
 
 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"
 
 #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_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"
 #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 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];
        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;
                        }
 
                                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);
                        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"
 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
        },
 );
 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 device name.
 .TP
 .B SUBSYSTEM
-Match the kernel's subsystem name.
+Match the kernel subsystem name.
 .TP
 .TP
+.B DRIVER
+Match the kernel driver name.
 .TP
 .B ID
 Match the device number on the bus, like PCI bus id.
 .TP
 .B ID
 Match the device number on the bus, like PCI bus id.