From 2092fbcdebf5313f29b43bdaa57a22baf0c0269f Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Sat, 13 Nov 2004 05:21:12 +0100 Subject: [PATCH] [PATCH] support DRIVER as a rule key Match with a rule against a device with a specific kernel driver. --- namedev.c | 11 +++++++++++ namedev.h | 15 +++++++++------ namedev_parse.c | 6 ++++++ test/udev-test.pl | 10 ++++++++++ udev.8.in | 4 +++- 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/namedev.c b/namedev.c index 8bf3c0e7..c5c7929a 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 3837e864..7a98d66c 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 cc02d255..ccaccece 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 5f6f864d..1e06df52 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -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 => <