From d5f91372dd3241f8b4bbe2a99aaaeda541a76bad Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Thu, 4 Mar 2004 18:59:13 -0800 Subject: [PATCH] [PATCH] conditional remove of trailing sysfs whitespace Hey, it may never happen, that one wants to distinguish attributes by trailing spaces, but we should not lose the control over it, just for being lazy :) Here we remove the trailing spaces of the sysfs attribute only if the configured value to match doesn't have any trailing spaces by itself. So if you put a attribute in a rule with spaces at the end, the sysfs attribute _must_ match exactly. Is that cool for everyone? As usual, 2 tests are added for it with a artificial sysfs file and a few words to the man page. --- namedev.c | 14 ++++++++++++++ .../host0/0:0:0:0/whitespace_test | 1 + test/udev-test.pl | 19 +++++++++++++++++++ udev.8 | 3 +++ 4 files changed, 37 insertions(+) create mode 100644 test/sys/devices/pci0000:00/0000:00:1e.0/0000:02:05.0/host0/0:0:0:0/whitespace_test diff --git a/namedev.c b/namedev.c index 9182ed1fd..dfeadee18 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 000000000..e3d48f0fe --- /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 60cf16901..38ea0181f 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -465,6 +465,25 @@ EOF conf => < "ignore SYSFS attribute whitespace", + subsys => "block", + devpath => "block/sda", + expected => "ignored", + conf => < "do not ignore SYSFS attribute whitespace", + subsys => "block", + devpath => "block/sda", + expected => "matched-with-space", + conf => <