diff options
-rw-r--r-- | namedev.c | 14 | ||||
-rw-r--r-- | test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test | 1 | ||||
-rw-r--r-- | test/udev-test.pl | 19 | ||||
-rw-r--r-- | udev.8 | 3 |
4 files changed, 37 insertions, 0 deletions
@@ -525,6 +525,8 @@ attr_found: static int compare_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, struct sysfs_pair *pair) { struct sysfs_attribute *tmpattr; + int i; + int len; if ((pair == NULL) || (pair->file[0] == '\0') || (pair->value == '\0')) return -ENODEV; @@ -533,6 +535,18 @@ static int compare_sysfs_attribute(struct sysfs_class_device *class_dev, struct if (tmpattr == NULL) return -ENODEV; + /* strip trailing whitespace of value, if not asked to match for it */ + if (! isspace(pair->value[strlen(pair->value)-1])) { + i = len = strlen(tmpattr->value); + while (i > 0 && isspace(tmpattr->value[i-1])) + i--; + if (i < len) { + tmpattr->value[i] = '\0'; + dbg("remove %i trailing whitespace chars from '%s'", + len - i, tmpattr->value); + } + } + dbg("compare attribute '%s' value '%s' with '%s'", pair->file, tmpattr->value, pair->value); if (strcmp_pattern(pair->value, tmpattr->value) != 0) diff --git a/test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test b/test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test new file mode 100644 index 0000000000..e3d48f0fe0 --- /dev/null +++ b/test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test @@ -0,0 +1 @@ +WHITE SPACE diff --git a/test/udev-test.pl b/test/udev-test.pl index 60cf16901c..38ea0181f6 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -467,6 +467,25 @@ BUS="scsi", ID="*:0:0:0", NAME="scsi-0:0:0:0" BUS="scsi", ID="0:0:0:0", NAME="bad" EOF }, + { + desc => "ignore SYSFS attribute whitespace", + subsys => "block", + devpath => "block/sda", + expected => "ignored", + conf => <<EOF +BUS="scsi", SYSFS{whitespace_test}="WHITE SPACE", NAME="ignored" +EOF + }, + { + desc => "do not ignore SYSFS attribute whitespace", + subsys => "block", + devpath => "block/sda", + expected => "matched-with-space", + conf => <<EOF +BUS="scsi", SYSFS{whitespace_test}="WHITE SPACE ", NAME="wrong-to-ignore" +BUS="scsi", SYSFS{whitespace_test}="WHITE SPACE ", NAME="matched-with-space" +EOF + }, ); # set env @@ -178,6 +178,9 @@ Match the topological position on bus, like physical port of USB device Match sysfs device attribute like label, vendor, USB serial number, SCSI UUID or file system label. Up to 5 different sysfs files can be checked, with all of the values being required in order to match the rule. +.br +Trailing whitespace characters in the sysfs attribute value are ignored, if +the key doesn't have any trailing whitespace characters by itself. .TP .B PROGRAM Call external program. This key is valid if the program returns successful. |