summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--namedev.c11
-rw-r--r--namedev.h15
-rw-r--r--namedev_parse.c6
-rw-r--r--test/udev-test.pl10
-rw-r--r--udev.8.in4
5 files changed, 39 insertions, 7 deletions
diff --git a/namedev.c b/namedev.c
index 8bf3c0e73e..c5c7929ab2 100644
--- 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);
diff --git a/namedev.h b/namedev.h
index 3837e864a0..7a98d66c24 100644
--- a/namedev.h
+++ b/namedev.h
@@ -28,12 +28,13 @@
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];
diff --git a/namedev_parse.c b/namedev_parse.c
index cc02d25555..ccacceceb4 100644
--- a/namedev_parse.c
+++ b/namedev_parse.c
@@ -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);
diff --git a/test/udev-test.pl b/test/udev-test.pl
index 5f6f864df2..1e06df5220 100644
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1115,6 +1115,16 @@ 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
+ },
);
# set env
diff --git a/udev.8.in b/udev.8.in
index 14a28d8dc2..b5296b472d 100644
--- 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.