diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-11-13 05:21:12 +0100 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 22:26:25 -0700 |
commit | 2092fbcdebf5313f29b43bdaa57a22baf0c0269f (patch) | |
tree | 81a534c099ab35af05f0faaad17ab76635be9717 | |
parent | 6818c51d7abeab9914eb7193968b1efa9459a853 (diff) |
[PATCH] support DRIVER as a rule key
Match with a rule against a device with a specific kernel driver.
-rw-r--r-- | namedev.c | 11 | ||||
-rw-r--r-- | namedev.h | 15 | ||||
-rw-r--r-- | namedev_parse.c | 6 | ||||
-rw-r--r-- | test/udev-test.pl | 10 | ||||
-rw-r--r-- | udev.8.in | 4 |
5 files changed, 39 insertions, 7 deletions
@@ -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); @@ -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 @@ -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. |