summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--namedev.c14
-rw-r--r--test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test1
-rw-r--r--test/udev-test.pl19
-rw-r--r--udev.83
4 files changed, 37 insertions, 0 deletions
diff --git a/namedev.c b/namedev.c
index 9182ed1fdc..dfeadee18a 100644
--- a/namedev.c
+++ b/namedev.c
@@ -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
diff --git a/udev.8 b/udev.8
index bc7308f484..76b8913f03 100644
--- a/udev.8
+++ b/udev.8
@@ -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.